2016-04-05 32 views
0

我有一個汽車模型,我想繪製由兩部分組成的車身和輪胎。每個獨立的* .OBJ文件都是單獨的模型,每個模型都使用單獨的drawcall進行繪製。正確旋轉相關模型的方法

​​

最初的圖紙看起來不錯,一切似乎都一字排開:

enter image description here

然而,當我開始旋轉,一切都休息:

enter image description here

每個對象都以相同的方式轉換(使用XNAMath的tran平滑,縮放和旋轉矩陣),每個對象都有自己在世界空間中的位置。

我認爲這裏的問題是輪換的「錨點」。

  • 如何在「錨點」周圍旋轉物體?
  • 應該使用哪個「錨點」?
  • 兩個對象使用通用的「錨點」就足夠了嗎?

另一個問題是,你們知道什麼是代表這種結構的正確方法嗎?現在這些是兩個不同的實例,但如果我想添加內部,鏡像等,那麼適當地更好地爲所有對象創建一些具有共同屬性的容器類,對嗎?

回答

1

看來你的矩陣連接是錯誤的。因爲你的加入不同的模式,以一個大的U型應該這樣來做:

  1. 的單件的每一個網具有範圍[-1,1]爲X,Y內的頂點,Z
  2. 每移動對象空間中的部分與汽車的位置(縮放,旋轉,移動)相關,通常對象空間的範圍是[x,y,z]的範圍[-1,1]。即,輪胎可能應該縮小並移動到車體的底部。
  3. 將帶有一個世界矩陣的整車移動到場景中的最終位置(比例,旋轉,移動)。在這裏,您可以對汽車進行真實的縮放,旋轉或平移以將其放置在最終的場景中。
  4. 這是通過將WorldMatrix與所有零件的每個ObjectSpace矩陣相乘來完成的。
  5. 因此,對於每個對象,您將得到一個具有以下結構的矩陣鏈: 車的局部空間 - >車的對象空間 - >場景中的世界空間=>(ObjectSpaceMatrix * WorldMatrix適用於汽車的每個部分)。

在你的模型中,它看起來像你的汽車零件在[0,1]範圍內。由於縮放是從(0,0,0)完成的,因此您會將這種典型的超移動移向一個方向。要麼改變網格中的頂點,要麼首先用[-0.5,-0.5,-0.5]平移對象部分,以確保對象居中且縮放比例正確。

下面有一些結構的某些僞代碼ü可以使用:

class CarPart 
{ 
    Float4x4 ObjectSpaceMatrix; //matrix moves part to its position in the "CarObjectSpace" withing range[-1,1] 
    Mesh Instance; 
} 

class Car 
{ 
    Float4x4 WorldSpaceMatrix; //matrix moves complete mesh inside the scene 

    CarPart Tires; 
    CarPart Body; 
    CarPart Engine; 
    ... 
} 

void render() 
{ 
    Float4x4 FinalTiresMatrix = Car.Tires.ObjectSpaceMatrix * Car.WorldSpaceMatrix; 
    Float4x4 BodyTiresMatrix = Car.Body.ObjectSpaceMatrix * Car.WorldSpaceMatrix; 
    ... 
} 

我希望這會幫助你, 祝你好運!

+0

謝謝你的回答@kaiser!我添加了一些調試打印,結果表明你對頂點是正確的,他們在範圍內(-1.44918,4.5572),我已經規範化了,現在我們有(-0.317997,1)。這是常見的做法嗎?我一直認爲Object Space中的頂點基本上可以有任何值。無論如何,我會繼續對你提出的改變進行修改,一旦我得到了某些東西,我會盡快回復。 –

+1

是規範化的範圍是常見的做法。你應該儘量避免網狀結構中的早期信息。如果加載的基本網格與縮放,旋轉和平移無關,則您的程序將更通用。 – kaiser