2017-12-07 22 views
0

데모 용으로 임의의 크기와 랜덤 위치의 세 사각형을 그리는 작은 응용 프로그램을 만들었습니다. 도면 사각형 :OpenGL ray picking/tracing with cardboard (GVR)

private void renderObject(float[] modelViewProjection, FloatBuffer vertexCoordsBuf, int i) { 
     GLES20.glUseProgram(mProgram); 
     GLES20.glEnableVertexAttribArray(mPositionHandle); 
     GLES20.glVertexAttribPointer(
       mPositionHandle, 3, 
       GLES20.GL_FLOAT, false, 
       12, vertexCoordsBuf); 


     GLES20.glUniform4fv(mColorHandle, 
       1, colors, i * 4); 

     GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 
       1, false, modelViewProjection, 0); 

     // Draw the square 
     GLES20.glDrawElements(
       GLES20.GL_TRIANGLES, 6, 
       GLES20.GL_UNSIGNED_SHORT, indexesBuffer); 
     // Disable vertex array 
     GLES20.glDisableVertexAttribArray(mPositionHandle); 
} 
I는 정사영하여 화면의 중앙에 커서 (흰색 작은 사각형)을 표시

: 스테레오 표시 영역의 중앙에 명확성을 위해

private void renderCursor(Eye eye) { 
     GLES20.glDepthFunc(GLES20.GL_ALWAYS); 
     GLES20.glDepthMask(false); 

     GLES20.glUseProgram(mProgram); 
     GLES20.glEnableVertexAttribArray(mPositionHandle); 
     GLES20.glVertexAttribPointer(
       mPositionHandle, 3, 
       GLES20.GL_FLOAT, false, 
       12, cursorVertexCoordsBuf); 


     GLES20.glUniform4fv(mColorHandle, 
       1, colors, 12); 

     float[] perspectiveMatrix = eye.getPerspective(Z_NEAR, Z_FAR); 
     float[] orthoViewMatrix = new float[16]; 
     float[] modelViewMatrix = new float[16]; 
     Matrix.orthoM(orthoViewMatrix, 0, -1, 1, -1, 1, Z_NEAR, Z_FAR); 
     Matrix.multiplyMM(modelViewMatrix, 0, perspectiveMatrix, 0, orthoViewMatrix, 0); 

     GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 
       1, false, modelViewMatrix, 0); 


     // Draw the square 
     GLES20.glDrawElements(
       GLES20.GL_TRIANGLES, 6, 
       GLES20.GL_UNSIGNED_SHORT, indexesBuffer); 
     // Disable vertex array 
     GLES20.glDisableVertexAttribArray(mPositionHandle); 
     GLES20.glDepthFunc(GLES20.GL_LEQUAL); 
     GLES20.glDepthMask(true); 
    } 

을 모드에서 빨간색 점을 그립니다. 화면 중앙에서 커서가 어떻게 벗어나는 지 확인하십시오.

스테레오 모드에서 보는 방법. 화면 중앙에서 흰색 커서를 이동하는 방법 :

스테레오 모드를 사용하지 않으면 모든 것이 정상적으로 작동합니다. 난 스테레오 모드를 설정한다면, 커서가 아니다

public boolean rayPicking(int viewWidth, int viewHeight, float rx, float ry, 
           float[] viewMatrix, float[] projMatrix, float[] modelViewMatrix, 
           float[] objectCoords, short[] objectIndexes) { 
     float[] near_xyz = unProject(rx, ry, 0, viewMatrix, projMatrix, viewWidth, viewHeight); 
     float[] far_xyz = unProject(rx, ry, 1, viewMatrix, projMatrix, viewWidth, viewHeight); 
     int coordCount = objectCoords.length; 
     float[] convertedSquare = new float[coordCount]; 
     float[] resultVector = new float[4]; 
     float[] inputVector = new float[4]; 
     for (int i = 0; i < coordCount; i = i + 3) { 
      inputVector[0] = objectCoords[i]; 
      inputVector[1] = objectCoords[i + 1]; 
      inputVector[2] = objectCoords[i + 2]; 
      inputVector[3] = 1; 
      Matrix.multiplyMV(resultVector, 0, modelViewMatrix, 0, inputVector, 0); 
      convertedSquare[i] = resultVector[0]/resultVector[3]; 
      convertedSquare[i + 1] = resultVector[1]/resultVector[3]; 
      convertedSquare[i + 2] = resultVector[2]/resultVector[3]; 
     } 


     ArrayList<Triangle> triangles = new ArrayList<>(); 
     for (int i = 0; i < objectIndexes.length; i = i + 3) { 
      int i1 = objectIndexes[i] * 3; 
      int i2 = objectIndexes[i + 1] * 3; 
      int i3 = objectIndexes[i + 2] * 3; 
      triangles.add(
        new Triangle(
          new float[]{ 
            convertedSquare[i1], 
            convertedSquare[i1 + 1], 
            convertedSquare[i1 + 2] 
          }, 
          new float[]{ 
            convertedSquare[i2], 
            convertedSquare[i2 + 1], 
            convertedSquare[i2 + 2] 
          }, 
          new float[]{ 
            convertedSquare[i3], 
            convertedSquare[i3 + 1], 
            convertedSquare[i3 + 2] 
          } 
        ) 
      ); 
     } 

     for (Triangle t : triangles) { 
      float[] point = new float[3]; 
      int intersects = Triangle.intersectRayAndTriangle(near_xyz, far_xyz, t, point); 
      if (intersects == 1 || intersects == 2) { 
       return true; 
      } 
     } 
     return false; 
} 

: 나는 screenWidth/2 및 screenHeight/2 좌표에 대한 추적 선을 생산하고있어 화면의 중앙에있는 개체를 결정하는 방법을 사용 화면 중앙에 표시됩니다. 그리고 왼쪽 눈은 왼쪽 눈의 보이는 영역의 중앙에서 왼쪽으로 이동하고, 오른쪽은 오른쪽으로 적절하게 움직이기 때문입니다. 그리고이 경우 광선 추적을 생성 할 수 있도록 커서의 실제 화면 좌표를 얻는 방법을 이해하지 못합니까? https://github.com/Anton111111/AndroidGVRRayPickingSample

그리고 모두가 쉽게 읽을 하나 개의 파일에 배치 : https://github.com/Anton111111/AndroidGVRRayPickingSample/blob/master/app/src/main/java/com/anton111111/ray_picking/MainActivity.java

추신

전체는 GitHub의에서 얻을 수있는 샘플을했다) 나는 어떤 프롬프트에 기뻐할 것입니다 제발, 제 질문에 빼기를 설정하려면 간단한 질문을 추가하여 제 질문에 어떤 문제가 있는지 설명하십시오.

답변