我正在使用 OpenGL ES 2.0 并尝试使用一些方法来构建我的对象类来旋转/平移/缩放它们。
我只是在 0,0,0 中设置我的对象,然后将它移动到屏幕上的所需位置。以下是我单独移动它的方法。之后,我运行 buildObjectModelMatrix 将所有矩阵传递到一个 objectMatrix,这样我就可以获取顶点并将它们与我的 modelMatrix/objectMatrix 相乘,然后进行渲染。
我认为是正确的,我必须按以下顺序乘以我的矩阵:
[缩放]x[旋转]x[平移]
->
[温度]x[翻译]
->
[对象矩阵]
我找到了一些文献。也许我会在几分钟内得到它,如果我愿意,我会更新它。
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,0,0)
开始,面向正 X 轴和 向上
将是正 Y 轴然后翻译 (a,0,0)
将意味着“前进”,翻译 (0,0,a)
将意味着“向左走”,旋转 (a, 0, 1, 0)
表示“向左转”...
因此,如果在您的情况下,您按 3
单位缩放,旋转 90
度,然后按 (2,0,0)
平移发生的事情是你首先将自己放大 3
,然后转动 90
度,这样你现在面对的正 Z
仍然很大。然后你向前移动 2
个单位,在你自己的坐标系中测量,这意味着你实际上会到达 (0,0,2*3)
。因此,您最终会在 (0,0,6)
处朝正 Z
轴看。
我相信这种方式是最好的,能够想象在处理此类操作时会发生什么。并且在矩阵运算顺序出现错误时可能会挽救您的生命。
您应该知道,虽然这种矩阵操作在开始使用 3D 场景时很正常,但您应该尽快尝试迁移到更好的系统。我主要使用的是一个包含 3 个向量的对象结构/类:position
、forward
和 up
(这很像使用 glLookAt
但不完全相同)。因此,当拥有这 3 个向量时,您可以使用三角学或矩阵工具简单地设置特定位置或旋转,方法是将向量与矩阵相乘,而不是将矩阵与矩阵相乘。或者您可以在内部(第一人称)与他们合作,例如“前进”将作为 position = position + position*forward*scale
完成,向左转将旋转 forward
向量围绕 up
向量。无论如何,我希望能够理解如何操纵这 3 个向量以获得所需的效果......所以你需要做的是从这 3 个向量重建矩阵需要生成另一个向量 right
这是一个up
和 forward
的叉积,则模型矩阵包括:
right.x, right.y, right.z, .0
up.x, up.y, up.z, .0
forward.x, forward.y, forward.z, .0
position.x, position.y, position.z, 1.0
请注意,行-列顺序可能会根据您使用的内容而改变。
我希望这能让你更好地理解......
关于android - 缩放、旋转、平移 w。 openGl ES 2.0 中的矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26101130/