// Main.cpp
float pitch = 0, roll = 0, heading = 0;
float posX = 0, posY = 0, posZ = 0;
Camera camera;
void controls(){
float turnRate = 0.001;
// pitch
if(keys['w']){
pitch += 0.01;
if(pitch > 360){
pitch = 0;
}
}
if(keys['s']){
pitch -= 0.01;
if(pitch < 0){
pitch = 360;
}
}
//heading
if(keys['a']){
heading += 0.01;
if(heading > 360){
heading = 0;
}
float yrotrad = (heading / 180 * 3.141592);
camera.pos.x += cos(yrotrad) * turnRate; // turn camera aswell
camera.pos.z -= sin(yrotrad) * turnRate;
}
if(keys['d']){
heading 0= 0.01;
if(heading < 0){
heading = 360;
}
float yrotrad = (heading / 180 * 3.141592);
camera.pos.x -= cos(yrotrad) * turnRate; // turn camera aswell
camera.pos.z += sin(yrotrad) * turnRate;
}
//roll
if(keys['q']){
roll += 0.01;
if(roll > 360){
roll = 0;
}
}
if(keys['e']){
roll -= 0.01;
if(roll < 0){
roll = 360;
}
}
// move forward
if(keys['c']){
float yrotrad = (-heading / 180 * 3.141592);
float xrotrad = (-pitch / 180 * 3.141592);
posX += sin(yrotrad) * rate;
posZ -= cos(yrotrad) * rate;
posY -= sin(xrotrad) * rate;
camera.pos.x += sin(yrotrad) * rate; // seems to be fine
camera.pos.z -= cos(yrotrad) * rate;
}
void drawCube(){
glPushMatrix();
glTranslatef(posX, posY, posZ);
glRotatef(heading, 0.0, 1.0, 0.0);
glRotatef(pitch, 1.0, 0.0, 0.0);
glutSolidCube(1);
glPopMatrix();
}
void display(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
controls();
glLoadIdentity();
gluLookAt(camera.getPos().x, camera.getPos().y, camera.getPos().z,
posX, posY, posZ,
camera.getUp().x, camera.getUp().y, camera.getUp().z);
glPushMatrix();
glTranslatef(camera.getLook().x, 0, camera.getLook().z);
drawCube();
glPopMatrix();
// draw grid
drawGrid();
glutSwapBuffers();
}
void idle();
glutPostRedisplay();
}
// keyboard/special keyboard functions
// main