1

だから私は、シムズ2カメラと同じように機能するカメラでゲームを作っています。私が達成したいのは、次のことができるカメラです。

  • フォーカスポイントの周りを回転します。
  • 必要な3つの行列(World、View、Proj)を提供し、worldとviewの行列はフレームごとに再計算されます。
  • 位置ベクトルが変化すると、たとえばその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プログラミングに関しては初心者なので、助けていただければ幸いです。

    前もって感謝します、

    アントニー

    4

    1 に答える 1

    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);
    }
    
    于 2012-06-03T09:31:47.880 に答える