diff options
Diffstat (limited to 'scene.cpp')
-rw-r--r-- | scene.cpp | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/scene.cpp b/scene.cpp new file mode 100644 index 0000000..47b76bf --- /dev/null +++ b/scene.cpp @@ -0,0 +1,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; +} |