2012-05-31 69 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); 
    }