所以我想尝试三个变量
glm::vec3 Translation;
glm::vec3 Rotation; //Euler angles
glm::vec3 Scale;
制作模型视图矩阵,每当这三个向量中的一个被更改时,我就可以为着色器传递一个新的模型视图矩阵。
我的问题是我只知道如何告诉glm如何一次转换/旋转一个参数。这不仅可能会降低处理器的效率,而且我怀疑我会因为我的欧拉角而遇到Gimbal锁定。
我想知道你是否可以帮我在glm中创建一个函数,创建一个准备好去着色器的模型矩阵。这有点像我认为的样子。顺便说一下,我在c ++。
glm::vec3 Translation;
glm::vec3 Rotation; //Euler angles
glm::vec3 Scale;
glm::mat4 ModelMatrix
void UpdateModelMatrix()
{
ModelMatrix = glm::mat4(); //set it to an identity matrix
//Code stuffs
//At this point the mat4 will reflect the scale rotation and translations above
}
我尝试过使用一些四元数数学但是还没有用完。
非常感谢!
答案 0 :(得分:0)
嗯,你可能应该。但它们并不总是最佳选择,如果你想要一个简单,有效的解决方案,那么现在就坚持使用矩阵。我尝试使用一些四元数数学,但它还没有成功。
可能更少的处理器效率
我认为你不应该看到明显的差异。从理论上讲,glm
会尽可能使用一些SIMD(SSE
/ AVX
)内在函数。但另一方面 - 我可以告诉你,他们的代码(尤其是矩阵变换)最多只是平均值。
现在,您应该对这些功能感兴趣:
tmat4x4 rotate(tmat4x4 const & m, T angle, tvec3 const & v)
tmat4x4 scale(tmat4x4 const & m, tvec3 const & v)
tmat4x4 translate(tmat4x4 const & m, tvec3 const & v)
以这种方式使用它们:
void UpdateModelMatrix()
{
ModelMatrix = glm::mat4();
ModelMatrix = glm::translate(ModelMatrix, Translation);
ModelMatrix = glm::scale(ModelMatrix, Scale);
ModelMatrix = glm::rotate(ModelMatrix, rotAngle, Rotation);
}
您可能希望按此顺序执行操作 - 请记住,旋转应用于最后(或至少在翻译之后 - 否则对象将以不同于预期的方向移动)。
然后,只需将您的MM发送到着色器:
glUniformMatrix4fv(location, 1, GL_FALSE, glm::value_ptr(ModelMatrix));