【问题标题】:Using glm to create a model matrix based off of three vec3使用 glm 创建基于三个 vec3 的模型矩阵
【发布时间】:2015-10-17 06:18:30
【问题描述】:

所以我想取三个变量

glm::vec3 Translation;
glm::vec3 Rotation; //Euler angles
glm::vec3 Scale;

并制作一个模型视图矩阵,这样每次这三个向量之一发生变化时,我都可以向着色器传递一个新的模型视图矩阵。

我的问题是我只知道如何告诉 glm 如何一次翻译/旋转一个参数。这不仅可能降低处理器效率,而且我怀疑我的欧拉角会遇到万向节锁。

我想知道你是否可以帮助我在 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
}

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

非常感谢!

【问题讨论】:

  • 为什么不创建一个 X、一个 Y 和一个 Z 旋转并将它们连接(相乘)起来。类似 rX * rY * rZ * rS * rT。

标签: c++ matrix glm-math


【解决方案1】:

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

嗯,你可能应该这样做。但它们并不总是最好的选择,如果您想要一个简单、有效的解决方案,请暂时使用矩阵。

这可能是处理器效率较低

我认为您不应该看到明显的差异。理论上,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));

【讨论】:

  • 但另一方面 - 我可以告诉你,他们的代码(尤其是矩阵转换)最多是平均的。你能列举他们能做什么更好?
  • EIS 支持。 glm 使用的唯一一个是SSE2。在我们的软件中,各种矩阵运算非常密集,在实现了我们自己的数学库并支持从SSE2AVX2 的所有 EIS 后,我们获得了出色的性能提升。是的 - 它应该是一个通用库,是的 - 我们的用例非常具体,是的 - 也许我的“最多平均值”是不公平且过于挑剔的。但是医生的声明说,glm uses intrinsics and SIMD instructions whenever possible 对我来说很荒谬。
  • 不要误会我的意思——它是一个真的很棒的软件,我已经使用了很多年了。我只是发现,它在一些繁重的场景中是不可用的——但不是因为糟糕的设计或错误的实现。而是因为缺少一些东西,我花了几天时间来实现。
  • 我自己写了自己的矩阵库,我没有使用glm。我只是想知道是否有比 EIS 支持更多的东西。
  • @Matesusz Grzejek 非常感谢您对此的解释。给定欧拉角,我仍然有点卡在旋转上。如果我们一次旋转一个角度轴会不会有问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-03
相关资源
最近更新 更多