Я пытаюсь имитировать движение камеры внутри какой-либо комнаты. Управление такое стрелки вращают саму модель, wasd движение в плоскости oxz, мышь - вращение камеры.
1. не знаю как сделать мышь.
2 Движение wasd не в той плоскости и зависимо от предыдущего rotation
#include <GL/glut.h> #include <windows.h> #include <math.h> GLfloat lrmove = 0; GLfloat udmove = 0; ///////////////////// // START PARAMETRS // ///////////////////// struct a{ float x; float y; float z; } m_CameraPosition; struct b{ float x; float y; float z; } m_CameraRotation; float incr = 0.0f; float upcr = 0.0f; float max_speed = 1.0f; float power = 0.01f; float inertion = 0.005f; POINT MouseCoord; float pi = 3.1415; float MoveSpeed=0.01; // DRAWING PIRAMYD // void piramyd(){ glBegin(GL_TRIANGLES); glColor3f(1.0f,0.0f,0.0f); glVertex3f( 0.0f, 1.0f, 0.0f); glColor3f(1.0f,1.0f,0.0f); glVertex3f(-1.0f,-1.0f, 1.0f); glColor3f(0.0f,0.0f,1.0f); glVertex3f( 1.0f,-1.0f, 1.0f); glColor3f(1.0f,0.0f,0.0f); glVertex3f( 0.0f, 1.0f, 0.0f); glColor3f(0.0f,0.0f,1.0f); glVertex3f( 1.0f,-1.0f, 1.0f); glColor3f(0.0f,1.0f,0.0f); glVertex3f( 1.0f,-1.0f, -1.0f); glColor3f(1.0f,0.0f,0.0f); glVertex3f( 0.0f, 1.0f, 0.0f); glColor3f(0.0f,1.0f,0.0f); glVertex3f( 1.0f,-1.0f, -1.0f); glColor3f(0.8f,0.4f,0.5f); glVertex3f(-1.0f,-1.0f, -1.0f); glColor3f(1.0f,0.0f,0.0f); glVertex3f( 0.0f, 1.0f, 0.0f); glColor3f(0.8f,0.4f,0.5f); glVertex3f(-1.0f,-1.0f,-1.0f); glColor3f(1.0f,1.0f,0.0f); glVertex3f(-1.0f,-1.0f, 1.0f); glEnd(); } // DISPLAY // void display() { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glPushMatrix(); glTranslatef(-m_CameraPosition.x,-m_CameraPosition.y,-m_CameraPosition.z); glRotatef(lrmove,0.0f,1.0f,0.0f); glRotatef(udmove,1.0f,0.0f,0.0f); m_CameraRotation.x=lrmove; m_CameraRotation.y=udmove; glShadeModel(GL_SMOOTH); piramyd(); glPopMatrix(); glutSwapBuffers(); glutPostRedisplay(); /* Çàñòàâëÿåì ñöåíó ïåðåðèñîâàòüñÿ */ } void idle(){ if (!GetAsyncKeyState(VK_RIGHT)==1){ if (incr>0) incr -= inertion; } else{ if (incr < max_speed) incr += power; } if (!GetAsyncKeyState(VK_LEFT)==1){ if (incr<0) incr += inertion; } else{ if (incr > -max_speed) incr -= power; } lrmove += incr; if (!GetAsyncKeyState(VK_UP)==1){ if (upcr>0) upcr -= inertion; } else{ if (upcr <max_speed ) upcr += power; } if (!GetAsyncKeyState(VK_DOWN)==1){ if (upcr<0) upcr += inertion; } else{ if (upcr > -max_speed) upcr -= power; } udmove += upcr; if ((GetAsyncKeyState('W') & 0x8000)!=0){ m_CameraPosition.x = m_CameraPosition.x - sin(m_CameraRotation.x*pi/180)*MoveSpeed*(-1); m_CameraPosition.y = m_CameraPosition.y - cos(m_CameraRotation.x*pi/180)*MoveSpeed*(-1); m_CameraPosition.z = m_CameraPosition.z - sin((m_CameraRotation.y-90)*pi/180)*MoveSpeed*(-1); }; if ((GetAsyncKeyState('S') & 0x8000)!=0){ m_CameraPosition.x = m_CameraPosition.x - sin(m_CameraRotation.x*pi/180)*MoveSpeed*(1); m_CameraPosition.y = m_CameraPosition.y - cos(m_CameraRotation.x*pi/180)*MoveSpeed*(1); m_CameraPosition.z = m_CameraPosition.z - sin((m_CameraRotation.y-90)*pi/180)*MoveSpeed*(1); }; if ((GetAsyncKeyState('A') & 0x8000)!=0){ m_CameraPosition.x = m_CameraPosition.x - sin((m_CameraRotation.x-90)*pi/180)*MoveSpeed*(-1); m_CameraPosition.y = m_CameraPosition.y - cos((m_CameraRotation.x-90)*pi/180)*MoveSpeed*(-1); }; if ((GetAsyncKeyState('D') & 0x8000)!=0){ m_CameraPosition.x = m_CameraPosition.x - sin((m_CameraRotation.x-90)*pi/180)*MoveSpeed*(1); m_CameraPosition.y = m_CameraPosition.y - cos((m_CameraRotation.x-90)*pi/180)*MoveSpeed*(1); }; } void keyboard(unsigned char key, int x, int y){ } void main(int argc, char** argv){ glutInit(&argc, argv); glutInitWindowSize(800, 600); glutInitWindowPosition(0, 0); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); glutCreateWindow("Presentation"); mode = 1; glClearColor(0, 0, 0, 0); glOrtho(-5,5,-5,5,-5,5); glEnable(GL_DEPTH_TEST); glutDisplayFunc(display); glutKeyboardFunc(keyboard); glutIdleFunc(idle); glutMainLoop(); }
Не думай о белой обезьяне.