2012-06-18 62 views
1

我創建一個3D遊戲的攝像機。相機由以下變量:XNA相機繞着Z軸

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平面測試對象)

'cameraLookAt'可以沿x和y軸移動,'cameraPosition'是然後相對於「cameraLookAt」位置和「cameraPitch」和「cameraRotation」

目前可以米的電流值來計算繞x/y軸的細OVE和改變相機的間距從birdeye視圖到接地視圖去。我遇到的問題是讓相機旋轉工作。

當旋轉值改變它只有當間距已經改變任何影響 - 在程序啓動時(這是尋找直接倒在「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 Rotate Camera Around It's CreateLookAt "Target"

回答

1

偏移量應該不改變其長度旋轉,然後被添加到相機位置代碼它。

我想應該是這樣的:

offset = new Vector3(0, 0, 10); 

    Vector3 rotatedOffset = Vector3.Transform(offset, 
             Matrix.CreateRotationX(cameraPitch) 
             * Matrix.CreateRotationZ(cameraRotation)); 

    cameraPosition = cameraLookAt + rotatedOffset; 
+0

感謝您的幫助,但它實際上並沒有解決這個問題,我到底在http得到一些幫助過://forums.create.msdn .COM /論壇/ p/105840/624190.aspx#624190他用了不同的方法,而不是試圖解決我的代碼,但它確實創造了一些自身的問題...仍然工作在最終解決方案。 – Suipaste