适当的矩阵乘法用于旋转/平移

GLE*_*LES 19 android opengl-es linear-algebra opengl-es-2.0

关于任意点的旋转和平移

为了旋转/平移物体(仅绕z轴旋转和仅在xy平面上平移)不仅仅是wrt到全局中心(设备中心)而且还有其他任意点,我创建了一个算法,这是正确的(因为所有高级我已经讨论过的编码器认为它是正确的),但是在实现中删除不需要的翻译需要花费很多时间(算法是在8月4日创建的,并且是在同一天实现的,从那以后代码被修改了15次).

这是http://www.pixdip.com/opengles/transform.php#ALGO1的实现

产生不希望的翻译的代码行在里面:

private static void updateModel(int upDown, float xAngle, float yAngle, float zAngle) {

并列出如下:

  1. Matrix.multiplyMV(GLES20Renderer._uBodyCentreMatrix, 0, GLES20Renderer._ModelMatrixBody, 0, GLES20Renderer._uBodyCentre, 0);

  2. objX = GLES20Renderer._uBodyCentreMatrix[0];

  3. objY = GLES20Renderer._uBodyCentreMatrix[1];

即使进行了以下更改,沿着+ Y的不期望的转换仍然存在:

  1. objY = _uBodyCentreMatrix[1] - _uBodyCentre[1];

  2. zAngle = 0;

  3. ds = 0;

由于Renderer类的这些字段,-0.545867f每次调用时都会将值添加到Y坐标onDrawFrame():

private static final float[] _uBodyCentre = new float[]{-0.019683f, -0.545867f, -0.000409f, 1.0f};

protected static float[] _uBodyCentreMatrix = new float[4];

http://www.pixdip.com/opengles/transform.php#FIELDS中

我需要帮助才能理解为什么不希望的翻译发生,转换的确切错误,或者算法是错误的.

万向锁可以成为一个问题吗?

请不要让我执行/练习更简单的示例,因为我准备了Renderer类来进行关于全局z轴的旋转/转换,而我所进入的这个新任务使用相同的类,稍作修改 updateModel()

(请注意,所需的旋转仅约为z轴,仅在xy平面内平移)

[API 10-> 15]

实际的渲染器类有两个对象:坦克炮塔(喷嘴)和坦克体,而炮塔(喷嘴)有不希望的向前平移,身体有不希望的向后平移

关于设备中心翻译/轮换的Apk(在opengles 2.0中很容易制作):http://www.pixdip.com/opengles/global.php

关于任意点的翻译/旋转的Apk(沿+ Y有不希望的翻译):http: //www.pixdip.com/opengles/local.php

apk用于翻译/轮换任意点,其中up​​dateModel()仅被调用4次:http://www.pixdip.com/opengles/limited.php 和所需代码(应该足够)在这里:http:// www.pixdip.com/opengles/code.php

物体的一部分(喷嘴/炮塔,车身)目前正在围绕它们自己的中心而不是物体的中心(这是_playerCentre)旋转,我稍后会修改它.

我试图演示逻辑http://www.pixdip.com/opengles/images.php

Jos*_*and 5

看起来问题是:

Matrix.multiplyMV(GLES20Renderer._uBodyCentreMatrix, 0, GLES20Renderer._ModelMatrixBody, 0, GLES20Renderer._uBodyCentre, 0);
Run Code Online (Sandbox Code Playgroud)

Matrix.multiplyMV是一种将4元素向量乘以4x4矩阵并将结果存储在4元素列向量中的方法.在矩阵表示法中:result = lhs x rhs.如果resultVector元素与lhsMatrix或rhsVector元素重叠,则resultVector元素值是未定义的.

我不认为你发布了所有代码,所以我无法确认,但是根据你的'_BodyCentreMatrix'的命名判断你可能遇到错误,因为它不是4元素列向量.

我假设'_ModelMatrixBody'是4x4矩阵,'_uBodyCentre'是4元素向量,否则这些也可能有问题.


GLE*_*LES 4

[已解决]java浮点错误是唯一的原因

M = T * I * T[inv]

没有产生单位矩阵,因此不使用 Matrix.MultiplyMM

我输入矩阵之间的所有乘法