我正在使用OpenGL ES 2.0并尝试使用一些方法构建我的对象类来旋转/翻译/缩放它们。
我只是在0,0,0中设置我的对象,然后将其移动到屏幕上的所需位置。以下是我单独移动它的方法。之后我运行buildObjectModelMatrix将所有矩阵传递到一个objectMatrix中,这样我就可以获取顶点并将它们与我的modelMatrix / objectMatrix相乘并随后渲染它。
我认为是对的,我必须按顺序繁殖我的矩阵:
[规模]×[旋转]×[翻译]
- >
[温度]×[翻译]
- >
[objectMatrix]
我找到了一些文献。也许我会在几分钟内得到它,如果我愿意,我会更新它。
http://gamedev.stackexchange.com
setIdentityM(scaleMatrix, 0); setIdentityM(translateMatrix, 0); setIdentityM(rotateMatrix, 0);
public void translate(float x, float y, float z) {
translateM(translateMatrix, 0, x, y, z);
buildObjectModelMatrix();
}
public void rotate(float angle, float x, float y, float z) {
rotateM(rotateMatrix, 0, angle, x, y, z);
buildObjectModelMatrix();
}
public void scale(float x, float y,float z) {
scaleM(scaleMatrix, 0, x, y, z);
buildObjectModelMatrix();
}
private void buildObjectModelMatrix() {
multiplyMM(tempM, 0, scaleMatrix, 0, rotateMatrix, 0);
multiplyMM(objectMatrix, 0, tempM, 0, translateMatrix, 0);
}
解决: 问题在于,如果你在翻译之前进行缩放,你会得到你翻译的距离的差异!用于乘以矩阵的正确代码应该是(如果我错了,请纠正我)
private void buildObjectModelMatrix() {
multiplyMM(tempM, 0, translateMatrix, 0, rotateMatrix, 0);
multiplyMM(objectMatrix, 0, tempM, 0, scaleMatrix, 0);
}
用这个你首先翻译和旋转。之后,您可以缩放对象。
使用多个对象进行测试...所以我希望这有助于:)
答案 0 :(得分:1)
您知道这是大多数人在开始处理矩阵操作时最常见的问题。矩阵乘法如何工作就好像你从对象第一人称视图中获取一些命令:例如,如果你从(0,0,0)
开始面向正X轴而up
将是正Y轴然后翻译{ {1}}意味着"前进",翻译(a,0,0)
意味着"左转",旋转(0,0,a)
意味着"左转" 34; ...
因此,如果在您的情况下,您按(a, 0, 1, 0)
单位缩放,按3
度旋转,然后按90
翻译,那么您首先会按(2,0,0)
的比例放大,然后转3
度,这样你现在面临的积极90
仍然很大。然后按照您自己的坐标系统中测量的Z
个单位前进,这意味着您将实际转到2
。因此,您最终会(0,0,2*3)
看向正(0,0,6)
轴。
我相信这种方式是能够想象在处理此类操作时会发生什么的最佳方式。当矩阵操作顺序出错时,可能会挽救你的生命。
你应该知道,虽然从3D场景开始这种矩阵操作是正常的,但你应该尽快转向更好的系统。我最常用的是拥有一个包含3个向量的对象结构/类:Z
,position
和forward
(这很像使用up
但不完全相同)。因此,当使用这三个矢量时,您可以使用三角函数或矩阵工具简单地设置特定位置或旋转,方法是将矢量与矩阵相乘,而不是使用矩阵。或者你可以在内部(第一人称)与他们合作,例如"前进"将以glLookAt
完成,向左转将围绕position = position + position*forward*scale
向量旋转forward
向量。无论如何,我希望能够理解如何操纵这3个向量以获得期望的效果...所以你需要做的是从这3个向量重建矩阵需要生成另一个向量up
,这是一个交叉乘积right
和up
然后模型矩阵包含:
forward
请注意,行列顺序可能会因您使用的内容而发生变化。
我希望这能让你更好地理解......