Рассчитать вектор подстановки из положения и углов Эйлера - PullRequest
2 голосов
/ 04 мая 2010

Я реализовал камеру в стиле FPS, с камерой, состоящей из вектора положения и углов Эйлера, тангажа и рыскания (повороты x и y). После настройки матрицы проецирования я затем переворачиваю координаты камеры, поворачивая ее, затем переводя в положение, обратное положению камеры:

// Load projection matrix
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

// Set perspective
gluPerspective(m_fFOV, m_fWidth/m_fHeight, m_fNear, m_fFar);

// Load modelview matrix
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

// Position camera
glRotatef(m_fRotateX, 1.0, 0.0, 0.0); 
glRotatef(m_fRotateY, 0.0, 1.0, 0.0); 
glTranslatef(-m_vPosition.x, -m_vPosition.y, -m_vPosition.z);

Теперь у меня настроено несколько окон просмотра, каждый со своей камерой, и с каждой камеры я отображаю положение других камер (в виде простой рамки). Я хотел бы также нарисовать вектор обзора для этих камер, за исключением того, что я не знаю, как рассчитать вектор обзора по положению и углам Эйлера. Я попытался умножить исходный вектор камеры (0, 0, -1) на матрицу, представляющую вращения камеры затем добавление положения камеры к преобразованному вектору, но это совсем не работает (скорее всего, потому что я далеко от базы):

vector v1(0, 0, -1);
matrix m1 = matrix::IDENTITY;
m1.rotate(m_fRotateX, 0, 0);
m1.rotate(0, m_fRotateY, 0);

vector v2 = v1 * m1;
v2 = v2 + m_vPosition; // add camera position vector

glBegin(GL_LINES);
glVertex3fv(m_vPosition);
glVertex3fv(v2);
glEnd();

То, что я хотел бы, это нарисовать отрезок линии от камеры к направлению взгляда. Я искал повсюду примеры этого, но, похоже, ничего не могу найти.

Большое спасибо!

1 Ответ

4 голосов
/ 04 мая 2010

Я только что понял это. Когда я вернулся, чтобы добавить ответ, я увидел, что Иван только что сказал мне то же самое:)

В принципе, чтобы нарисовать вектор камеры, я делаю это:

glPushMatrix();

// Apply inverse camera transform
glTranslatef(m_vPosition.x, m_vPosition.y, m_vPosition.z);
glRotatef(-m_fRotateY, 0.0, 1.0, 0.0); 
glRotatef(-m_fRotateX, 1.0, 0.0, 0.0); 

// Then draw the vector representing the camera
glBegin(GL_LINES);
glVertex3f(0, 0, 0);
glVertex3f(0, 0, -10);
glEnd();

glPopMatrix();

Рисует линию от положения камеры на 10 единиц в направлении взгляда.

...