Android 缩放、旋转、平移w。openGl ES 2.0中的矩阵
我正在使用OpenGL ES 2.0,并尝试使用一些方法来构建我的对象类,以旋转/平移/缩放它们 我只是在0,0,0中设置对象,然后将其移动到屏幕上所需的位置。下面是我分别移动它的方法。之后,我运行buildObjectModelMatrix将所有矩阵传递到一个objectMatrix中,这样我就可以获取顶点并将它们与modelMatrix/objectMatrix相乘,然后进行渲染 我认为正确的是,我必须按以下顺序乘以矩阵: [比例]x[旋转]x[平移] -> [temp]x[翻译] -> [对象矩阵] 我找到了一些文献。也许我会在几分钟内得到它,如果我愿意,我会更新它 已解决: 整个过程中的问题是,如果在翻译之前进行缩放,那么翻译距离就会有所不同!将矩阵相乘的正确代码应该是(如果我错了,请纠正我) 使用此选项,首先进行平移和旋转。然后可以缩放对象Android 缩放、旋转、平移w。openGl ES 2.0中的矩阵,android,matrix,opengl-es,matrix-multiplication,Android,Matrix,Opengl Es,Matrix Multiplication,我正在使用OpenGL ES 2.0,并尝试使用一些方法来构建我的对象类,以旋转/平移/缩放它们 我只是在0,0,0中设置对象,然后将其移动到屏幕上所需的位置。下面是我分别移动它的方法。之后,我运行buildObjectModelMatrix将所有矩阵传递到一个objectMatrix中,这样我就可以获取顶点并将它们与modelMatrix/objectMatrix相乘,然后进行渲染 我认为正确的是,我必须按以下顺序乘以矩阵: [比例]x[旋转]x[平移] -> [temp]x[翻译] -> [
使用多个对象进行测试。。。所以我希望这能有所帮助:)你知道这是大多数人在开始处理矩阵运算时最常见的问题。矩阵乘法是如何工作的,就好像你从对象第一人称视图中看到了一些命令:例如,如果你从
(0,0,0)
开始朝正X轴,而向上将是正Y轴,那么translate(a,0,0)
将意味着“向前”,translate(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个向量时,你可以简单地使用三角法或你的矩阵工具设置一个特定的位置或旋转,方法是将向量与矩阵相乘,而不是将矩阵与矩阵相乘。或者您可以在内部(第一人称)与他们合作,例如“前进”将按位置=位置+位置*前进*比例执行,左转将围绕向上
向量旋转向前
向量。不管怎样,我希望你能理解如何操纵这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
请注意,行-列顺序可能会根据您使用的内容而变化
我希望这能让你更好地理解
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);
}
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