OpenGL:组合Translate / Rotate / Scale矩阵还是将它们分开?

时间:2012-07-31 18:48:24

标签: opengl model matrix

在我的opengl应用程序中,我有一个GameObject类来描述模型 每个模型都有一个矩阵来描述其平移/旋转/比例 每当我想翻译/旋转/缩放时,我只需要打电话 类似于Model_Matrix-> translate(dx,dy,dz),它直接在模型矩阵上运行 从而彻底改变它。 所以首先我想知道,这是正确的方法吗?因为很多文章在线 讨论三个矩阵,平移,旋转和缩放,然后将它们相乘以创建变换矩阵。我只使用一个 所有的计算。

任何人都可以对这个问题有所了解,因为现在,我很困惑

注意:我确实知道一些矩阵数学,尽管

3 个答案:

答案 0 :(得分:0)

我建议将变换保持为矩阵(每个对象),因为 - 如果单独保留它们,则会引入关于执行这些操作的顺序的隐式知识(因此可能会产生不同的结果)。

防止变换的隐式排序咬住你的一种方法是使用一个类说 - TransformGroup,它可以包含任意数量的TranslateTransform,RotateTransform和ScaleTransform,每个都允许你修改和检查各个属性。要查看此方法的示例,请查看here

答案 1 :(得分:0)

如果你真的只需要矩阵本身,那么简单地维护一个矩阵就没有错。如果您想要进行相机转换等操作,这可能会变得棘手。

想象一下,您有一个矩阵A(之前)和一个矩阵B(之后),并希望您的程序能够从A视角连续移动相机(或对象)到B视角。如果只有一个矩阵来确定每个位置,这很难(特别是,不是由纯矩阵代数唯一确定)。

但是,如果您确实单独维护缩放,旋转和平移,那么完全不使用矩阵,但保持eyecenterup向量可能是合适的根据{{​​3}}函数。

答案 2 :(得分:0)

只有一个矩阵的一个缺点是操作相互影响。即如果你做一个比例(2,2,2),而不是翻译(2,2,2),你的模型将在everey轴上移动 4 ,而不是你想象中的两个。 轮换也有同样的问题,但更难理解;)

接下来的问题是scale()和rotate()总是使用原点,这意味着如果要旋转或缩放,则必须考虑当前平移的位置,并使用此值进行计算。这很难做到。

要找到如何缩放/平移/旋转的策略,您必须考虑在对象生命的哪个阶段想要做什么。建筑与后来的运动。

但是,您可以通过将现有矩阵操作粘在一起来实现“更好”的矩阵操作。 i.E伪代码

scale(float[3] s, float[3] originPoint)

将实现为

translate(-originPoint); scale(s); translate(originPoint);

rotate(float alpha, float[3] p1, float[3] p2)

将实现为

translate(-p1); rotate(alpha, p2-p1); translate(p1);

并且,根本不使用scale()可以让生活更轻松。

干杯,弗兰克