OpenGL ES позиция объекта изменяется несмотря на 0 значение перевода - PullRequest
0 голосов
/ 27 апреля 2018
@Override
public void onDrawFrame(GL10 gl) {
    float[] scratch = new float[16];
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
    // Set the camera position (View matrix)
    Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
    // Calculate the projection and view transformation
    Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);

    if(move_x) x=-tiltx/100;
    else{
        x=0;
        if(side_x) {
            if (tiltx < -0.1f) {
                x = -tiltx / 100;
                move_x = true;
            }
        }

        if(!side_x) {
            if (tiltx > 0.1f) {
                x = -tiltx / 100;
                move_x = true;
            }
        }
    }

    if(move_y) y=-tilty/100;
    else{
        y=0;
        if(side_y){
            if(tilty <-0.1f) {
                y=-tilty/100;
                move_y=true;
            }
        }
        if(!side_y) {
            if(tilty >0.1f) {
                y = -tilty / 100;
                move_y = true;
            }
        }
    }

Часть выше проверяет, разрешено ли перемещение, если нет, присваивает 0 для перевода значения (x и y). Чем (ниже) перевод применяется, несмотря на значения 0 x или y, он перемещает объект немного дальше, и это приводит к тому, что объект заканчивается частично позади вида. Это также вызывает срабатывание

if (Math.abs(scratch[12])>=2.4 && move_x)

снова при возвращении, что означает воспроизведение звука снова.

    Matrix.translateM(mBall.mModelMatrix, 0, (float)x*1f, (float)y*1f, 0f);



    // Combine the rotation matrix with the projection and camera view
    // Note that the mMVPMatrix factor *must be first* in order
    // for the matrix multiplication product to be correct.
    Matrix.multiplyMM(scratch, 0, mMVPMatrix, 0, mBall.mModelMatrix, 0);

    if (Math.abs(scratch[12])>=2.4 && move_x){
        setMyBoolean(true);
        move_x=false;

        if(scratch[12]<0) {
            side_x=false;
            scratch[12]=-(float)2.4;
        }
        else {
            side_x=true;
            scratch[12]=(float)2.4;
            }
        // true - prawa strona, false - lewa
    }

    if (Math.abs(scratch[13])>=1.8 && move_y){
        move_y=false;
        setMyBoolean(true);


        if(scratch[13]<0){
            side_y=true;
            scratch[13]=-(float)1.8;
        }
        else {
            side_y=false;
            scratch[13]=(float)1.8;
        }
        // true - prawa strona, false - lewa
    }

    mBall.draw(scratch);

Приведенный выше код проверяет, попал ли объект в стену, блокирует ли он дальнейшее движение, воспроизводит ли звук с помощью setMyBoolean, и, что самое важное, устанавливает объект точно на стену, изменяя царапину [12] и 13 значений.

Как объяснено выше, в следующем цикле положение объекта вычисляется иначе (несмотря на то, что переменная перевода установлена ​​на 0), и шар снова заканчивается в стене.

Стоит отметить, что он не меняет положение в следующих циклах. Он остается в стене до тех пор, пока я не наклоню телефон на другую сторону, не сработав, если это позволит объекту отойти от стены.

1 Ответ

0 голосов
/ 29 апреля 2018

Ответ на самом деле прост, мой метод не работал или фактически работал, но только из одного кадра, так как я не исправил неправильную позицию путем перевода объекта. Я лишь исправил значение матрицы, которая использовалась для рисования объекта один раз. Но так как шар помнит свое положение, он все равно будет рисовать себя в стене в следующем кадре.

Что я сделал, чтобы исправить эту проблему, так это отрегулировать положение мяча, когда я обнаружил, что он просто ударился о стену и еще не вернулся. Теперь корректировки выполняются путем фактического перевода объекта, и это делается каждый кадр.

Вот код, который делает это:

if(!move_x) {
        if(side_x) {
            Matrix.translateM(mBall.mModelMatrix, 0, (scratch[12] - (float) 2.4) * 1f, 0, 0f);
            Matrix.multiplyMM(scratch, 0, mMVPMatrix, 0, mBall.mModelMatrix, 0);
        } else {
            Matrix.translateM(mBall.mModelMatrix, 0, (scratch[12] + (float) 2.4) * 1f, 0, 0f);
            Matrix.multiplyMM(scratch, 0, mMVPMatrix, 0, mBall.mModelMatrix, 0);
        }
    }

    if(!move_y) {
        if(side_y){
            Matrix.translateM(mBall.mModelMatrix, 0, 0, (1.8f - scratch[13]) * 0.5f, 0f);
            Matrix.multiplyMM(scratch, 0, mMVPMatrix, 0, mBall.mModelMatrix, 0);
        } else {
            Matrix.translateM(mBall.mModelMatrix, 0, 0, -(1.8f + scratch[13]) * 0.5f, 0f);
            Matrix.multiplyMM(scratch, 0, mMVPMatrix, 0, mBall.mModelMatrix, 0);
        }
    }
...