-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcamera.c
More file actions
95 lines (84 loc) · 2.01 KB
/
Copy pathcamera.c
File metadata and controls
95 lines (84 loc) · 2.01 KB
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
#include "camera.h"
#include <stdio.h>
#define ANG2RAD 3.14159265358979323846 / 180.0
float dX = 0, dY = 0, dZ = 0, dAX = 0, dAY = 0, dAZ = 0, lookX = 0, lookY = 0, lookZ = 0;
bool gotta_go_fast = false;
void camera_new(Camera &camera, float x, float y, float z, float roll, float pitch, float yaw)
{
camera.x = x;
camera.y = y;
camera.z = z;
camera.yaw = yaw;
camera.pitch = pitch;
camera.roll = roll;
lookX = sin(camera.yaw);
lookY = camera.pitch;
lookZ = -cos(camera.yaw);
}
void camera_draw(Camera &camera, int delta)
{
float moveSpeed = 10.0f * (delta / 1000.0f);
float cameraSpeed = 1.0f * (delta / 1000.0f);
// reset values
if (camera.yaw > 360) camera.yaw -= 360;
if (camera.pitch > 360) camera.pitch -= 360;
// moving forward/backwards
if (dZ)
{
camera.x += (-dZ * lookX) * moveSpeed;
camera.z += (-dZ * lookZ) * moveSpeed;
}
// strafing
if (dX)
{
float _lx = -cos(camera.yaw);
float _lz = -sin(camera.yaw);
camera.x += (-dX * _lx) * moveSpeed;
camera.z += (-dX * _lz) * moveSpeed;
}
// moving up and down
if (dY)
{
camera.y += dY * moveSpeed;
}
// looking around
if (dAX)
{
camera.yaw += dAX * cameraSpeed;
lookX = sin(camera.yaw);
lookZ = -cos(camera.yaw);
}
// looking up/down
if (dAY)
{
lookY += dAY * cameraSpeed;
}
// set camera position
gluLookAt(
camera.x, camera.y, camera.z,
camera.x + lookX, camera.y + lookY, camera.z + lookZ,
0.0f, 1.0f, 0.0f
);
}
void camera_input(Camera &camera, int key, bool state)
{
switch (key)
{
case GLUT_KEY_LEFT: dAX = (state)?-1:0; break;
case GLUT_KEY_RIGHT: dAX = (state)? 1:0; break;
case GLUT_KEY_UP: dAY = (state)? 1:0; break;
case GLUT_KEY_DOWN: dAY = (state)?-1:0; break;
}
}
void camera_input(Camera &camera, unsigned char key, bool state)
{
switch (key)
{
case 'w': dZ = (state)?-1:0; break;
case 'a': dX = (state)?-1:0; break;
case 's': dZ = (state)? 1:0; break;
case 'd': dX = (state)? 1:0; break;
case 'q': dY = (state)?-1:0; break;
case 'e': dY = (state)? 1:0; break;
}
}