任何轴上的三维旋转都会导致某些但并非所有Android设备上的网格扭曲

任何轴上的三维旋转都会导致某些但并非所有Android设备上的网格扭曲,android,rotation,gles20,Android,Rotation,Gles20,我目前正在为Android开发一个3D游戏引擎,在我的Lenovo TAB 10上一切都很好,但是旋转任何轴都会导致网格在旋转过程中变平(倾斜)。我不知道从哪里开始寻找,因为它在一台设备上工作。有什么想法吗 我围绕任意轴(向右、向上和向前)相对于对象本身旋转所有对象。然后将旋转轴放入旋转矩阵中,如下所示: mMatRotate = new cMatrix4( mvRight.mX, mvUp.mX, mvForward.mX, 0.0f, mvR

我目前正在为Android开发一个3D游戏引擎,在我的Lenovo TAB 10上一切都很好,但是旋转任何轴都会导致网格在旋转过程中变平(倾斜)。我不知道从哪里开始寻找,因为它在一台设备上工作。有什么想法吗

我围绕任意轴(向右、向上和向前)相对于对象本身旋转所有对象。然后将旋转轴放入旋转矩阵中,如下所示:

mMatRotate = new cMatrix4(
        mvRight.mX,     mvUp.mX,    mvForward.mX,   0.0f,
        mvRight.mY,     mvUp.mY,    mvForward.mY,   0.0f,
        mvRight.mZ,     mvUp.mZ,    mvForward.mZ,   0.0f,
        0.0f,           0.0f,       0.0f,           1.0f);
cMatrix4(   float a, float b, float c, float d,
            float e, float f, float g, float h,
            float i, float j, float k, float l,
            float m, float n, float o, float p )
{
    mfMatrixData[0] = a;    mfMatrixData[1] = b;    mfMatrixData[2] = c;    mfMatrixData[3] = d;
    mfMatrixData[4] = e;    mfMatrixData[5] = f;    mfMatrixData[6] = g;    mfMatrixData[7] = h;
    mfMatrixData[8] = i;    mfMatrixData[9] = j;    mfMatrixData[10] = k;   mfMatrixData[11] = l;
    mfMatrixData[12] = m;   mfMatrixData[13] = n;   mfMatrixData[14] = o;   mfMatrixData[15] = p;
}
实际矩阵定义如下:

mMatRotate = new cMatrix4(
        mvRight.mX,     mvUp.mX,    mvForward.mX,   0.0f,
        mvRight.mY,     mvUp.mY,    mvForward.mY,   0.0f,
        mvRight.mZ,     mvUp.mZ,    mvForward.mZ,   0.0f,
        0.0f,           0.0f,       0.0f,           1.0f);
cMatrix4(   float a, float b, float c, float d,
            float e, float f, float g, float h,
            float i, float j, float k, float l,
            float m, float n, float o, float p )
{
    mfMatrixData[0] = a;    mfMatrixData[1] = b;    mfMatrixData[2] = c;    mfMatrixData[3] = d;
    mfMatrixData[4] = e;    mfMatrixData[5] = f;    mfMatrixData[6] = g;    mfMatrixData[7] = h;
    mfMatrixData[8] = i;    mfMatrixData[9] = j;    mfMatrixData[10] = k;   mfMatrixData[11] = l;
    mfMatrixData[12] = m;   mfMatrixData[13] = n;   mfMatrixData[14] = o;   mfMatrixData[15] = p;
}
在my draw()函数中,如下所示:

Matrix.setIdentityM(mMesh.mModelMatrix, 0);
Matrix.translateM(mMesh.mModelMatrix, 0, mvLocation.mX, mvLocation.mY, mvLocation.mZ);
Matrix.scaleM(mMesh.mModelMatrix, 0, mfScale, mfScale, mfScale);
Matrix.multiplyMM(mMesh.mModelMatrix, 0, mMesh.mModelMatrix, 0, mMatRotate.getFloatArray(), 0);
mMesh.draw(viewMatrix, projMatrix, Renderer);
Matrix.multiplyMM(mtrx, 0, viewMatrix, 0, mModelMatrix, 0);
GLES20.glUniformMatrix4fv(mMVMatrixHandle, 1, false, mtrx, 0);
Matrix.multiplyMM(mtrx, 0, projMatrix, 0, mtrx, 0);
GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mtrx, 0);
最后的变换如下所示:

Matrix.setIdentityM(mMesh.mModelMatrix, 0);
Matrix.translateM(mMesh.mModelMatrix, 0, mvLocation.mX, mvLocation.mY, mvLocation.mZ);
Matrix.scaleM(mMesh.mModelMatrix, 0, mfScale, mfScale, mfScale);
Matrix.multiplyMM(mMesh.mModelMatrix, 0, mMesh.mModelMatrix, 0, mMatRotate.getFloatArray(), 0);
mMesh.draw(viewMatrix, projMatrix, Renderer);
Matrix.multiplyMM(mtrx, 0, viewMatrix, 0, mModelMatrix, 0);
GLES20.glUniformMatrix4fv(mMVMatrixHandle, 1, false, mtrx, 0);
Matrix.multiplyMM(mtrx, 0, projMatrix, 0, mtrx, 0);
GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mtrx, 0);

我有点被这件事缠住了。任何建议都会很有帮助。

好的,我自己解决了这个问题,如果其他人感兴趣或遇到类似问题,我会把它贴在这里。归根结底,联想TAB 10完全依赖硬件,而三星Galaxy Core Prime则不依赖硬件。问题在于:

Matrix.multiplyMM(mMesh.mModelMatrix, 0, mMesh.mModelMatrix, 0, mMatRotate.getFloatArray(), 0);
在硬件中,似乎可以执行矩阵乘法并将结果放入其中一个输入矩阵中;但软件实现的功能并不相同。我想,这是有道理的,因为每次做矩阵乘法时,复制一个副本要花很长时间