-
Notifications
You must be signed in to change notification settings - Fork 179
/
camera.cpp
127 lines (91 loc) · 3.13 KB
/
camera.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include "camera.h"
//-----------------------------------------------------------------------------
AwesomeCamera::AwesomeCamera(){
position = QVector3D(0,0,0);
direction = QVector3D(0,0,1);
side_direction = QVector3D(1,0,0);
updown_direction = QVector3D(0,1,0);
//------------------------------------
key_sens = 5.0f;
mouse_sens = 0.3f;
//------------------------------------
rot_angles[0] = rot_angles[1] = rot_angles[2] = 0;
rotM.setToIdentity(); // tworzymy macierz jednostkowa
rot_angles[0] = 0;
rot_angles[1] = 0;
isFree = true; // domyslnie kamera jest wolna
radius = 1.0;
}
AwesomeCamera::~AwesomeCamera(){
}
/**
*Odnawia pozycje kamery
*/
QMatrix4x4& AwesomeCamera::updateCamera(void){
QMatrix4x4 unit_mat;
unit_mat.setToIdentity();
if(isFree){
unit_mat.lookAt(position,
position+direction,
updown_direction
);
}else{
unit_mat.lookAt(position - (radius)*direction,
position - (radius)*direction + direction,
updown_direction
);
}
rotM = unit_mat;
return rotM;
}
QVector3D AwesomeCamera::get_position(){
if(isFree){
return position;
}else{
return position - (radius)*direction;
}
}
void AwesomeCamera::toggleFreeCamera(bool free){
isFree = free;
}
void AwesomeCamera::moveForward(float speed){
if(isFree)position+=direction*speed*key_sens;
}
void AwesomeCamera::moveBackward(float speed){
if(isFree)position-=direction*speed*key_sens;
}
void AwesomeCamera::moveLeft(float speed){
if(isFree)position+=side_direction*speed*key_sens;
}
void AwesomeCamera::moveRight(float speed){
if(isFree)position-=side_direction*speed*key_sens;
}
void AwesomeCamera::moveUp(float speed){
if(isFree)position+=updown_direction*speed*key_sens;
}
void AwesomeCamera::moveDown(float speed){
if(isFree)position-=updown_direction*speed*key_sens;
}
void AwesomeCamera::rotateView(float z_angle,float x_angle){
rotM.setToIdentity();
rot_angles[0] += mouse_sens*(z_angle);//przesuniecie X
rot_angles[1] -= mouse_sens*(x_angle);//przesuniecie Y
if(rot_angles[1] > 90) rot_angles[1] = 90;
if(rot_angles[1] <-90) rot_angles[1] = -90;
// przesuniecie do przodu
direction = QVector3D(-sin(rot_angles[0]/180*M_PI),sin(rot_angles[1]/180*M_PI),cos(rot_angles[0]/180*M_PI));
// przesuniece na boki
side_direction = QVector3D(sin((rot_angles[0]+90)/180*M_PI),0,-cos((rot_angles[0]+90)/180*M_PI));
// przesuwanie gora dol
updown_direction = QVector3D::crossProduct(direction,side_direction);
direction.normalize();
side_direction.normalize();
updown_direction.normalize();
}
void AwesomeCamera::mouseWheelMove(int direction){
radius+=mouse_sens*0.0025f*direction;
if(radius < 0.3) radius = 0.3;
}
void AwesomeCamera::setMouseSensitivity(int value){
mouse_sens = value / 100.0;
}