При использовании матриц преобразования, как преобразовать ориентацию и масштабирование из глобальной системы отсчета в локальную?

#c #matrix #transform #glm-math

#c #матрица #преобразовать #glm-math

Вопрос:

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

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

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

 void Transform::setGlobalPosition(const glm::vec3amp; newPos)
{
    glm::vec4 nlp = glm::vec4(newPos, 1.0f);
    if (m_hasParent) {
        // This gets the parent transform from the Entity-Component System.
        autoamp; p = p_registry->get<Transform>(m_parent);

        nlp = glm::inverse(p.m_globalTransformM) * nlp;
    }

    setPosition(nlp);
}

void Transform::alterGlobalPosition(const glm::vec3amp; deltaPos)
{
    glm::vec4 nlp = glm::vec4(m_globalPosition   deltaPos, 1.0f);
    if (m_hasParent) {
        // This gets the parent transform from the Entity-Component System.
        autoamp; p = p_registry->get<Transform>(m_parent);

        nlp = glm::inverse(p.m_globalTransformM) * nlp;
    }
        setPosition(nlp);
}
  

Однако я абсолютно не знаю, как выполнить то же самое для следующего.

 // Transform member functions.
void setGlobalScale(const glm::vec3amp; newScale);
void alterGlobalScale(const glm::vec3amp; deltaScale);
void setGlobalOrientation(const glm::quatamp; newOri);
void alterGlobalOrientation(const glm::quatamp; deltaOri);
  

Координаты положения просты, но как подойти к проблеме поворотов и масштабирования? Любая помощь была бы высоко оценена.

Комментарии:

1. Вы можете получить лучшие результаты, задав в math.stackexchange.com поскольку эта проблема полностью математическая.

2. @NicolBolas Я понятия не имею, что вы имеете в виду под этим. Как демонстрирует приведенный мной фрагмент кода, это вполне возможно сделать для position, и я не вижу причин, по которым это не должно быть возможным для orientation и scale. Для этого может потребоваться доступ к родительским преобразованиям, возможно, рекурсивно, пока он не достигнет вершины иерархии, если вы это имеете в виду?