看來你的矩陣連接是錯誤的。因爲你的加入不同的模式,以一個大的U型應該這樣來做:
- 的單件的每一個網具有範圍[-1,1]爲X,Y內的頂點,Z
- 每移動對象空間中的部分與汽車的位置(縮放,旋轉,移動)相關,通常對象空間的範圍是[x,y,z]的範圍[-1,1]。即,輪胎可能應該縮小並移動到車體的底部。
- 將帶有一個世界矩陣的整車移動到場景中的最終位置(比例,旋轉,移動)。在這裏,您可以對汽車進行真實的縮放,旋轉或平移以將其放置在最終的場景中。
- 這是通過將WorldMatrix與所有零件的每個ObjectSpace矩陣相乘來完成的。
- 因此,對於每個對象,您將得到一個具有以下結構的矩陣鏈: 車的局部空間 - >車的對象空間 - >場景中的世界空間=>(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;
...
}
我希望這會幫助你, 祝你好運!
謝謝你的回答@kaiser!我添加了一些調試打印,結果表明你對頂點是正確的,他們在範圍內(-1.44918,4.5572),我已經規範化了,現在我們有(-0.317997,1)。這是常見的做法嗎?我一直認爲Object Space中的頂點基本上可以有任何值。無論如何,我會繼續對你提出的改變進行修改,一旦我得到了某些東西,我會盡快回復。 –
是規範化的範圍是常見的做法。你應該儘量避免網狀結構中的早期信息。如果加載的基本網格與縮放,旋轉和平移無關,則您的程序將更通用。 – kaiser