2016-06-08 153 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直接,因爲它會更容易計算:

的視錐是由邊界參數(topbottomleft定義,right),nearfar。距離爲near的邊界參數的矩形將完全全屏顯示。所以最好從董事會本身開始。如果您將板定義爲尺寸爲(viewWidth, viewHeight),並且要求寬度範圍爲fov=35,則此對象的距離d應該爲d*tan(35/2)=viewWidth/2,因此d=viewWidth/(2*tan(35/2))現在是一個相對較大的值。現在距離d現在可以用作far,因爲我認爲你將不在板子後面畫任何東西,但只是爲了確保用戶d*2。 (增加far會降低深度緩衝區的精度,但沒有其他)。所以,現在你可以定義near就像這樣0.1哪裏那麼物體投影的規模scale=near/d和邊界值再乘以比例原始值:

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

所以有了這個設置您將在距離d處選擇尺寸爲(viewWidth, viewHeight)的矩形,如同完整屏幕一樣。因此,將d插入lookAt參數中,應該是全部。骰子的大小可以通過屏幕寬度來定義,因此它在所有設備上看起來相似。例如使用screenWidth/10作爲骰子大小,您將始終能夠在屏幕上水平放置10個骰子。

+0

謝謝,適合我。 –

相關問題