2016-06-08 31 views
5

Sto creando un'app per i rulli Dice per Android. Utilizzo di Kotlin, OpenGL-ES e jBullet. Ho implementato i dadi. Ora ho bisogno di creare muri, perché altrimenti i dadi rotoleranno fuori dallo schermo.Converti le coordinate dello schermo in coordinate OpenGL

Poiché gli schermi possono avere diverse proporzioni, sto cercando di determinare la posizione delle pareti con glUnProject, ma non riesco a capirlo. Le coordinate che ricevo non sono corrette.

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

Dove hai estratto lo 0.2888888f? – 246tNt

+0

Se vuoi i muri perché dividi il viewport per 2? E per muro intendi probabilmente i lati della visuale della tua videocamera? – Spidfire

risposta

2

Il gluPerspective potrebbe essere un po 'sfortunato nel tuo caso. Questa è una comodità dall'operazione frustum definita dal campo visivo.

E 'tutto fattibile dalla configurazione si hanno al momento, ma vi suggerisco invece di utilizzare frustum direttamente come sarà più facile da calcolare:

Il tronco è definito dai parametri di confine (top, bottom, left , right), near e far. Il rettangolo con i parametri del bordo con una distanza di near sarà esattamente a schermo intero. Quindi è meglio iniziare con la scheda stessa. Se si definisce la scheda come dimensione (viewWidth, viewHeight) e si desidera un campo di vista fov=35 in larghezza, la distanza d per questo oggetto deve essere d*tan(35/2)=viewWidth/2 quindi d=viewWidth/(2*tan(35/2)) che ora è un valore relativamente grande. La distanza d può ora essere utilizzata come far poiché presumo che non si stia disegnando nulla dietro la lavagna, ma solo per essere sicuri piuttosto che l'utente sia d*2. (Aumentando lo far diminuirà la precisione del buffer di profondità ma nient'altro). Così ora è possibile definire near come qualcosa di simile 0.1 dove quindi la scala della proiezione oggetto scale=near/d ed i valori di confine sono quindi valori originali moltiplicato per la scala:

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

Così avere questa configurazione vedrete il rettangolo delle dimensioni (viewWidth, viewHeight) a una distanza di d esattamente come a schermo intero. Quindi inserisci lo d nei parametri lookAt e dovrebbe essere tutto. La dimensione dei dadi può quindi essere definita dalla larghezza dello schermo in modo che appaia simile su tutti i dispositivi. Ad esempio usando screenWidth/10 per le dimensioni dei dadi, sarai sempre in grado di montare esattamente 10 dadi orizzontalmente sullo schermo.

+0

Grazie, lavora per me. –