Помощь - Поиск - Пользователи - Календарь
Полная версия: OpenGL. Движение.
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
ammaximus
Я пытаюсь имитировать движение камеры внутри какой-либо комнаты. Управление такое стрелки вращают саму модель, 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();
}

TarasBer
Цитата(ammaximus @ 2.11.2009 3:16) *

2 Движение wasd не в той плоскости и зависимо от предыдущего rotation


Можно поменять местами транслате и ротате.
volvo
Цитата
не знаю как сделать мышь.
Воспользоваться glutPassiveMotionFunc
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.