IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

 
 Ответить  Открыть новую тему 
> OpenGL. Движение.
ammaximus
сообщение 2.11.2009 3:16
Сообщение #1


Ночной волк
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской

Репутация: -  1  +


Я пытаюсь имитировать движение камеры внутри какой-либо комнаты. Управление такое стрелки вращают саму модель, 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();
}



--------------------
Не думай о белой обезьяне.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 2.11.2009 21:20
Сообщение #2


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


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

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


Можно поменять местами транслате и ротате.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 2.11.2009 23:19
Сообщение #3


Гость






Цитата
не знаю как сделать мышь.
Воспользоваться glutPassiveMotionFunc
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 20.07.2025 0:43
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"