这几天我一直在研究这个问题,这真的很尴尬,因为你会认为它很容易解决。
我正在为我在 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
谢谢比亚克
附言。为你们所有的要求而缩短它。