OpenGL вращение и масштабирование - PullRequest
1 голос
/ 02 октября 2011

Всегда ли происходит вращение вокруг начала координат (0,0,0)?

Всегда ли перевод происходит относительно предыдущего перевода?

Увеличивает ли масштаб размер координатных осей?

Ответы [ 3 ]

5 голосов
/ 02 октября 2011

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

Сначала представьте XYZ декартово координатное пространство, затем представьте точку (X, Y, Z) в пространстве с началом координат (0, 0, 0). Все, что OpenGL знает на этом этапе, это точка X, Y, Z. Теперь вы готовы начать:

Вращение требует угла и центра вращения. glRotate позволяет указывать только углы. В силу математики, концептуально, центр вращения находится в месте (X-X, Y-Y, Z-Z) или (0,0,0).

Перевод - это просто смещение от текущей позиции. Поскольку OpenGL знает вашу точку (X, Y, Z), он просто добавляет отклонение к вектору позиции. Поэтому правильнее будет сказать, что это относительно текущей позиции, а не предыдущего перевода.

Масштабирование - это умножение точечного вектора (X.m, Y.m, Z.m), следовательно, оно просто переводит эту точку на коэффициент m. Следовательно, концептуально можно сказать, что это не меняет размер координатных осей.

Однако, когда вы начинаете думать в 3D, все становится довольно сложно, потому что вы поймете, что, если вы не будете осторожны, все точки в одном 3D-объекте не всегда меняют положение по вашему желанию относительно друг друга . Например, вы узнаете, что если вы хотите вращаться вокруг центра объекта, вам придется «переместить его в начало координат, повернуть, а затем переместить его обратно». Этот процесс перемещения его вперед-вперед можно рассматривать как указание центра вращения. Это на самом деле математические «трюки», которые вы применяете.

3 голосов
/ 02 октября 2011

Всегда ли происходит вращение вокруг начала координат (0,0,0)?

Действительно, так оно и есть.

Всегда ли перевод происходит относительнок предыдущему переводу?

Увеличивает ли масштаб размер осей координат?

Это требует некоторого объяснения: OpenGL и многие другие программы, работающие с данными геометрии, не создают списокцепные преобразования.Они поддерживают одну однородную матрицу преобразования.

«Добавление» преобразования выполняется путем умножения текущей матрицы преобразования на матрицу преобразования, описывающую «следующее» преобразование, заменяя старое преобразование,Это также означает, что составная матрица преобразования, например, то, что в итоге получается в представлении модели OpenGL, также может применяться в качестве преобразования.

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

Так как же выглядит такая матрица преобразования?Например:

Xx Yx Zx Tx
Xy Yy Zy Ty
Xz Yz Zz Tz
_x _y _z  w

Возможно, вы заметили, что есть 3 основных столбца, обозначенных заглавными буквами X, Y, Z. Эти столбцы образуют векторы.А в случае трехмерных преобразований это векторы base системы координат относительно того, к которому применяется преобразование.Однако векторы дают только «направления» и длину.Так что также необходима относительная точка начала новой системы координат, и это то, что содержит вектор Т.

Большую часть времени _x = _y = _z = 0 и w = 1

Преобразование геометрической точки происходит путем умножения вектора точек на матрицу.Пусть такая матрица будет M, точка p, тогда

p' = M * p

Теперь предположим, что мы преобразовываем цепочки:

p'' = M' * p' = M' * M * p

Мы можем подставить M_ = M' * M, поэтому

p'' = M_ * p

Легко видеть, что мы можем связать это сколь угодно долго

Чтобы ответить на два ваших последних вопроса: Преобразования (не только переводы) сделать цепочку .И да, применение масштабирующего преобразования «масштабирует» оси.

И чтобы устранить некоторые общие недоразумения: OpenGL - это не граф сцены, он не имеет дело с «объектами», а просто списками геометрии.glScale, glTranslate, glRotate не преобразуют объекты, а «объединяют» операции преобразования.

0 голосов
/ 02 октября 2011

кто-то с большим опытом наверняка укажет вам хороший учебник, но ваш вопрос отражает то, что вы не понимаете 3D графический конвейер и более точно концепцию матрицы проекции (у меня может быть неправильное название здесь, так как я изучал этот возраст назад по-французски lol).

В основном, когда вы применяете вращение / перевод / масштабирование, вы модифицируете тот же самый матикс

для этого, когда вы каждая операция изменяет существующее состояние. Например, если выполнить вращение, то перевод даст вам другой результат, чем перевод, а не вращение (попробуйте выполнить солнечную систему, Солнце, Землю, Луну, это поможет вам понять)

относительно ваших вопросов:

  • Нет, базовое вращение не всегда происходит в 0,0,0. например, если вы сначала переведете на 2,3,4, то поворот произойдет за 2,3,4.

  • простой ответ - да, вы перемещаете свою матрицу из ее последней позиции (см. Мой комментарий в конце для не простого ответа ^^)

  • масштабирование повлияет на все преобразования, сделанные после. пример шкалы 1,2,2 с последующим переводом 2,3,4 можно рассматривать как глобальный перевод 2,6,8

теперь не так просто: как объяснено каждое изменение будет зависеть от предыдущих изменений (пример шкалы) Также есть много способов сделать то же самое или изменить поведение, например: добиться абсолютного перевода можно сделать вот так -переведите -создать объект -indentity (сбросить матрицу до 0) -translate2 -создать объект2

Мой совет - читать учебники, а также глобальные блоги по программированию 3D или книгу (красная книга хороша, когда вы начинаете)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...