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