2013-03-12 106 views
1

使用四元數,如果我沿着一個軸將我的立方體旋轉90度,我會得到一個不同的正面立方體側,它顯示爲純色的直線正方形。我的立方體有不同顏色的邊,所以改變它的旋轉軸可以給我這些不同的顏色。爲什麼我的魔方變形?

當我嘗試任意量旋轉,我得到相當壯觀的亂七八糟的,我不知道爲什麼,因爲我期望的四元數過程中很好地工作,無論角度:

enter image description here

我從使用該2個向量創建四元數:

inline QuaternionT<T> QuaternionT<T>::CreateFromVectors(const Vector3<T>& v0, const Vector3<T>& v1) 
{ 
if (v0 == -v1) 
    return QuaternionT<T>::CreateFromAxisAngle(vec3(1, 0, 0), Pi); 

Vector3<T> c = v0.Cross(v1); 
T d = v0.Dot(v1); 
T s = std::sqrt((1 + d) * 2); 

QuaternionT<T> q; 
q.x = c.x/s; 
q.y = c.y/s; 
q.z = c.z/s; 
q.w = s/2.0f; 
return q; 
} 

我認爲上述方法是精細,因爲我已經正確地使用它看到大量的樣本代碼。

利用上述方法,我這樣做:

Quaternion quat1=Quaternion::CreateFromVectors(vec3(0,1,0), vec3(0,0,1)); 

它的工作原理,它是一個90度的旋轉。

但假設我想要更像45度旋轉?

Quaternion quat1=Quaternion::CreateFromVectors(vec3(0,1,0), vec3(0,1,1)); 

這給了我上面的混亂。我也試過正常化quat1,它提供了不同的,但同樣扭曲的結果。

我現在用的是四元數作爲模型變換旋轉矩陣,使用此:

inline Matrix3<T> QuaternionT<T>::ToMatrix() const 
{ 
const T s = 2; 
T xs, ys, zs; 
T wx, wy, wz; 
T xx, xy, xz; 
T yy, yz, zz; 
xs = x * s; ys = y * s; zs = z * s; 
wx = w * xs; wy = w * ys; wz = w * zs; 
xx = x * xs; xy = x * ys; xz = x * zs; 
yy = y * ys; yz = y * zs; zz = z * zs; 
Matrix3<T> m; 
m.x.x = 1 - (yy + zz); m.y.x = xy - wz; m.z.x = xz + wy; 
m.x.y = xy + wz; m.y.y = 1 - (xx + zz); m.z.y = yz - wx; 
m.x.z = xz - wy; m.y.z = yz + wx; m.z.z = 1 - (xx + yy); 
return m; 
} 

任何想法是怎麼回事?

+0

我想你的深度測試存在某種問題。它可能支付檢查它! – SIGKILL 2013-03-12 07:34:53

+0

不相關,我不認爲,但我不明白'if(v0 == -v1)'子句應該如何工作。如果我想將(1,0,0)旋轉到(-1,0,0),那麼圍繞(1,0,0)的旋轉如何產生正確的方向?對於這個問題,對於任何不垂直於任意(1,0,0)軸的矢量如何工作? – JasonD 2013-03-12 09:58:08

+0

@JasonD很好的問題。這不是我的矢量庫,而是一個被廣泛使用的矢量庫。 – johnbakers 2013-03-12 11:26:02

回答

0

你的平截頭體是什麼樣的?如果您有一個畸變的「鏡頭」,例如特別廣角的視場,那麼實際顯示深度的角度(例如任意旋轉)可能看起來不像您期望的那樣。 (就像照相機上的魚眼鏡頭如何讓視角看起來不切實際)。

如果您想看到逼真的圖像,請確保您使用的是真實的平截頭體。

相關問題