Squeak.ru - шаблоны программирования

Поворот объекта из одной системы координат в другую

Использование библиотеки glm для расчетов. У меня есть сетка, расположенная в локальной системе координат, где оси:

meshUp =      glm::vec3(0, 1, 0);
meshForward = glm::vec3(0, 0, -1);
meshRight =   glm::vec3(1, 0, 0);

и мне нужна матрица, которая будет вращать свои вершины в любую другую новую систему координат с 3 заданными осями, fx:

newUp =       glm::vec3(-0.85, 0.51, -0.08);
newForward =  glm::vec3(0.45, 0.65, -0.61);
newRight =    glm::vec3(-0.26, -0.56, -0.79);

Перевод не требуется, системы координат имеют общее происхождение. Я могу пройти половину пути, например:

glm::vec3 rotationVecForUpAxis = glm::normalize(glm::cross(meshUp, newUp));
float rotationRadiansForUpAxis = acos(glm::dot(meshUp, newUp));

glm::mat4 rotationMatrix = glm::rotate(glm::mat4(), 
                                       rotationRadiansForUpAxis,
                                       rotationVecForUpAxis);

Это работает и вращает сетку так, чтобы ее ось вверх совпадала с осью newUp. Однако меш по-прежнему необходимо вращать вокруг оси newUp, прежде чем ось meshForward меша совместится с осью newForward.

Кто-нибудь знает как это сделать?

20.04.2015


Ответы:


1

Вы могли бы посмотреть математику. Но просто для удовольствия, я собираюсь вывести его здесь.

Предположим, что новые базисные векторы, выраженные в исходной системе координат, таковы:

     [ xnx ]         [ ynx ]         [ znx ]
xn = [ xny ]    yn = [ yny ]    zn = [ zny ]
     [ xnz ]         [ ynz ]         [ znz ]

Вы ищете матрицу M, которая сопоставляет эти векторы с базисными векторами в новой системе координат:

    [ xnx ] = [ 1 ]        [ ynx ] = [ 0 ]        [ znx ] = [ 0 ]
M * [ xny ] = [ 0 ]    M * [ yny ] = [ 1 ]    M * [ zny ] = [ 0 ]
    [ xnz ] = [ 0 ]        [ ynz ] = [ 0 ]        [ znz ] = [ 1 ]

Запись этого в матричной форме дает:

    [ xnx  ynx  znx ] = [ 1  0  0 ]
M * [ xny  yny  zny ] = [ 0  1  0 ]
    [ xnz  ynz  znz ] = [ 0  0  1 ]

Что в свою очередь дает для M:

             [ xnx  ynx  znx ]
M = inverse( [ xny  yny  zny ] )
             [ xnz  ynz  znz ]

Другими словами, матрица является обратной матрицей, столбцами которой являются новые базисные векторы.

Для ротации это становится особенно легко. Матрица, обратная вращению, является транспонированной матрицей. Итак, M — это матрица с новыми базисными векторами в качестве строк:

    [ xnx  xny  xnz ]
M = [ ynx  yny  ynz ]
    [ znx  zny  znz ]

При этом все, что вам нужно, чтобы получить матрицу вращения, — это построить матрицу, которая имеет значения новых базисных векторов в качестве своих строк. Например, если вы используете newRight в качестве оси X, newUp в качестве оси Y и newForward в качестве оси Z, матрица преобразования будет следующей:

[ newRight.x    newRight.y    newRight.z   ]
[ newUp.x       newUp.y       newUp.z      ]
[ newForward.x  newForward.y  newForward.z ]

При построении матрицы имейте в виду, что матрицы для OpenGL обычно хранятся в порядке возрастания столбцов.

21.04.2015
  • Большое спасибо за ответ, это прекрасно работает и намного проще, чем направление, в котором я двигался! 21.04.2015
  • отличный ответ, спасибо, очень легко понять для тех, кто еще не принимал лин-алг! 15.03.2020
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...