2016-02-28 154 views
0

我有一個繪製在(0,0,0)的對象,並且對象的方向是(0,0,1)。我試圖旋轉它以便與矢量對齊,比如vi =(vx,vy,vz)。OpenGL對象旋轉

我所做的是以下幾點:

v = (0, 0, 1); 
v_normal = (vnx, vny, vnz); 

跨產品,以獲得正常的向量:

v_normal = v.cross(vi); 

由於法線,我計算了角度

thetax = arccos(vnx/length(v_normal)) 
thetay = arccos(vny/length(v_normal)) 
thetaz = arccos(vnz/length(v_normal)) 

和然後我做旋轉:

glRotatedf(thetax, 1, 0, 0) 
glRotatedf(thetay, 0, 1, 0) 
glRotatedf(thetaz, 0, 0, 1). 

這樣做後,我有一些奇怪的。任何人都可以解釋如何在交叉產品之後獲得旋轉角度?謝謝!

+0

「*對象的方向是(0,0,1)*」這是什麼意思?另外,爲什麼你需要3個角度?爲什麼不只是角度/軸旋轉指向你想要指向的位置? –

+0

假設對象是一個箭頭,它指向(0,0,1)。我能想到的另一種方法是計算thetax = arctan(sqrt(y^2 + z^2)/ x)和thetay = arctan(z/y)。然後做glRotatedf(thetax,1,0,0)和glRotatedf(thetay,0,1,0)。我不知道這是否有效。請給一些幫助。非常感謝。 – user3204065

回答

0

每當您認爲需要旋轉一個基於三個軸向旋轉的物體時,就停止!找到解決問題的另一種方法。例如,你可以使用你的設備。你正確地開始:你得到了對象當前指向的位置和你希望它指向的位置之間的交叉乘積。該矢量是垂直於其他兩個矢量的矢量。這意味着......如果你想在兩個向量之間旋轉,那麼交叉產品就是來旋轉。

glRotatef(沒有glRotate**df**。它是fd,不是兩者)執行角度軸旋轉。你給它一個角度和軸旋轉。你剛剛計算出軸線;你只需要原始方向和所需方向之間的角度。

這也是微不足道的。根據cross-product的性質,叉積矢量的長度是兩個輸入矢量之間角度的正弦。所以角度是叉積的長度的倒數。

auto v_axis = v.cross(vi); 
auto angle = arcsin(length(v_axis)); 
glRotatef(angle, v_axis[0], v_axis[1], v_axis[2]); 

您執行一次循環而不是三次循環。

當然,您需要考慮vvi指向彼此的可能性。在這種情況下,十字產品將具有非常小的長度。如果叉積的長度非常小,則基本上需要選取一個與其中一個垂直的任意矢量,然後使用180度的角度。