我一直在討論這個問題幾天,這真的很尷尬,因爲你會認爲這將很容易修復。C#創建真正的攝像頭/ w頭
我正在爲我在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;
}
[Joint.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
感謝 Bjarke
詩篇。把你的問題縮短了。
沒有人會閱讀所有這些代碼。 – pinckerman
@pinckerman'所有這些代碼'。你意識到它有多少,對吧?除了你甚至不需要閱讀比Update方法和Get方法更多的內容。除非你想得到關於一切工作原理的總體概述,不管怎樣,我認爲這不應該是需要的。 – Falgantil
這就是爲什麼你應該只寫需要的代碼,這很容易理解。 – pinckerman