5

Android用のサイコロローラーアプリを作成しています。Kotlin、OpenGL-ES、jBullet を使用。サイコロを実装しました。ここで、壁を作成する必要があります。そうしないと、サイコロが画面から転がってしまうからです。

画面の縦横比が違うので、 で壁の位置を決めようとしているのですが、わかり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)
4

1 に答える 1

2

あなたのgluPerspective場合は少し残念かもしれません。frustumこれは、操作が視野によって定義されているため便利です。

現在のセットアップからすべて実行可能ですがfrustum、計算が簡単になるため、直接使用することをお勧めします。

錐台は、境界パラメータ ( topbottomleftright)、nearおよびによって定義されますfar。の距離の境界パラメーターを持つ長方形は、near正確にフルスクリーンになります。したがって、ボード自体から始めるのが最善です。ボードのサイズを定義し、(viewWidth, viewHeight)視野fov=35の幅が必要な場合、このオブジェクトまでの距離は、比較的大きな値になるdはずです。距離は、ボードの後ろに何も描画しないと仮定して使用できるようになりましたが、確かに user . ( を大きくすると、深度バッファの精度が低下しますが、他には何もありません)。したがって、次のように定義できますd*tan(35/2)=viewWidth/2d=viewWidth/(2*tan(35/2))dfard*2farnear0.1ここで、オブジェクト投影のスケールは次のscale=near/dとおりであり、境界値は元の値にスケールを掛けたものです。

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

(viewWidth, viewHeight)したがって、この設定を使用すると、距離を置いたサイズの長方形をd正確にフルスクリーンとして設定できます。dしたがって、をlookAtパラメーターに挿入すると、それですべてです。サイコロのサイズは、画面の幅によって定義されるため、すべてのデバイスで同じように表示されます。たとえばscreenWidth/10、サイコロのサイズを使用すると、画面上に水平方向にちょうど 10 個のサイコロを常に収めることができます。

于 2016-06-09T10:09:18.803 に答える