2012-05-31 64 views
1

所以我正在用相機制作遊戲,其工作方式與模擬人生2相機相似。 我想要完成的是一臺相機,它可以: XNA相機類不工作

  • 圍繞焦點進行漫遊。
  • 提供三個必要的矩陣(World,View和Proj),並且每幀重新計算世界和視圖矩陣。
  • 當位置矢量改變時,假設它的X部分,它應該左右移動,而不是沿X軸移動,如果你知道我的意思。
  • 相對焦點矢量。
  • 但是,我有移動左/右部分的問題。我會給你我有的代碼。請注意,在這個版本的代碼中,我還沒有試圖實現它。

    private float worldRotation = 0; 
    public void RotateAroundFocusPoint(float relativeDegrees) 
    { 
        worldRotation += MathHelper.ToRadians(relativeDegrees); 
    } 
    
    public Matrix World, View, Proj; 
    public Vector3 Position, Focus /*relative*/; 
    
    public void Update() 
    { 
        World = Matrix.CreateTranslation(-Position - Focus) * 
         Matrix.CreateRotationY(worldRotation); 
        View = Matrix.CreateLookAt(-Focus, Vector3.Zero, Vector3.Up); 
    } 
    

    我是怎樣的一個小白,當談到3D編程,所以我希望你能幫助我!

    由於提前,

    安東尼

    +0

    ....所以嘗試實施它? – JWiley

    +0

    @JWiley哈哈,我有好幾次了,但都失敗了!我沒有看到發佈失敗嘗試的觀點, – antonijn

    回答

    0

    所以我想通了自己。這是一個解決方法,但我使用以下方法實施它:

    private float worldRotation = 0; 
    public void RevolveAroundFocusPoint(float relativeDegrees) 
    { 
        worldRotation += MathHelper.ToRadians(relativeDegrees); 
    } 
    
    public Vector3 Modified 
    { 
        get 
        { 
         Vector3 f = Vector3.Transform(Focus, Matrix.Invert(Matrix.CreateRotationY(worldRotation))); 
         return new Vector3(f.X, Position.Y, f.Z); 
        } 
    } 
    public float Multiplier(float value, Vector3 v3) 
    { 
        return value//*Zoom/*/ (Math.Abs(v3.X) + Math.Abs(v3.Z)); 
    } 
    public void MoveRight(float value) 
    { 
        Vector3 f = Modified; 
        float multiplier = Multiplier(value, f); 
        Position += new Vector3(f.Z * multiplier, 0, f.X * multiplier); 
    } 
    public void MoveLeft(float value) 
    { 
        Vector3 f = Modified; 
        float multiplier = Multiplier(value, f); 
        Position += new Vector3(-f.Z * multiplier, 0, -f.X * multiplier); 
    } 
    public void MoveBackward(float value) 
    { 
        Vector3 f = Modified; 
        float multiplier = Multiplier(value, f); 
        Position += new Vector3(-f.X * multiplier, 0, f.Z * multiplier); 
    } 
    public void MoveForward(float value) 
    { 
        Vector3 f = Modified; 
        float multiplier = Multiplier(value, f); 
        Position += new Vector3(f.X * multiplier, 0, -f.Z * multiplier); 
    } 
    
    public Matrix World; 
    public Matrix View; 
    public Matrix Proj; 
    
    public Vector3 Position { get; private set; } 
    public Vector3 Focus; 
    
    public void Update() 
    { 
        World = Matrix.CreateTranslation(-Position - Focus) * 
         Matrix.Invert(Matrix.CreateRotationY(worldRotation)) * 
         Matrix.CreateScale(Zoom) * 
         Matrix.CreateTranslation(Position + Focus); 
        View = Matrix.CreateLookAt(Position, Position + Focus, Vector3.Up); 
    }