2013-10-13 55 views
1

我一直在討論這個問題幾天,這真的很尷尬,因爲你會認爲這將很容易修復。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

詩篇。把你的問題縮短了。

+1

沒有人會閱讀所有這些代碼。 – pinckerman

+0

@pinckerman'所有這些代碼'。你意識到它有多少,對吧?除了你甚至不需要閱讀比Update方法和Get方法更多的內容。除非你想得到關於一切工作原理的總體概述,不管怎樣,我認爲這不應該是需要的。 – Falgantil

+0

這就是爲什麼你應該只寫需要的代碼,這很容易理解。 – pinckerman

回答

1

沒錯。傻我。經過大約一週的研究,我終於看到了我認爲我完全確定的東西是不是真的。我混淆了Yaw和Pitch的工作方向,這顯然導致了非常奇怪的代碼。

所以最後,如果有人有類似的問題,如果它不是Yaw,Pitch或Roll軸這是一個問題,你不會在這裏找到答案。