OpenGL - glm 转换和比例合成
OpenGL - glm translation and scale composition
我有一个程序,我在其中显示了一个对象。
首先,我从文件中加载位置 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 并在缩放中相乘)?
Am I composing transformations in the wrong way (adding to x,y,z in translation and multiplying in scalings)?
是的,这是错误的,因为您的翻译实际上也是按比例缩放的。更好的选择是简单地从模型矩阵中提取比例和平移。翻译可以在 w 列(最右边的列)中找到,比例可以在左上角的 3×3 子矩阵中找到;简单的情况只是对角线元素,但是如果应用了旋转,您必须确定主轴(https://en.wikipedia.org/wiki/Principal_axis_theorem)或者只是侥幸它并简单地采用列向量的长度进行缩放。
我有一个程序,我在其中显示了一个对象。 首先,我从文件中加载位置 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 并在缩放中相乘)?
Am I composing transformations in the wrong way (adding to x,y,z in translation and multiplying in scalings)?
是的,这是错误的,因为您的翻译实际上也是按比例缩放的。更好的选择是简单地从模型矩阵中提取比例和平移。翻译可以在 w 列(最右边的列)中找到,比例可以在左上角的 3×3 子矩阵中找到;简单的情况只是对角线元素,但是如果应用了旋转,您必须确定主轴(https://en.wikipedia.org/wiki/Principal_axis_theorem)或者只是侥幸它并简单地采用列向量的长度进行缩放。