如何在三維空間中實現模型繞著中心點旋轉?這個問題聽起來容易,但是經過我的實踐,發現其實還是挺困難的。在研究opengl和directx的初級階段,我相信這個問題還是挺傷大家的腦筋的。究竟該如何實現這樣的功能呢?我想大家可能需要回過頭,複習一下我們高中的知識,通過平面解析幾何的模擬,大家會找到好方法的。
這裡要追溯到我們高中所學的向量和平面解析幾何的知識。話說向量a是乙個普通的向量,向量b是a相對於中心順時針旋轉α角形成的。已知向量a和b,求α。
這裡我們可以利用向量的點陣公式,a·b= |a||b|cosα,算出α= arccos(a·b/|a||b| )。在解析幾何中,設a(xa, ya),b(xb, yb),那麼a·b= xa xb+ ya yb。|
a
||b
|=√(xa
2+ya2
)·√(x
b2+yb
2),這樣求解起來就容易了。
現在思路換到三維空間。同理,a·b滿足廣義的笛卡爾內積形式,這樣的話,同樣地可以通過上述的公式求出兩個三維向量之間的夾角。
設a (xa, ya,za),b (xb, yb,zb),那麼a·b = xa xb+ ya yb+ za zb。|a||b|=√(xa2+ya2+za2)·√(xb2+ yb2+zb2),這按照方法求出α。
這樣做對向量的旋轉有著很大的作用。如果乙個圓錐,它的預設的位置是這樣的(如下圖),那麼可以取它的向上的向量up(0,1,0),想讓它的開口朝向黃色的線direction(1,1,-1),藍色的線和黃色的線之間的角度為α,那麼我們可以這樣運算(本例使用qt實現)。
// 計算出旋轉軸和旋轉角度
float angleinradians = pi - acos( qvector3d::dotproduct( up, direction ) /
direction.length( ) / up.length( ) );
const qvector3d& axis = qvector3d::crossproduct( up, direction );
glpushmatrix( );
gltranslatef( pos.x( ), pos.y( ), pos.z( ) );
glrotatef( angleinradians * 180 / pi,
axis.x( ), axis.y( ), axis.z( ) );
這裡,axis是旋轉的軸向量,因為向量up和direction相交於一點(模型的幾何中心),那麼它們唯一確定乙個平面,這個平面的法向量就是up×direction,所以要使up向量旋轉到-direction向量上(之所以是-direction是因為要求開口朝上而不是尖尖朝上),就要以axis為軸進行旋轉。下面就是執行結果。
這裡這裡
向量運算(點積,叉積)
向量加減法 兩向量a與b的和為乙個向量,記為c,即 c a b c與兩向量a與b的關係遵循平行四邊形法則。設二維向量 p x1,y1 q x2 y2 則向量的加法定義為 p q x1 x2,y1 y2 同理,向量減法為 p q x1 x2,y1 y2 顯然有性質 p q q p p q q p 向量...
向量的點積和叉積
點乘 也叫向量的內積 數量積.顧名思義,求下來的結果是乙個數.向量a 向量b a b cos 在物理學中,已知力與位移求功,實際上就是求向量f與向量s的內積,即要用點乘.叉乘 也叫向量的外積 向量積.顧名思義,求下來的結果是乙個向量,記這個向量為c.向量c 向量a 向量b a b sin 向量c的方...
向量的點積和叉積
一 向量數量積用於計算向量夾角 中學階段學空間幾何時,知道用兩個向量a,b之間的數量積來計算向量之間的夾角。這是因為三角形的餘弦定理 abc中角a b c對應的邊分別為a b c 則有cosa b c a 2bc cosb a c b 2ac cosc a b c 2ab 基於此餘弦定理 我們進一步...