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
|
#include "scene.h"
#include <SDL_opengl.h>
#include <cmath>
#define inrange(a, b, c) ((a) >= (b) && (a) <= (c))
void Scene::lookat() {
/* calculate cartesian coordinates for the center vector where yaw is Φ and pitch is θ
* x = cos Φ sin θ
* y = cos θ
* z = sin Φ sin θ
*/
Vector3 center(sinf(pitch) * cosf(yaw), cosf(pitch), sinf(pitch) * sinf(yaw));
center += pos;
center.y += 1;
//Vector3 up(cosf(yaw) * cosf(pitch), sinf(pitch), sinf(yaw) * cosf(pitch));
Vector3 up(-cosf(pitch) * cosf(yaw), sinf(pitch), -cosf(pitch) * sinf(yaw));
gluLookAt(pos.x, pos.y+1, pos.z,
center.x, center.y, center.z,
up.x, up.y, up.z);
}
void Scene::move(float forward, float right, int steps) {
Vector2 dir;
dir.x += forward*cosf(yaw);
dir.y += forward*sinf(yaw);
dir.x += right*cosf(yaw+M_PI_2);
dir.y += right*sinf(yaw+M_PI_2);
// ensure that the vector length is 1.0
dir /= dir.length();
dir *= 0.005;
dir *= steps;
float x = pos.x + dir.x;
//if(inrange(x, -2, 2))
pos.x = x;
float z = pos.z + dir.y;
//if(inrange(z, -2, 2))
pos.z = z;
//pos.x += dir.x;
//pos.z += dir.y;
}
|