0

在我的 opengl 应用程序中,我有一个 GameObject 类来描述模型,每个模型都有一个矩阵来描述它的平移/旋转/缩放,每当我想平移/旋转/缩放时,我只需调用类似 Model_Matrix->translate (dx, dy, dz) 直接对模型矩阵进行操作,从而永久改变它。所以首先我想知道,这是正确的方法吗?因为网上很多文章都讲了三个矩阵,平移、旋转和缩放,然后将它们相乘以创建变换矩阵。我只使用一个进行所有计算。

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

注意:我确实知道一些矩阵数学,但只是一点点

4

3 回答 3

0

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

防止转换的隐式排序对您不利的一种方法是使用一个类,比如 TransformGroup,它可以包含任意数量的 TranslateTransform、RotateTransform 和 ScaleTransform,每个都允许您修改和检查单个属性。要查看此方法的示例,请查看此处

于 2012-07-31T20:43:27.590 回答
0

如果您真的只需要矩阵本身,那么简单地维护一个矩阵并没有错。但是,如果您想做诸如相机转换之类的事情,这可能会变得很棘手。

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

但是,如果您确实分别维护缩放、旋转和平移,则完全不使用矩阵,而是根据gluLookAt函数维护eye,center和向量可能是合适的。up

于 2012-08-16T12:36:27.350 回答
0

只有一个矩阵的一个缺点是操作会相互影响。iE 如果你做一个 scale(2,2,2),而不是一个 translate(2,2,2),你的模型将在 everey 轴上移动4,而不是像你想象的那样移动 2。旋转也有同样的问题,但更难理解;)

下一个问题是 scale() 和 rotate() 总是使用原点,这意味着如果你想旋转或缩放,你必须考虑你当前的平移在哪里,并用这个值进行计算。这很难做到。

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

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

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() 会让生活更轻松。

干杯,弗兰克

于 2013-01-07T18:01:45.210 回答