OpenGL - glm翻译和规模组合

时间:2016-09-04 14:02:17

标签: c++ opengl scaling glm-math

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

当我第一次加载对象时,我使用ps值:

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并在缩放中添加)?

1 个答案:

答案 0 :(得分:1)

  

我是否以错误的方式编写转换(在翻译中添加x,y,z并在缩放中添加)?

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