2011-10-25 21 views
6

我一直在關注由朦朧心靈創建的XNA教程我有一個具有Position(Vector3)和Rotation(Quaternion)的基礎對象。對象模型看起來像這樣 Class Diagram旋轉塊的6邊

從本教程中的攝像頭實現,我所做的旋轉的副本,並旋轉方法並實現他們的目標

public virtual void Rotate(Vector3 axis, float angle) 
{ 
    axis = Vector3.Transform(axis, Matrix.CreateFromQuaternion(Rotation)); 
    Rotation = Quaternion.Normalize(Quaternion.CreateFromAxisAngle(axis, angle) * Rotation); 
} 

public virtual void Revolve(Vector3 target, Vector3 axis, float angle) 
{ 
    Vector3 revolveAxis = Vector3.Transform(axis, Matrix.CreateFromQuaternion(Rotation)); 

    Quaternion rotate = Quaternion.Normalize(Quaternion.CreateFromAxisAngle(revolveAxis, angle)); 

    Position = Vector3.Transform(Position - target, Matrix.CreateFromQuaternion(rotate)) + target; 

    Rotate(axis, angle); 
} 

我的阻止對象創建6四實例,並調用render方法各四對象上,我分配在每四的偏移和旋轉而形成織構塊看起來像這樣: Block rendered by 6 Quad objects

而現在我們有實際的問題,呼籲旋轉在我​​的座OBJ ect導致對象本身改變旋轉,並且我的Quad對象不旋轉,因此我在Block對象上實現了一個新的旋轉函數。

public override void Rotate(Vector3 axis, float angle) 
{ 
    for (int i = 0; i < mySides.Length; i++) 
    { 
     Quad side = mySides[i]; 
     side.Revolve(this.Position, axis, angle); 
    } 
} 

然而,這並沒有給我的預期結果如下所示:

Block object rotated

錯誤的解決

下面的解決方案工作,但不會是非常通用的,將受到限制: 一堆if語句,用於檢查我想要旋轉的軸,然後以正確的方式旋轉每個邊(Quad對象)。

的妥善解決

我也可以做四的渲染對象取決於塊對象(其父)的旋轉,但我對如何做到這一點不確定。

第三個也是最後一個選項是讓Rotate方法將每個Quad對象的旋轉和位置更新爲正確的值,但我不確定如何操作。

問題

所以我要問的是這方面的一些意見或想法,也許一些鏈接和/或教程解釋如何在XNA使用四元數,優選以可視化的方式。

歡呼聲中,期待您的輸入:)

回答

2

你應該做的,而你提到這,使四核的渲染對象依賴於父的旋轉。

這對於像您這樣的hierachal系統來說相當容易。當渲染器渲染塊時,它應該將塊的變換存儲在矩陣中,我們稱之爲BlockWorld。當你去渲染每個Quad時,將Quad的局部變換乘以BlockWorld