0

ローカルスペースでカメラをピッチするにはどうすればよいですか?

ワールドスペースのどこにあるかに関係なく、軸を中心に回転するモデルがあります。私が抱えている問題は、モデルの他の回転(ヨー)に関係なく、カメラのピッチを同じにすることです。現在、モデルがワールドスペースで北または南を向いている場合、カメラはそれに応じてピッチします。ただし、モデルが他の基本的な方向を向いている場合、カメラをピッチングしようとした後、カメラはモデルの背後で円を描くように上下に移動します(モデルが向いている方向ではなく、ワールドスペースのみを認識しているため)。

モデルがどちらの方向を向いていても、ピッチをモデルと一緒に回転させるにはどうすればよいですか?ピッチングしようとすると、カメラがモデル上を移動しますか?

// Rotates model and pitches camera on its own axis
    public void modelRotMovement(GamePadState pController)
    {
        /* For rotating the model left or right.
         * Camera maintains distance from model
         * throughout rotation and if model moves 
         * to a new position.
         */

        Yaw = pController.ThumbSticks.Right.X * MathHelper.ToRadians(speedAngleMAX);

        AddRotation = Quaternion.CreateFromYawPitchRoll(Yaw, 0, 0);
        ModelLoad.MRotation *= AddRotation;
        MOrientation = Matrix.CreateFromQuaternion(ModelLoad.MRotation);

        /* Camera pitches vertically around the
         * model. Problem is that the pitch is
         * in worldspace and doesn't take into
         * account if the model is rotated.
         */
        Pitch = pController.ThumbSticks.Right.Y * MathHelper.ToRadians(speedAngleMAX);
    }

    // Orbit (yaw) Camera around model
    public void cameraYaw(Vector3 axisYaw, float yaw)
    {
        ModelLoad.CameraPos = Vector3.Transform(ModelLoad.CameraPos - ModelLoad.camTarget,
            Matrix.CreateFromAxisAngle(axisYaw, yaw)) + ModelLoad.camTarget;
    }

    // Pitch Camera around model
    public void cameraPitch(Vector3 axisPitch, float pitch)
    {
        ModelLoad.CameraPos = Vector3.Transform(ModelLoad.CameraPos - ModelLoad.camTarget,
            Matrix.CreateFromAxisAngle(axisPitch, pitch)) + ModelLoad.camTarget; 
    }

    public void updateCamera()
    {
        cameraPitch(Vector3.Right, Pitch);
        cameraYaw(Vector3.Up, Yaw);
    }
4

1 に答える 1

0
>    public void cameraPitch(Vector3 axisPitch, float pitch)
>     {
>         ModelLoad.CameraPos = Vector3.Transform(ModelLoad.CameraPos - ModelLoad.camTarget,
>             Matrix.CreateFromAxisAngle(axisPitch, pitch)) + ModelLoad.camTarget; 
>     }

私はあなたの最後の質問でこれを見るべきでした。sry。

axisPitchは確かにグローバル空間ベクトルであり、ローカル空間にある必要があります。これは機能するはずです。

   public void cameraPitch(float pitch)
    {
        Vector3 f = ModelLoad.camTarget - ModelLoad.CameraPos;
        Vector3 axisPitch = Vector3.Cross(Vector3.Up, f);
        axisPitch.Normalize();
        ModelLoad.CameraPos = Vector3.Transform(ModelLoad.CameraPos - ModelLoad.camTarget,
            Matrix.CreateFromAxisAngle(axisPitch, pitch)) + ModelLoad.camTarget; 
    }
于 2012-10-11T14:13:04.870 に答える