У меня есть структура Sphere, которая выглядит, как этотПрименить преобразование матрицы в сфере
struct Sphere {
vec3 _center;
float _radius;
};
Как применить матрицу преобразования 4x4 в этой сфере? Матрица может содержать масштабный коэффициент, поворот (который, очевидно, не повлияет на сферу) и перевод.
Текущий подход, который я использую, содержит три метода length()
(в них есть sqrt()
), которые довольно медленны.
glm::vec3 extractTranslation(const glm::mat4 &m)
{
glm::vec3 translation;
// Extract the translation
translation.x = m[3][0];
translation.y = m[3][1];
translation.z = m[3][2];
return translation;
}
glm::vec3 extractScale(const glm::mat4 &m) //should work only if matrix is calculated as M = T * R * S
{
glm::vec3 scale;
scale.x = glm::length(glm::vec3(m[0][0], m[0][1], m[0][2]));
scale.y = glm::length(glm::vec3(m[1][0], m[1][1], m[1][2]));
scale.z = glm::length(glm::vec3(m[2][0], m[2][1], m[2][2]));
return scale;
}
float extractLargestScale(const glm::mat4 &m)
{
glm::vec3 scale = extractScale(m);
return glm::max(scale.x, glm::max(scale.y, scale.z));
}
void Sphere::applyTransformation(const glm::mat4 &transformation)
{
glm::vec4 center = transformation * glm::vec4(_center, 1.0f);
float largestScale = extractLargestScale(transformation);
set(glm::vec3(center)/*/center.w */, _radius * largestScale);
}
Интересно, знает ли кто-нибудь более эффективный способ сделать это?
«Интересно, знает ли кто-нибудь более эффективный способ сделать это?» http://codereview.stackexchange.com/ поможет – bholagabbar
Что вы подразумеваете под «неравномерным»? Почему преобразование радиуса с наибольшим масштабом не является правильным? – Pilpel
См. Ответ, который я дал. – legends2k