我正在製作一款3D汽車遊戲,並且存在旋轉問題。 我想圍繞自己旋轉模型,但是當我移動時,它開始在全世界移動 !如何圍繞其中心旋轉3D模型?
現在的問題是:如何讓模型的中心移動?
我試圖改變這樣的代碼:
effect.World = Matrix.CreateRotationZ(modelRotation) * effect.World = Matrix.CreateTranslation(position);
現在不是前進相對於模型,它定位在一組方向移動! &這是我的代碼:
我正在製作一款3D汽車遊戲,並且存在旋轉問題。 我想圍繞自己旋轉模型,但是當我移動時,它開始在全世界移動 !如何圍繞其中心旋轉3D模型?
現在的問題是:如何讓模型的中心移動?
我試圖改變這樣的代碼:
effect.World = Matrix.CreateRotationZ(modelRotation) * effect.World = Matrix.CreateTranslation(position);
現在不是前進相對於模型,它定位在一組方向移動! &這是我的代碼:
我有一些提示,讓你開始:在DirectX/XNA
在學校v = A B y
意思是:v = A (B y)
。所以當鏈接矩陣時,首先應用B.
如果你想矩陣A和B結合起來,就乘他們喜歡C = A B
在DirectX/XNA,順序是相反的。要結合矩陣B和A,你寫var C = B * A;
要犯錯誤阻止我,我採用的命名約定:每個矩陣(或變換)被稱爲AtoB
:WorldToView
,ModelToWorld
,或ModelToRotatedModel
。
此提醒您,第一個矩陣的輸出必須正確矩陣的輸入相匹配:
var modelToView = modelToWorld * worldToView;
,而不是:
var nowhereToNowhere = worldToView * modelToWorld;
這對我幫助很大,我希望它能幫助你整理你的矩陣問題。
P.S. 我希望你的汽車模型的原點位於汽車的中心,否則它仍會奇怪地移動。
如何獲取汽車的起源? – zionpi
@zionpi最簡單的是計算汽車的邊界框,然後取這個框的中心。 – 2014-02-10 08:37:11
試着切換周圍這些值:
effect.World = Matrix.CreateTranslation(position) * Matrix.CreateRotationZ(modelRotation);
,使其成爲:
effect.World = Matrix.CreateRotationZ(modelRotation) * Matrix.CreateTranslation(position);
我遵循一個簡單的首字母縮寫,這就是所謂的ISROT
身份
規模
旋轉
方向
翻譯
您的工作權利到左,所以你總是Translation
結束您的語句。
我建議你堅持每個語句單一賦值操作符。如果你不這樣做,結果可能會令人困惑,令人驚訝和難以閱讀。 –
當你這樣做時發生了什麼:effect.World = Matrix.CreateRotationZ(modelRotation)* effect.World = Matrix.CreateTranslation(position);我很困惑,你說它'朝着一個方向發展',你是什麼意思? – tweetypi