缩放,旋转,翻译w。 矩阵在openGl ES 2.0中
我正在使用OpenGL ES 2.0,并试图用一些方法构建我的对象类来旋转/翻译/缩放它们。
我只需在0,0,0中设置我的对象,然后将其移动到屏幕上的所需位置。 以下是我的方法来分开移动它。 之后,我运行buildObjectModelMatrix将所有矩阵传递到一个objectMatrix中,所以我可以取顶点并将它们与我的modelMatrix / objectMatrix相乘,然后渲染它。
我认为是对的,我必须按照这个顺序来增加矩阵:
[规模]×[旋转]×[翻译]
- >
[温度]×[翻译]
- >
[objectMatrix]
我找到了一些文献。 也许我会在几分钟内得到它,如果我愿意,我会更新它。
开始Android 3D
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轴, up
将是正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
,左转则围绕up
向量旋转forward
向矢量。 无论如何,我希望能够了解如何处理这些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
只要注意行列顺序可能会改变,这取决于你正在使用什么。
我希望这能给你一些更好的理解...
链接地址: http://www.djcxy.com/p/81823.html