3-D вращение на любой оси вызывает перекос сетки на некоторых, но не на всех устройствах Android

В настоящее время я работаю над созданием трехмерного игрового движка для Android, и на моем 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;
}

Внутри моя функция 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);

Я застрял на этом. Любые предложения будут полезны.

1 ответ

Хорошо, я решил проблему самостоятельно, и я опубликую это здесь в случае, если кто-то еще заинтересован или сталкивается с подобной проблемой. Все сводится к тому, что Lenovo TAB 10 полностью зависит от аппаратного обеспечения, а Samsung Galaxy Core Prime - нет. Вопрос в строке:

Matrix.multiplyMM(mMesh.mModelMatrix, 0, mMesh.mModelMatrix, 0, mMatRotate.getFloatArray(), 0);

В аппаратном обеспечении, кажется, можно выполнить умножение матрицы и поместить результат в одну из входных матриц; но реализация программного обеспечения не функционирует одинаково. Я думаю, это имеет смысл, потому что создание копии каждый раз, когда вы умножаете матрицу, занимает слишком много времени.

Другие вопросы по тегам