2014-04-04 76 views
2

我使用Opengl作爲小型車模擬的基礎。根據3D物體的位置旋轉相機

我已經導入了一輛模型車,它開車很好,相機跟着它。不幸的是,當汽車轉向時,我似乎無法讓相機的位置移動(或留在汽車後面)。它只是在現場旋轉。

例如,如果汽車左轉,攝像頭就會跟着它旋轉,但不會直接移動到汽車後面。

我已經看過這些問題herehere,但仍似乎無法使其工作。

我這是怎麼計算汽車的位置(這只是驅動在XZ平面現在):

velocity.x = sin(rotX_rad); 
    velocity.z = cos(rotX_rad); 

    globalPos.x + velocity.x*delta; 
    globalPos.z + velocity.z*delta; 

    glTranslatef(globalPos.x,globalPos.y,globalPos.z); 
    glRotatef(rotX, 0.0, 1.0, 0.0); 

這是目前我如何有我的lookAt功能:

gluLookAt(camX+globalPos.x, 
       camY+globalPos.y, 
       camZ+globalPos.z, 
       lookX+globalPos.x+sin(rotX_rad), 
       lookY+globalPos.y+cos(rotX_rad), 
       lookZ+globalPos.z-cos(rotX_rad), 
       camNX, camNY, camNZ); 

我希望攝像機是這樣的:(其中Y是Z)

enter image description here

我看到它的方式,它應該是:

camX + globalPos.x+ sin(rotX_rad)*(distFromCar), 
    camY, 
    camZ + globalPos.z- cos(rotX_rad)*(distFromCar), 

但奇怪的行爲....

什麼我不這樣做?

+0

+1的圖片:) – SAKrisT

回答

1

給這個一杆,這是有道理的,我的頭,但它可能不會在現實:)

好了,我們可以代表你的車的位置和速度爲2元向量(在位置的情況下,是一個點,在速度的情況下,它是一個真正的矢量)

現在我們有了,爲了計算相機的位置,我們可以只取速度矢量的負數(這意味着只需使所有矢量的元素爲負,產生一個幅度相同但方向完全相反的矢量),並將該矢量添加到您的汽車的位置。例如,假設你的車在位置(1,1),而你的速度矢量是(1,2)。負速度矢量爲(-1,-2),相機的位置爲(1,1)+(-1,-2)爲(0,-1)。您可能需要對負向速度矢量進行歸一化處理,以使相機與汽車的距離保持恆定,否則您可以越快越遠相機就會變得越快:)

既然您擁有相機的位置,只需調用gluLookAt :

gluLookAt(camPos.x,camPos.y,camPos.z,carPos.x,carPos.y,carPos.z,0,1,0); 

正如你所看到的,我們傳遞攝像機的位置(我們剛剛在上一步中計算),並告訴攝像機看車。你可能想調整一些數值(例如,讓攝像機漂浮在地面上幾個單位,而不是直接放在車後面,或者讓攝像機看一下車的幾個單位,等等)。

讓我知道這是怎麼回事!再次,這只是我認爲可能爲你工作,不保證我的數學是正確的,但:)但這應該是更快,更容易理解比亂搞角度等。有一件事要記住:如果汽車完全靜止(沒有速度矢量),這將不起作用

+0

太棒了。我否定了載體,它的工作完美。這顯然是不正確的,正面的價值觀。感謝發佈。 – Reanimation