2010-05-03 36 views
2

我已經實現了一個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); 

現在,我已經有了多設幾個視口,每個都有自己的相機,並從每個攝像頭渲染其他攝像頭的位置(作爲一個簡單的盒子)。 我也想繪製這些相機的視圖矢量,除了我不知道如何從位置和歐拉角度計算lookat矢量。 我試圖用表示相機旋轉的矩陣乘以原始相機矢量(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(); 

我想從攝像機畫一條線段到查看方向。 我已經找遍了這個地方的例子,但似乎無法找到任何東西。

非常感謝!

+0

只是好奇,你是否在做任何處理萬向節鎖? – FrustratedWithFormsDesigner 2010-05-03 20:13:05

+0

不,我知道它在那裏,潛伏着;)我會在後期嘗試四元數,但我真的很想先弄清楚這一點。 – Jaap 2010-05-03 20:35:04

+0

旋轉相機時,實際上是在相反的方向旋轉整個世界。因此,當您將相同的變換應用於矢量而不是用相機移動相機時,可以在相反的方向旋轉它,嘗試旋轉用矩陣的逆矩陣來旋轉你的視圖.. – Ivan 2010-05-04 09:54:11

回答

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個單位的攝像機位置。