#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. Для этого может потребоваться доступ к родительским преобразованиям, возможно, рекурсивно, пока он не достигнет вершины иерархии, если вы это имеете в виду?