android - 缩放、旋转、平移 w。 openGl ES 2.0 中的矩阵

标签 android matrix opengl-es matrix-multiplication

我正在使用 OpenGL ES 2.0 并尝试使用一些方法来构建我的对象类来旋转/平移/缩放它们。

我只是在 0,0,0 中设置我的对象,然后将它移动到屏幕上的所需位置。以下是我单独移动它的方法。之后,我运行 buildObjectModelMatrix 将所有矩阵传递到一个 objectMatrix,这样我就可以获取顶点并将它们与我的 modelMatrix/objectMatrix 相乘,然后进行渲染。

我认为是正确的,我必须按以下顺序乘以我的矩阵:

[缩放]x[旋转]x[平移]

->

[温度]x[翻译]

->

[对象矩阵]

我找到了一些文献。也许我会在几分钟内得到它,如果我愿意,我会更新它。

Beginning 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 轴和 向上 将是正 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 个向量的对象结构/类:positionforwardup(这很像使用 glLookAt 但不完全相同)。因此,当拥有这 3 个向量时,您可以使用三角学或矩阵工具简单地设置特定位置或旋转,方法是将向量与矩阵相乘,而不是将矩阵与矩阵相乘。或者您可以在内部(第一人称)与他们合作,例如“前进”将作为 position = position + position*forward*scale 完成,向左转将旋转 forward 向量围绕 up 向量。无论如何,我希望能够理解如何操纵这 3 个向量以获得所需的效果......所以你需要做的是从这 3 个向量重建矩阵需要生成另一个向量 right 这是一个upforward 的叉积,则模型矩阵包括:

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/

相关文章:

android加载库指定版本而不是通用版本库

r - 在R中创建一个递增的数字同心环矩阵

ios - 如何在 Qualcomm 样本的帧标记上使用 glDrawArrays() 而不是 glDrawElements()

java - AndEngine - 滚动 map 时的 Artifact (TextureOptions 相关)

android - 同线程情况下如何避免GLSurfaceView出现queueEvent

android - 在 editText 中设置一些空间

java - 如何使用服务器刷新身份验证 token

使用 OpenMP 的 C++ 并行平均矩阵

3d - 如何在处理中使用矩阵旋转向量?

android - 在 android 上检查与服务的互联网连接