C++ OpenGL-glm转换与尺度合成

C++ OpenGL-glm转换与尺度合成,c++,opengl,scaling,glm-math,C++,Opengl,Scaling,Glm Math,我有一个程序,在其中我显示一个对象。 首先,我从文件中加载位置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 =

我有一个程序,在其中我显示一个对象。 首先,我从文件中加载位置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,在缩放中进行乘法)

我是否以错误的方式编写转换(在平移中添加x、y、z,在缩放中进行乘法)


是的,这是错误的,因为你的翻译实际上也是按比例的。更好的选择是简单地从模型矩阵中提取比例和平移。平移可以在w列(最右边的列)中找到,比例可以在左上角的3×3子矩阵中找到;简单的情况是对角线元素,但如果应用了旋转,则必须确定长轴()或者只是侥幸获得列向量的长度作为比例。

我不确定您到底要保存到文件中还是从文件中加载什么,因为您没有告诉我们-很有可能会在那里发现错误-但也值得指出的是,如果您先进行转换,则转换是不可交换的然后是一个量表,在一般情况下,结果将不同于先做一个量表,然后做一个翻译。如果要将变换保存到文件,请保存完整的变换矩阵,而不是所有平移和所有比例的总和。是的,还有旋转,。我想我将只存储modelMAtrix(16个数字而不是10/比例,平移+四元数用于旋转;/)