Относительное вращение камеры? - PullRequest
0 голосов
/ 11 ноября 2010

В настоящее время у меня установлен этот код обновления для поворота и перемещения моей камеры.

float move = 0.5f;
        float look = 0.01f;


        //Rotation
        if (Keyboard[Key.Left]) {

            modelview = Matrix4.Mult (modelview, Matrix4.CreateRotationY (-look));
        }
        if (Keyboard[Key.Right]) {
            modelview = Matrix4.Mult (modelview, Matrix4.CreateRotationY (look));

        }
        if (Keyboard[Key.Up])
        {
            modelview = Matrix4.Mult (modelview, Matrix4.CreateRotationX (-look));
        }
        if (Keyboard[Key.Down])
        {
            modelview = Matrix4.Mult (modelview, Matrix4.CreateRotationX (look));
        }

        //Movement
        if (Keyboard[Key.W])
        {
            modelview = Matrix4.Mult (modelview, Matrix4.CreateTranslation (0f, 0f, move));
        }
        if (Keyboard[Key.S]) {
            modelview = Matrix4.Mult (modelview, Matrix4.CreateTranslation (0f, 0f, -move));
        }
        if (Keyboard[Key.A])
        {
            modelview = Matrix4.Mult (modelview, Matrix4.CreateTranslation (move, 0f, 0));
        }
        if (Keyboard[Key.D]) {
            modelview = Matrix4.Mult (modelview, Matrix4.CreateTranslation (-move, 0f, 0));
        }

Когда я двигаюсь, моя камера имитирует эффект поворота вокруг источника в мире (0,0,0), а не в его текущем положении.

Моя матрица вида модели загружается так:

            GL.MatrixMode (MatrixMode.Modelview);
        GL.LoadMatrix (ref modelview);

1 Ответ

2 голосов
/ 11 ноября 2010

С этим кодом можно многое сделать.Короче говоря:

Я полагаю, что ваш код является частью цикла рендеринга?

Вам необходимо:

  • заменить move на 3переменные, для перемещения в направлениях x, y, z,
  • замените look на 2 переменные, yaw для взгляда влево-вправо и pitch для взгляда вверх-вниз, Google для "углов Эйлера"для большей теории об этом;
  • переместите все те, кто находится за пределами цикла - они должны сохраняться между кадрами.

После этого в каждом кадре вы должны:

  • обновить эти переменные (увеличить или уменьшить на постоянное значение, умноженное на время дельты между 2 кадрами) в соответствии с входными данными,
  • заменить матрицу вида модели на единичную матрицу (LoadIdentity ()),
  • умножить матрицу вида модели путем перевода на (x, y, z),
  • умножить на поворот в плоскости X на yaw,
  • умножитьвращением по плоскости Y на pitch.

Подводя итог, вам необходимо отделить обработку ввода от руки матрицыи каждый кадр устанавливает правильную матрицу вида модели (как набор преобразований), основываясь на текущей позиции и направлении.

...