缩放,旋转,翻译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个向量的对象结构/类: positionforwardup (这很像使用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

上一篇: Scale, rotate, translate w. matrices in openGl ES 2.0

下一篇: Translation after rotation