2011-07-29 45 views
5

我正在製作一款3D汽車遊戲,並且存在旋轉問題。 我想圍繞自己旋轉模型,但是當我移動時,它開始在全世界移動 !如何圍繞其中心旋轉3D模型?

現在的問題是:如何讓模型的中心移動?

我試圖改變這樣的代碼:

effect.World = Matrix.CreateRotationZ(modelRotation) * effect.World = Matrix.CreateTranslation(position); 

現在不是前進相對於模型,它定位在一組方向移動! &這是我的代碼:

​​
+0

我建議你堅持每個語句單一賦值操作符。如果你不這樣做,結果可能會令人困惑,令人驚訝和難以閱讀。 –

+0

當你這樣做時發生了什麼:effect.World = Matrix.CreateRotationZ(modelRotation)* effect.World = Matrix.CreateTranslation(position);我很困惑,你說它'朝着一個方向發展',你是什麼意思? – tweetypi

回答

3

我有一些提示,讓你開始:在DirectX/XNA

  1. 矩陣乘法順序differrent比你在學校學到。

在學校v = A B y意思是:v = A (B y)。所以當鏈接矩陣時,首先應用B.

如果你想矩陣A和B結合起來,就乘他們喜歡C = A B

在DirectX/XNA,順序是相反的。要結合矩陣B和A,你寫var C = B * A;

要犯錯誤阻止我,我採用的命名約定:每個矩陣(或變換)被稱爲AtoBWorldToViewModelToWorld,或ModelToRotatedModel

此提醒您,第一個矩陣的輸出必須正確矩陣的輸入相匹配:

var modelToView = modelToWorld * worldToView; 

,而不是:

var nowhereToNowhere = worldToView * modelToWorld; 

這對我幫助很大,我希望它能幫助你整理你的矩陣問題。

P.S. 我希望你的汽車模型的原點位於汽車的中心,否則它仍會奇怪地移動。

+0

如何獲取汽車的起源? – zionpi

+0

@zionpi最簡單的是計算汽車的邊界框,然後取這個框的中心。 – 2014-02-10 08:37:11

3

試着切換周圍這些值:

effect.World = Matrix.CreateTranslation(position) * Matrix.CreateRotationZ(modelRotation);

,使其成爲:

effect.World = Matrix.CreateRotationZ(modelRotation) * Matrix.CreateTranslation(position);

我遵循一個簡單的首字母縮寫,這就是所謂的ISROT

身份

規模

旋轉

方向

翻譯

您的工作權利到左,所以你總是Translation結束您的語句。