2012-06-18 6 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 и измените высоту камеры, чтобы перейти от вида птичьего полета к виду земли. У бит, с которым у меня возникают проблемы, становится поворот камеры.

Когда значение вращения изменяется оно имеет эффект только если шаг изменился - от значения по умолчанию при запуске программы (которая смотрит прямо вниз на «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

Спасибо за вашу помощь, но это на самом деле не решить эту проблему, в конце концов, я получил некоторую помощь более чем по адресу: //forums.create.msdn .com/forums/p/105840/624190.aspx # 624190 он использовал другой подход, вместо того, чтобы пытаться исправить мой код, но он действительно создал некоторые проблемы ... все еще работает над окончательным решением. – Suipaste

Смежные вопросы