2011-11-21 70 views
3

我剛開始在XNA中進行3D編碼,並試圖讓我的腦子圍繞幾件事情。XNA世界空間和物體運動

我與XNA的目標是做一個太空模擬遊戲(原始的,我知道)我能畫模型和我的相機正在工作,我想它想,在那裏我遇到了麻煩的是瞭解如何移動我的敵艦。我在2D中做了一些值得的轉向行爲,但不是3d。

我的問題是:

如果我試圖移動船「求」的位置,請問這是怎麼運行效果船的世界矩陣(如果有的話)?我正在使用vector3s,並將加速度添加到速度,然後將速度添加到該位置。這是正確的方法嗎?

我現在不必立即發帖,或者我會,我只是想了解採取什麼方法。

感謝

+2

就積分速度/加速度而言,在恆定加速度a下,牛頓運動隨時間dt的正確公式爲:起動速度v0和起始位置x0爲:x = x0 + v0 * dt + 0.5 * a * dt * dt。新的速度是v = v0 + a * dt。這些方程適用於三維矢量(速度和加速度本身就是矢量)。 –

+0

感謝您的回覆,使用這個公式我仍然需要維護一個世界矩陣,以便船舶轉變爲世界空間或者這不是必要的嗎? –

+0

通常,您基於演員的位置和方向(在這種情況下爲ship)構造世界矩陣。假設你跟蹤的位置是世界位置,你只需將世界矩陣的翻譯部分替換爲演員的位置即可。 –

回答

4

給你的對象/實體/船的位置(的Vector3)和旋轉(矩陣),然後就可以使用下面的代碼(在這個答案底部的樣品)來移動船周圍。

例如移動船前進5個單位:

Entity myShip = new Entity(); 
myShip.GoForward(5.0f); 

爲了讓你的船,桶滾90度

myShip.Roll(MathHelper.PiOver2); 

而這裏的示例代碼

public class Entity 
{ 
    Vector3 position = Vector3.Zero; 
    Matrix rotation = Matrix.Identity; 

    public void Yaw(float amount) 
    { 
     this.rotation *= Matrix.CreateFromAxisAngle(this.rotation.Up, amount); 
    } 

    public void YawAroundWorldUp(float amount) 
    { 
     this.rotation *= Matrix.CreateRotationY(amount); 
    } 

    public void Pitch(float amount) 
    { 
     this.rotation *= Matrix.CreateFromAxisAngle(this.rotation.Right, amount); 
    } 

    public void Roll(float amount) 
    { 
     this.rotation *= Matrix.CreateFromAxisAngle(this.rotation.Forward, amount); 
    } 

    public void Strafe(float amount) 
    { 
     this.position += this.rotation.Right * amount; 
    } 

    public void GoForward(float amount) 
    { 
     this.position += this.rotation.Forward * amount; 
    } 

    public void Jump(float amount) 
    { 
     this.position += this.rotation.Up * amount; 
    } 

    public void Rise(float amount) 
    { 
     this.position += Vector3.Up * amount; 
    } 
}