Проблемы ротации OpenGL-OpenTK - PullRequest
       13

Проблемы ротации OpenGL-OpenTK

0 голосов
/ 03 августа 2010

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

У меня есть базовый класс для трехмерных объектов, и, для начала, я хочу реализовать функции, которые будут вращатьобъект на определенной оси с х градусов.Пока у меня есть следующее:

 public void RollDeg(float angle)
    {
        this.rotation = Matrix4.Mult(rotation, 
            Matrix4.CreateRotationX(MyMath.Conversions.DegToRad(angle)));
    }

    public void PitchDeg(float angle)
    {
        this.rotation = Matrix4.Mult(rotation, 
             Matrix4.CreateRotationY(MyMath.Conversions.DegToRad(angle)));
    }

    public void YawDeg(float angle)
    {
        this.rotation = Matrix4.Mult(rotation,
             Matrix4.CreateRotationZ(MyMath.Conversions.DegToRad(angle)));
    }

'Вращение' - это матрица 4x4, которая начинается как единичная матрица.Каждый раз, когда я хочу повернуть / наклонить / рыскать объект, я вызываю одну из функций выше.

для рисования, я использую другую функцию, которая помещает матрицу в стек ModelView, умножает ее на перевод, вращениеи масштабируем матрицы объекта (в этом порядке) и начинаем рисовать вершины.Конечно, наконец, я вытаскиваю матрицу из стека.

проблема в том, что вышеприведенные функции вращают объект по ГЛОБАЛЬНОЙ оси, а не по ЛОКАЛЬНОЙ, даже если, насколько я понимаю, каждый раз, когда вы поворачиваетеобъект, локальная система меняет свою ось, а затем, когда новый поворот применяется поверх других, локальная ось используется для новой.

Я читаю различные учебники о математике за ней и каквращать объекты, но я не мог найти тот, который мог бы помочь мне.

если бы у кого-то было время, я был бы очень признателен, если бы он помог мне понять, КАК вращаться вокруг локальной оси и, может быть, даже более важно, что я сделал неправильно в моей текущей реализации.

1 Ответ

1 голос
/ 03 августа 2010

Если вы хотите выполнить свои преобразования в следующем порядке: перевод -> вращение -> масштаб (что обычно имеет смысл, это то, что обычно требуется), вы должны умножить матрицы в обратном порядке.

В правосторонней системе координат (т.е. в той, что использует openGL), умножение матриц должно выполняться справа налево. Вот почему:

ModelViewTransform = Transform * Вид * Model // <- вы начинаете с модели, верно? так вот так </p>

Обратите внимание, что в DirectX они используют левую систему координат. У него есть свои недостатки, но он более интуитивен.

...