Перемещение 3d камеры на XNA - PullRequest
       30

Перемещение 3d камеры на XNA

1 голос
/ 11 сентября 2010

Я занимаюсь практикой в ​​XNA, и я создал класс, представляющий камеру.

Моя цель состоит в том, чтобы, когда пользователь нажимал некоторые клавиши, переводил камеру (не цель) на 90 градусов по оси X (чтобы увидеть объект, который я поместил в сцену под разными углами). К тому моменту я без проблем перемещаю камеру в X, Y и Z.

На самом деле, чтобы настроить мою камеру, я использую следующие строки кода:

public void SetUpCamera()
{
            #region ## SET DEFAULTS ##
            this.FieldOfViewAngle = 45.0f;
            this.AspectRatio =1f;
            this.NearPlane = 1.0f;
            this.FarPlane = 10000.0f;
            #endregion

            this.ProjectionMatrix = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(this.FieldOfViewAngle), 16 / 9, this.NearPlane, this.FarPlane);
            this.ViewMatrix = Matrix.CreateLookAt(new Vector3(this.PositionX, this.PositionY, this.PositionZ), new Vector3(this.TargetX, this.TargetY, this.TargetZ), Vector3.Up);
}

У меня есть этот метод для перемещения камеры:

public void UpdateView()
{
     this.ViewMatrix = Matrix.CreateLookAt(new Vector3(this.PositionX, this.PositionY, this.PositionZ), new Vector3(this.TargetX, this.TargetY, this.TargetZ), Vector3.Up);
}

Затем в игре (обновить обработчик событий, у меня есть следующий код)

if (keyboardstate.IsKeyDown(Keys.NumPad9))
{
   this.GameCamera.PositionZ -= 1.0f;
}
if (keyboardstate.IsKeyDown(Keys.NumPad3))
{
   this.GameCamera.PositionZ += 1.0f;
}
this.GameCamera.UpdateView();

Я хотел бы знать, как сделать так, чтобы камера поворачивалась на 90 градусов, чтобы окружить один объект, который я поместил на экран.

Чтобы лучше объяснить себя с движением камеры, вот видео на YouTube, в котором используется точное движение, которое я пытаюсь описать (см. С 14 секунды) http://www.youtube.com/watch?v=19mbKZ0I5u4

1 Ответ

3 голосов
/ 11 сентября 2010

Предполагая, что камера в видео вращается вокруг автомобиля, вот как вы бы сделали это в XNA.

Для удобства чтения мы будем просто использовать векторы вместо их отдельных компонентов.Таким образом, «цель» означает, что это Vector3, который включает в себя TargetX, TargetY и TargetZ.То же самое с положением камеры.Вы можете разбить значения X, Y, Z на поля и сделать из них Vector3 для подключения к этому коду, если хотите позже, но на самом деле было бы лучше, если бы вы работали на уровне вектора, а не на уровне компонента.

//To orbit the car (target)
cameraPosition = Vector3.Transform(cameraPosition – target, Matrix.CreateRotationY(0.01f)) + target;
this.ViewMatrix = Matrix.CreateLookAt(cameraPosition, target, Vector3.Up);

Поскольку все вращения матрицы действуют вокруг оси, которая пересекает мировое происхождение, чтобы использовать матрицу вращения для вращения камеры вокруг автомобиля, объект вращения должен быть смещен так, чтобы цель (и, следовательно, вращение)ось) находится в мире происхождения.CameraPosition - цель выполняет это.Теперь положение камеры можно немного повернуть.После того, как cameraPosition будет немного повернут, его нужно отправить обратно на сцену, для этого и предназначен '+ target' в конце строки.

0.01f можно настроить на любоеСкорость вращения вас устраивает.

...