我正在嘗試使用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);
}
我明白你在說什麼。我將所有「anglex」和「angley」變量分別改爲「radx」和「rady」。我仍然很快旋轉魔方。 – soplu
@soplu:你的'up_y'和'up_x'仍然被計算爲角度。 – sheu
我錯過了,但現在它已修復。但是,當我打電話給gluLookAT時,我不會使用up_y或up_x。 – soplu