1

这几天我一直在研究这个问题,这真的很尴尬,因为你会认为它很容易解决。

我正在为我在 XNA 中制作的游戏制作相机功能(是的,我知道不再支持 XNA,请停止告诉我)。它是为 Oculus Rift 开发的,我让它部分工作,从肩膀到脖子,从脖子到头。眼睛是目前困扰我的地方。目前,向前看时,它工作正常。但是只要我旋转(Pitch),眼睛就不会跟随。它们基本上卡在相同的偏移量上(例如,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);
}

据我所知,这应该有效,对吧?我认为这可能是其中一个矩阵的问题,但如果我知道,我就不会问了,所以......有人有预感吗?

完整课程: http: //pastebin.com/zUVwAPFt http://pastebin.com/jTbnNsJm

谢谢比亚克

附言。为你们所有的要求而缩短它。

4

1 回答 1

1

对。傻我。经过大约一周的研究,我终于去看看我认为我完全确定的事情是不是真的。我混淆了 Yaw 和 Pitch 的工作方向,这显然导致了非常奇怪的工作代码。

所以最后,如果有人有类似的问题,如果不是Yaw,Pitch或Roll轴有问题,你不会在这里找到答案。

于 2013-10-16T20:02:08.497 回答