2013-02-02 56 views
1

我正在嘗試使用gluLookAt圍繞以原點爲中心的立方體移動,而不是直接在對象上執行R * T轉換。起初,我不知道如何解決這個問題。然後我意識到(在實現圓形座標的一半解決方案後)我應該嘗試使用球座標系表示。我能夠編寫一些代碼來做到這一點,但我(相機的'眼睛')在立方體周圍快速旋轉。另外,我注意到我正在向一個靠近立方體的方向移動,而不是保持一個恆定的半徑。當我使用Rotate * Translate方法時,它會以相同的距離以更適當的速度旋轉。OpenGL - 使用gluLookAt圍繞立方體旋轉非常快

我的旋轉方法是使用球座標,但我不確定這是否正確。根據位於the Wikipedia page上的圖,我計算了兩個角度。我計算當前點的大小(distX,distY,distZ)。我們最初在XY平面上看着負Z平面)。我還給出了兩個角度,一個用於指定圍繞x軸的旋轉角度,另一個用於指定y軸的旋轉角度。這五個值是根據我的鼠標點擊次數來計算的。

我根據某個trig計算theta和phi,最後計算出新的位置。這些公式可以在之前的鏈接中找到。最後一步是將其插入gluLookAt。同樣,在運行這個程序時,我可以繞着立方體旋轉,但速度非常快,也可以翻轉相機。我究竟做錯了什麼?

我的代碼列在下面的情況下,你想引用它。引用'y'和'up'的部分是我計算圍繞Z軸的旋轉的嘗試。我可以用最好的方式來描述這種旋轉,即如果你看着一個物體,想象自己的相機,並左右傾斜你的頭部。我沒有將它包含在我對gluLookAt的調用中,因爲我無法讓它工作。

編輯︰它現在旋轉看起來是正確的速度,但它不會完全旋轉。我的意思是,在旋轉時,「眼睛」以一定角度向立方體移動,但隨後將旋轉回去,消除旋轉。但是這個循環會讓眼睛看起來像一個彎曲的無限符號。

void sceneTransformation(){ 
glLoadIdentity(); 
    //Using the R*T approach. Works flawlessly 
//glTranslatef(-distX, distY, -distZ); 
//glRotatef(anglex, 1.0, 0.0, 0.0); 
//glRotatef(angley, 0.0, 1.0, 0.0); 

GLdouble radx = anglex*PI/180.; 
GLdouble rady = angley*PI/180.; 

GLdouble l = sqrt(pow(distX, 2) + pow(distY, 2) + pow(distZ, 2)); 
GLdouble phi = atan(distY/distZ) + radx; 
GLdouble theta = acos(distZ/l) + radx; 


GLdouble deltaZ = l*sin(theta)*cos(phi); 
GLdouble deltaY = l*sin(theta)*sin(phi); 
GLdouble deltaX = l*cos(theta); 


GLdouble ytheta = atan(distX/distY); 
GLdouble y = sqrt(pow(distX,2) + pow(distY, 2)); 
GLdouble yangle = PI/2.-ytheta-rady; 

GLdouble up_y = y*sin(yangle); 
GLdouble up_x = y*cos(yangle); 

gluLookAt((distX - deltaX), (distY - deltaY), (distZ - deltaZ), 0, 0, 0, 0,1,0); 
} 

回答

2

數學功能,如sin()cos(),和朋友們期待的弧度,不度輸入。看起來你正在度假,所以你比預期快了大約57.3倍(正好:360 /(2 * pi))。

+0

我明白你在說什麼。我將所有「anglex」和「angley」變量分別改爲「radx」和「rady」。我仍然很快旋轉魔方。 – soplu

+0

@soplu:你的'up_y'和'up_x'仍然被計算爲角度。 – sheu

+0

我錯過了,但現在它已修復。但是,當我打電話給gluLookAT時,我不會使用up_y或up_x。 – soplu

0

您需要使您的運動基於時間,這意味着將旋轉角度與開始的最後一幀和當前幀之間的增量相乘。

angle += 90 * timeDelta; // Rotate by 90 degree each second