1

私は数日前からこの問題に手を出していましたが、これは本当に恥ずかしいことです。

XNA で作成しているゲームのカメラ機能の作成に取り組んでいます (はい、XNA がサポートされなくなったことは知っています。教えてはいけません)。これは Oculus Rift 用に開発されており、肩から首、首から頭までのジョイントで部分的に機能するようになりました。今悩んでいるのは目です。現在、直視すると問題なく動作しています。でも回転(ピッチ)した途端に目が追いつかない。それらは基本的に同じオフセット (カメラの位置から x+2 と x-2 のように) で動かなくなります。つまり、180 度回転すると、目が入れ替わります。つまり、私の左の視覚は右のカメラであり、その逆も同様です。

これが私のコードです:[CameraController.cs]

    public override void Update(GameTime gameTime)
    {
        Vector3 leftEyePosition = GetEyePosition(Eyes.Left);
        Vector3 rightEyePosition = GetEyePosition(Eyes.Right);

        _leftEyeCamera.Update(gameTime, leftEyePosition, NeckHead.Yaw, NeckHead.Pitch, NeckHead.Roll, 2);
        _rightEyeCamera.Update(gameTime, rightEyePosition, NeckHead.Yaw, NeckHead.Pitch, NeckHead.Roll, -2);
    }

    private Vector3 GetEyePosition(Eyes eyes)
    {
        Matrix neckHead = GetHeadPositions();

        Vector3 eye = (eyes == Eyes.Left ? neckHead.Left : neckHead.Right);
        Vector3 eyePosition = NeckHead.Position;
        return (eye + eyePosition);
    }

    private Matrix GetHeadPositions()
    {
        Matrix shoulderNeck = ShoulderNeck.GetMatrix();
        Matrix neckHead = NeckHead.GetMatrix()*shoulderNeck;

        return neckHead;
    }

【ジョイント.cs】

public class Joint
{
    private float _pitch;
    private Vector3 _position;
    private float _roll;
    private float _yaw;

    public Joint(Joint childJoint, Vector3 position)
    {
        ChildJoint = childJoint;
        Position = position;
    }

    public Vector3 Position { get; set; }

    public float Yaw { get; set; }

    public float Pitch { get; set; }

    public float Roll { get; set; }

    public Joint ChildJoint { get; private set; }

    public Matrix GetMatrix()
    {
        return Matrix.CreateFromYawPitchRoll(Yaw, Pitch, Roll);
    }
}

【FpsCamera.csの更新方法】

public void Update(GameTime gameTime, Vector3 position, float yaw, float pitch, float roll)
{
    Matrix rotationMatrix = Matrix.CreateFromYawPitchRoll(pitch, yaw, roll);
    Vector3 transformedReference = Vector3.Transform(Vector3.Forward, rotationMatrix);

    Vector3 target = transformedReference + position;

    view = Matrix.CreateLookAt(position, target, rotationMatrix.Up);
}

私が知る限り、これはうまくいくはずですよね?マトリックスの1つに問題があるのではないかと思いますが、知っていれば質問しないので... 誰か予感がしましたか?

完全なクラス: http://pastebin.com/zUVwAPFt http://pastebin.com/jTbnNsJm

ありがとうビャルケ

Ps。皆さんが求めるすべてのためにそれを短くしました。

4

1 に答える 1