[英]XNA Camera Rotation Around Z Axis
我正在為3D游戲創建相機。 攝像機由以下變量組成:
static Vector3 cameraLookAt = new Vector3(0, 0, 0);
static Vector3 cameraPosition;
static float cameraZoom = 25; // Field of view
const int cameraZoomNear = 3; // The furthest the camera can zoom in
const int cameraZoomFar = 45; // The furthest the camera can zoom out
static float cameraPitch; // Amount to change the pitch
static float cameraRotation; // Amount to change the rotation
默認情況下,“ cameraLookAt”的位置為(0,0,0),“ cameraPosition”的位置為(0,0,10),這意味着相機位於“ cameraLookAt”位置的正上方,從而可以鳥瞰下面的物體(紅色綠色和藍色xyz平面測試對象)
可以沿x和y軸移動“ cameraLookAt”,然后相對於“ cameraLookAt”位置以及“ cameraPitch”和“ cameraRotation”的當前值來計算“ cameraPosition”
當前,您可以繞x / y軸精細移動,並更改攝像機的俯仰角度,以從鳥瞰圖轉換為地面圖。 我遇到的麻煩是使相機旋轉正常工作。
更改旋轉值后,只有更改了音高才有效-從程序啟動時的默認值開始(它直接向下看“ cameraLookAt”)
當值確實改變時,您可以繞Z軸旋轉,但視圖也會旋轉,因此,當您旋轉180度時,相機也將旋轉180度,並且視圖上下顛倒。
以下是確定“ cameraPosition”位置的代碼,我確定這些行中的固定行。
cameraPosition = cameraLookAt + new Vector3(0, 0, 10);
Vector3 temp = Vector3.Normalize(cameraPosition - cameraLookAt); //creates a unit length vector that points in the direction from 'lookAt' to 'position'
cameraPosition = Vector3.Transform(cameraPosition - cameraLookAt, Matrix.CreateRotationX(cameraPitch)) + cameraLookAt;
cameraPosition = Vector3.Transform(cameraPosition - cameraLookAt, Matrix.CreateRotationZ(cameraRotation)) + cameraLookAt;
view = Matrix.CreateLookAt(cameraPosition, cameraLookAt, new Vector3(0.0f, 1.0f, 0.0f));
projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(cameraZoom), graphics.GraphicsDevice.Viewport.AspectRatio, nearClip, farClip);
另外,這里還有一個問答,我發現它可以幫助我首先編碼XNA圍繞它的CreateLookAt“ Target”旋轉相機。
偏移量應旋轉而不改變其長度,然后添加到攝像機位置。
我認為應該是這樣的:
offset = new Vector3(0, 0, 10);
Vector3 rotatedOffset = Vector3.Transform( offset,
Matrix.CreateRotationX(cameraPitch)
* Matrix.CreateRotationZ(cameraRotation));
cameraPosition = cameraLookAt + rotatedOffset;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.