2012-01-05 74 views
0

我是新手在XNA,所以很抱歉的簡單的問題,但我找不到任何解決方案。XNA在給定的矢量旋轉

我有簡單的模型(類似於扁平長方體),我不能改變(模型本身)。我想創建旋轉動畫。在這個特殊的問題上,我的模型只是鋼琴的封面。然而,我要旋轉的軸被覆蓋的中位數所覆蓋。因此,我的模型像渦輪機一樣旋轉,而不是打開和關閉。

我想通過給定的「行」旋轉我的對象。我發現了Matrix.CreateLookAt(currentPosition, dstPosition, Vector.Up);方法,但仍不知道如何將旋轉與這種矩陣結合起來。

+0

要組合矩陣,使用* = – annonymously 2012-01-05 21:41:35

回答

2

Matrix.CreateLookAt是用於相機,而不是操縱模型(儘管我相信一些聰明的人明白它創建的矩陣是如何做的)。

你想要做的是圍繞空間中的任意軸旋轉你的模型。這不是一個動畫(這些動畫是用3D建模軟件創建的,而不是遊戲),這是一個轉變。轉換是可以移動,旋轉和縮放模型的方法,顯然是3D遊戲圖形的關鍵。

對於你的問題,你想旋轉這個平坦的部分圍繞它的邊緣,是嗎?爲此,您將結合平移和軸旋轉。

首先,您要移動模型,以便您想旋轉的邊與原點相交。所以,如果邊緣在Z方向上是直線,那麼它將與Z軸完美對齊並相交0,0,0。要做到這一點,你需要知道你的模型的尺寸。一旦你擁有了這些,創建一個矩陣:(這是假設一個正方形模式操作的Vector3,直到你想要的邊緣交叉的原點)

Matrix originTranslation = Matrix.CreateTranslation(new Vector3(-modelWidth/2f, 0, 0)) 

現在,我們要做的旋轉。這取決於你的邊緣的角度。如果你的模型是一個正方形,因此邊緣在Z方向上直線前進,我們可以圍繞Vector3.Forward旋轉。然而,如果你的邊緣是傾斜的(就像我想象一個鋼琴蓋一樣),你將不得不自己確定角度並創建一個具有相同角度的單位矢量。現在,將創建另一個矩陣:

Matrix axisRotation = Matrix.CreateFromAxisAngle(myAxis, rotation) 

其中myAxis是代表邊緣的角度的單位矢量,和旋轉爲弧度旋轉的數目的浮子。

最後一點是你的'動畫'的關鍵。你想要做的是改變浮法數量,這取決於多長時間來創建隨着時間的推移打開鋼琴蓋的「動畫」。當然,你會想要將它固定在一個較高的值,或者你的封面將保持旋轉。

現在,爲了實際轉換您的覆蓋模型,您必須將它的世界矩陣乘以上述兩個矩陣,按順序排列。

pianoCover.World *= originTranslation * axisRotation; 

然後如果你願意,你可以蓋翻譯回,而其中心位於原點(通過變換矩陣與的Vector3乘以值負你先過他們),並且隨後翻譯你使用另一個變換矩陣覆蓋到需要在空間中的任何位置。

因此,請注意3D遊戲中如何使用矩陣。使用適當的矩陣方法創建矩陣,以創建您所需的特性(平移,旋轉和軸,比例等)。您爲這些屬性中的每個屬性創建一個矩陣。然後,按照特定順序將它們相乘(矩陣乘法中的順序),以便根據需要轉換模型。通常,如這裏看到的,這些轉換是中間的以獲得期望的效果(我們不能簡單地將覆蓋物移動到我們想要的位置,然後圍繞其邊緣旋轉它;我們必須將邊緣移動到原點,旋轉,移動它回來等)。

在3D中使用矩陣非常困難。事實上,我可能沒有完全正確(我希望現在我已經知道了,但是......)。你越練習越好,你可以判斷如何執行這樣的任務。我會推薦閱讀關於這個主題的教程。涵蓋XNA中的3D的任何教程都會有這個主題。最後,如果您足夠了解3D建模軟件,我可能會建議您製作鋼琴的實際動畫,並在您的遊戲中打開和關閉並使用該動畫模型,而不是使用模型鋼琴和蓋子,並試圖讓他們在一起。