2016-06-08 3 views
5

저는 Android 용 Dice 롤러 앱을 만들고 있습니다. Kotlin, OpenGL-ES 및 jBullet 사용. 나는 주사위를 구현했습니다. 이제는 벽을 만들어야합니다. 그렇지 않으면 화면에서 주사위가 굴러 나오기 때문입니다.화면 좌표를 OpenGL 좌표로 변환

화면의 가로 세로 비율이 다를 수 있으므로 glUnProject으로 벽의 위치를 ​​결정하려고하지만이를 이해할 수 없습니다. 받은 좌표가 올바르지 않습니다.

gl.glViewport(0,0,width,height) //Reset The Current Viewport 
    gl.glMatrixMode(GL10.GL_PROJECTION) //Select The Projection Matrix 
    gl.glLoadIdentity()     //Reset The Projection Matrix 

    //Calculate The Aspect Ratio Of The Window 
    GLU.gluPerspective(gl, 35.0f, width.toFloat()/height.toFloat(), 0.1f, 100.0f) 

    GLU.gluLookAt(gl, 
      0.0f, 30.0f, 0.0f, //Pos 
      0.0f, 0.0f, 0.0f, //Look at 
      0.0f, 0.0f, 1.0f //Up 
    ); 

    gl.glMatrixMode(GL10.GL_MODELVIEW) //Select The Modelview Matrix 
    gl.glLoadIdentity()     //Reset The Modelview Matrix 

    // Get matrices 
    gl.glGetFloatv(GL11.GL_PROJECTION_MATRIX, glProjectionMatrix,0) 
    gl.glGetFloatv(GL11.GL_MODELVIEW_MATRIX, glModelMatrix,0) 
    gl.glGetIntegerv(GL11.GL_VIEWPORT, glViewPort,0) 

    // Allocate matrices 
    var modelMatrix = glModelMatrix 
    var projMatrix = glProjectionMatrix 
    var view = glViewPort 

    // Pre allocate wall positions 
    var wallDown = FloatArray(4) 

    // The needed point 
    var wallDownP = Vector3f(view[2].toFloat(), view[3].toFloat(), 0.2888888f) 

    GLU.gluUnProject(wallDownP.x, wallDownP.y, wallDownP.z, modelMatrix, 0, projMatrix, 0, view, 0, wallDown, 0) 
+0

어디에서 0.2888888f를 얻었습니까? – 246tNt

+0

벽을 원하면 왜 뷰포트를 2로 나눕니까? 그리고 벽으로 볼 때 카메라 뷰의 측면을 의미할까요? – Spidfire

답변

2

gluPerspective은 약간 불행합니다. 이것은 시야에 의해 정의 된 frustum 조작의 편의입니다.

그것은 당신이 지금 겪고있는 설정에서 모든 행할 수 있지만, 나는 그것이 쉬울 것이다 당신이 아니라 계산에 직접 frustum를 사용하는 것이 좋습니다 : 절두체는 경계 매개 변수 (top, bottom, left을에 의해 정의된다

을 , right), nearfar. 거리 매개 변수가있는 near의 사각형은 정확히 전체 화면입니다. 따라서 보드 자체부터 시작하는 것이 가장 좋습니다. 널을 (viewWidth, viewHeight)의 크기로 정의하고 너비가 이면이 오브젝트에 대한 d의 필드가 d*tan(35/2)=viewWidth/2이어야하므로 이제는 상대적으로 큰 값이되어야합니다. 거리 d은 이제 far으로 사용할 수 있습니다. 게시자가 아무 것도 그리지 않겠지 만 오히려 사용자 d*2이 맞는지 확인해야합니다. far을 늘리면 깊이 버퍼의 정밀도가 떨어지지만 그 밖의 것은 없습니다. 그래서 지금 당신은 0.1 같은으로 near을 정의 할 수있는 다음 개체 돌기의 규모는 scale=near/d이며 경계 값은 배율을 곱한 원래 값은 다음과 같습니다

  • left = -screenWidth/2*scale
  • right = screenWidth/2*scale
  • top = screenHeight/2*scale
  • bottom = -screenHeight/2*scale

이렇게 설정하면 당신은 거리 d 정확히크기의 사각형을 전체 화면으로 표시합니다. 따라서 dlookAt 매개 변수에 넣으십시오. 주사위의 크기는 화면 폭에 따라 정의되어 모든 장치에서 유사하게 나타날 수 있습니다. 예를 들어, 주사위 크기에 screenWidth/10을 사용하면 화면에 항상 정확히 10dis를 맞출 수 있습니다.

+0

고마워, 저를 위해 일합니다. –