2013-02-22 2 views
1

Я сделал 2D изометрический рендеринг. Он отлично работает, но теперь я хочу показать свою сцену с 4-х разных точек зрения (NO NW SE SW), но при повороте на 90 ° моя камера не может удерживать центр моей сцены на экране.Вычислите новые координаты камеры после поворота на 90 градусов в изометрической 2D-проекции

Что работает:

  • Я Calcul новой проекции сцены, чтобы соответствовать новому видовому экрану (х у г в моем мире).
  • Я реорганизовать часть моей сцены (кусок), чтобы привлечь их в правильном порядке
  • Я реорганизовать «плитку» из «кусков», чтобы привлечь их в правильном порядке
  • я могу держать правильный центр с 180 вращение градаций.

Что нам сделать не работает:

  • Я не могу найти правильный перевод, чтобы применить к моей камере после поворота 90 Degres.

То, что я знаю:

  • Чтобы сохранить тот же центр при повороте на 180 ° с моей камерой, я должен сделать это:

camera.Position -= new Vector2(2 * camera.Position.X + camera.Width, 2 * camera.Position.Y + camera.Height);

Иллюстрация sceen from SE point of view enter image description here enter image description here

ответ

0

Если центр вашей карты является Origo (0,0,0), это становится легко:

Сначала вы храните положение камеры по умолчанию в Vector3 CameraOffset, то вычислить положение с помощью вращательно-матрица. 90 * у redians - половина Pi, поэтому мы будем использовать PiOverTwo. Мы также будем использовать перечисление, чтобы решить, какое направление указывать, поэтому вы можете сказать

Camera.Orientation = Orientation.East;

и камера должна зафиксироваться :)

public enum Orientation 
{ 
    North, East, South, West 
} 

камеры:

public Vector3 Position { get; protected set; } 

Vector3 _CameraOffset = new Vector3(0, 20, 20); 
public Vector3 CameraOffset 
{ 
    get 
    { 
     return _Orientation; 
    } 

    set 
    { 
     _Orientation = value; 
     UpdateOrientation(); 
    } 
} 

Orientation _Orientation = Orientation.North; 
public Orientation Orientation 
{ 
    get 
    { 
     return _Orientation; 
    } 

    set 
    { 
     _Orientation = value; 
     UpdateOrientation(); 
    } 
} 

private void UpdateOrientation() 
{ 
    Position = Vector3.Transform(CameraOffset, Matrix.CreateRotationY(MathHelper.PiOverTwo * (int)Orientation)); 
} 

Если вы хотите, движение скольжения между позициями, я думаю, что тоже может помочь;)

Если ваша камера не фокусируется на Vector3.Ноль и не должен вращаться вокруг него, вам просто нужно изменить:

Position = Vector3.Transform(CameraOffset, Matrix.CreateRotationY(MathHelper.PiOverTwo * (int)Orientation)); 

к:

Position = Vector3.Transform(CameraOffset, Matrix.CreateRotationY(MathHelper.PiOverTwo * (int)Orientation) * Matrix.CreateTranslation(FocusPoint)); 

Здесь FocusPoint является точкой в ​​3D, что вы вращаться вокруг (ваш миры центр). И теперь вы также знаете, как позволить вашей камере перемещаться, если вы вызываете UpdateOrientation() в Camera.Update();)

EDIT; Так что извините, полностью упустил то, что вы используете 2D. Я вернусь позже, чтобы узнать, смогу ли я помочь: P

+0

Спасибо за ваш ответ, я провешу этот вечер, но он выглядит хорошим. Действительно, для моего поворота на 180 ° сделать перевод Pi является логикой. –

+0

У меня появилась идея, я постараюсь сделать 1,1 поворот, а затем повторно применить изометрическое преобразование. –

+0

Я правильно сделал поворот на 90 °, Vector2 (new_camera_x, new_camera_y) = новый Vector2 (- (old_camera_y - old_camera_height)/2, old_camera_x * 2) или своего рода. Это правильно для Z = 0 в моем мире, но если я изменю высоту, все будет не так. Поэтому, наконец, мне нужно найти центр моей сцены (X Y Z) и повернуть его вокруг (par matrice ou simple decallage avant/apres). –