【问题标题】:OpenGL - glm translation and scale compositionOpenGL - glm 平移和比例合成
【发布时间】:2017-01-12 01:33:05
【问题描述】:

我有一个程序,我在其中显示一个对象。 首先,我从文件中加载位置 p.x、p.y、p.z 并缩放 s.x、s.y、s.z。 然后我将它们应用到 4x4 ModelMatrix 并对其执行许多平移和缩放操作。

当我第一次加载对象时,我使用p 和s 值:

modelMatrix = glm::mat4(1.0));

/*Translations*/
modelMatrix = glm::translate(modelMatrix, glm::vec3(p.x, p.y, p.z));
modelMatrix = glm::scale(modelMatrix, glm::vec3(s.x, s.y, s,z));

在程序执行过程中,我执行缩放和平移操作,然后将 p 和 s 值保存回文件。

void Display::Translate( double x, double y, double z)
{
    modelMatrix = glm::translate(modelMatrix, glm::vec3(x,y,z));
    p.x += x;   //that way p is composition of all translations
    p.y += y;
    p.z += z;
} 

void Display::Scale( double x, double y, double z)
{
    modelMatrix = glm::scale(modelMatrix, glm::vec3(x,y,z));
    s.x *= x;    //that way s is composition of all scalings
    s.y *= y;
    s.z *= z;
}

现在的问题是再次加载(再次运行程序)后,对象不在我保存它们的地方,而是一些相当随机的地方。 (尤其是翻译)。 我是否以错误的方式组合变换(在平移中添加 x、y、z 并在缩放中相乘)?

【问题讨论】:

  • 我不确定您究竟要从文件中保存和加载什么,因为您没有费心告诉我们 - 很有可能在那里找到您的错误 - 但它也值得指出转换不是可交换的 - 如果您先进行平移然后进行比例尺,则结果在一般情况下将不同于先进行比例尺然后进行平移。如果要将转换保存到文件中,请保存完整的转换矩阵,而不是所有平移的总和和所有比例的总和。

标签: c++ opengl scaling glm-math


【解决方案1】:

我是否以错误的方式组合变换(在平移中添加 x、y、z 并在缩放中相乘)?

是的,这是错误的,因为您的翻译实际上也是按比例缩放的。更好的选择是简单地从模型矩阵中提取比例和平移。平移可以在 w 列(最右边的列)中找到,比例可以在左上角的 3×3 子矩阵中找到;微不足道的情况只是对角线元素,但如果应用了旋转,您必须要么确定主轴 (https://en.wikipedia.org/wiki/Principal_axis_theorem),要么只是侥幸获得它并简单地采用列向量的长度进行缩放。

【讨论】:

  • 是的,还有旋转,。我想我将只存储 modelMAtrix (16 个数字而不是 10 / 比例,平移 + 四元数进行旋转;/)
猜你喜欢
  • 2012-04-12
  • 2020-03-31
  • 1970-01-01
  • 1970-01-01
  • 2012-12-14
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
相关资源
最近更新 更多