2015-07-31 2 views
0

У меня есть мир, полный 2D-квадратов (z = 0). При запуске I проекции установки таким образом, что весь мир виден на экране, используя:Как выполнить проверку видимости объекта на Android OpenGL ES

gl.glMatrixMode(GL10.GL_PROJECTION); 
gl.glLoadIdentity(); 
gl.glOrthof(left, right, bottom, top, zNear, zFar); 

Тогда я позволить пользователю, чтобы увеличить в мире с пальцами, используя:

gl.glScalef(mScaleFactor, mScaleFactor, 1.0f); 

Я хочу сделать проверку видимости для объектов, которые выглядят не видимыми, поскольку пользователь приближается, чтобы не отображать их (повышение производительности). Я нашел этот метод:

android.opengl.Visibility.visibilityTest(float[] ws, int wsOffset, float[] positions, int positionsOffset, char[] indices, int indicesOffset, int indexCount); 

Но я не могу заставить его работать, ни я не нашел какие-либо примеры использования этого метода в сети Интернета. В настоящее время этот метод возвращает результат = 0 для каждого теста квадрат I, даже если масштабирование не применяется (mScaleFactor = 1,0)

То, как я это делаю:

final short SQUARE_VERTICES_ORDER_TEMPLATE[] = {0, 1, 2, 0, 2, 3}; 
    ..... 
    float[] vertices = toArray(mVertexBuffer); 
    short[] indices = toArray(mIndicesBuffer); 
    char[] charIndices = new char[indices.length]; 

    // method needs char[] 
    for (int i = 0; i < indices.length; i++) { 
     short shortIndex = indices[i]; 
     charIndices[i] = (char) shortIndex; 
    } 

    for (int i = 0; i < mSquares.size(); i++) { 
     int numIndicesPerSquare = SQUARE_VERTICES_ORDER_TEMPLATE.length; 
     int indicesOffset = i * numIndicesPerSquare; 
     int result = Visibility.visibilityTest(matrixGrabber.mProjection, 0, vertices, 0, charIndices, indicesOffset, numIndicesPerSquare); 
     switch (result) { 
      case 0: 
       Log.v(TAG, "Object NOT VISIBLE: " + mSquares.get(i)); // hits every time 
       break; 
      case 1: 
       Log.v(TAG, "Object PARTIALLY VISIBLE: " + mSquares.get(i)); 
       break; 
      default: 
       TAG.toString(); // to place a break point 
       break; 
     } 
    } 

Я не уверен, если я 'm собирание правильной матрицы, требуемой этим методом. Не могли бы вы проверить правильность использования этого метода или дать какие-либо другие советы или обходные пути?

ответ

0

Я выяснил, что не так, метод visibilityTest требует умножения матрицы. Вот как это должно быть:

matrixGrabber.getCurrentState(gl); 

float[] resultMatrix = new float[matrixGrabber.mProjection.length]; 
Matrix.multiplyMM(resultMatrix, 0, matrixGrabber.mProjection, 0, matrixGrabber.mModelView, 0); 
.... 
Visibility.visibilityTest(resultMatrix, 0, vertices, 0, charIndices, indicesOffset, numIndicesPerSquare);