使用glm创建一个基于三个vec3的模型矩阵

时间:2015-07-27 06:58:39

标签: c++ matrix glm-math

所以我想尝试三个变量

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
}

我尝试过使用一些四元数数学但是还没有用完。

非常感谢!

1 个答案:

答案 0 :(得分:0)

  

我尝试使用一些四元数数学,但它还没有成功。

嗯,你可能应该。但它们并不总是最佳选择,如果你想要一个简单,有效的解决方案,那么现在就坚持使用矩阵。

  

可能更少的处理器效率

我认为你不应该看到明显的差异。从理论上讲,glm会尽可能使用一些SIMDSSE / 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));