从位置和欧拉角计算外观矢量

时间:2010-05-03 20:09:31

标签: opengl camera frame-rate

我已经实现了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 个答案:

答案 0 :(得分:4)

我只是想通了。当我回去添加答案时,我看到伊万刚刚告诉我同样的事情:)

基本上,为了绘制相机矢量,我这样做:

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个单位。