2013-08-21 58 views
0

我嘗試串聯移動簡單模型時遇到問題。我有20個較小的模型附加到一個更大的模型。它基本上是一個有多個外部大炮的飛碟。我看過其他問題,如this one,看起來幾乎像我想要的。但是,這只是創建繪製翻譯。我實際上需要在三維空間中移動子模型,因爲它們可以獨立銷燬,因此需要碰撞檢測。下面是我如何旋轉父(在Update()函數):將子對象作爲父對象旋轉

angle += 0.15f; 

RotationMatrix = Matrix.CreateRotationX(MathHelper.PiOver2) * Matrix.CreateRotationZ(MathHelper.ToRadians(angle) * MathHelper.PiOver2); 

我已經嘗試了很多解決方案,但定位始終是關閉,所以他們不那麼看連接。這是我已經得到最接近:

cannons[x].RotationMatrix = Matrix.CreateRotationX(MathHelper.PiOver2) * 
Matrix.CreateRotationZ(MathHelper.ToRadians(angle + cannons[x].angle) * 
MathHelper.PiOver2); 

cannons[x].position.X = (float)(Math.Cos(MathHelper.ToRadians(angle + cannons[x].originAngle) * 
MathHelper.PiOver2) * 475) + position.X; 

cannons[x].position.Y = (float)(Math.Sin(MathHelper.ToRadians(angle + cannons[x].originAngle) * 
MathHelper.PiOver2) * 475) + position.Y; 

我做了什麼錯誤的代碼?或者,如果我的方法完全關閉,那麼這樣做的正確方法是什麼?

回答

2

您應該對所有內容使用Matrix轉換。

class Physics { 

public Vector3 Traslation; 
public Vector3 Scale; 
public Quaternion Rotation; 

public Physics Parent; 
public List<Physics> Children; 
public Matrix World; 


public Update() { 
     World = Matrix.CreateScale(Scale) 
       * Matrix.CreateFromQuaternion(Rotation) 
       * Matrix.CreateTranslation; 
     if (Parent!=null) { 
     World *= Parent.World ; 
     }  
     foreach (var child in children) child.Update();   
} 
} 

認識到這段代碼沒有優化,可以改進。

這樣你應該有一個物理對象爲你的大模型和20個物理對象的小模型,通過父屬性附加到大型模型。

如果你需要在絕對座標系下的物體的轉換,旋轉和縮放,你可以使用Matrix.Decompose方法,儘管它更好地將世界矩陣傳遞給着色器來轉換頂點。

+0

我不知道我的理解。如果我使用這個,我是不是必須完全替換所有與位置相關的代碼? – Fibericon

+0

子位置將與父空間相關,如果移動大模型並更新變換,則附加到父項的所有內容都將移動而不更改其翻譯,並且旋轉和縮放也相同,因此您無需製作針對您的大炮的引渡計算 – Blau

+0

+1對於沒有三角函數的解決方案。歐拉角度非常不適合做3D數學運算。就個人而言,我會有一個單一的4x4矩陣,而不是單獨的縮放,旋轉和平移值。我發現四元數過大,在數學上比矩陣更抽象和更復雜。有沒有任何GPU可以在本地處理四元數?等待...... – Skizz