2011-12-30 18 views
4

OpenGLでオブジェクトの座標を取得したいとします。私はクワッドを描きます。その後、私はGL11.glTranslatef()やGL11.glRotatef()のような変換を行います。変換後のオブジェクトの位置を取得する

GL11.glBegin(GL11.GL_QUADS); // draw independent triangles 
GL11.glColor3f(0.0f, 1.0f, 0.0f); 
GL11.glVertex3f(-0.2f, 0.0f, -2.0f); // lower left vertex 
GL11.glVertex3f(0.2f, 0.0f, -2.0f); // upper vertex 
GL11.glVertex3f(0.2f, 0.4f, -2.0f); // lower right verte 
GL11.glVertex3f(-0.2f, 0.4f, -2.0f); 
GL11.glEnd(); 

変換後に頂点の位置を取得できますか?

+0

どのポジションを意味していますか?頂点(モデルビューと透視マトリックスで変換)があれば、modelviewまたはスクリーン位置によって変換された位置?私はJavaのoglバインディングについてはあまり知られていませんが、そのための 'gluProject'のようなものがあるかもしれません。さらに、OpenGL関数に直接マップすると、現在のOpenGLの行列操作(glTranslate/glRotate)と即時モード(glBegin/glVertex/glEnd)は廃止予定ですので、それを行うための他の方法を見ても価値があるかもしれないことに注意してください。 – Grizzly

答えて

2

オブジェクトの位置を保持する位置ベクトルに同じ変換(平行移動と回転)を適用します。結果は、変換後のオブジェクトの位置になります。 3次元座標を2次元画面座標に変換する場合は、ある程度スケーリングを行う必要があります。しかし、これは非常に実行可能です。これは、オブジェクトのz深度に基づいてスケーリングを行います。

EDIT:

private final FloatBuffer buffer = EngineUtil.createBuffer(16); 

     /** 
    * @return Current modelview matrix (column-major) 
    */ 
    public Matrix getModelviewMatrix() { 
     return getMatrix(GL11.GL_MODELVIEW_MATRIX); 
    } 

    /** 
    * @return Current projection matrix (column-major) 
    */ 
    public Matrix getProjectionMatrix() { 
     return getMatrix(GL11.GL_PROJECTION_MATRIX); 
    } 

    /** 
    * Retrieves the specified matrix. 
    * @param name Matrix name 
    */ 
    private Matrix getMatrix(int name) { 
     // Retrieve specified matrix buffer 
     buffer.rewind(); 
     GL11.glGetFloat(name, buffer); 

     // Convert to array 
     final float[] array = new float[ 16 ]; 
     buffer.get(array); 

     // Convert to matrix 
     return new Matrix(array); 
    } 

しかし、あなたは、単にLWJGLよりも、より完全なものを使用することをお勧めします。 Googleのvecmath、処理、統一。 3Dはやりにくく、実際のショートカットがないようですので、試してみてください。

+0

lwjglでopenglの頂点のベクトル上で翻訳や回転をプログラムするには?私が必要とするのは、modelview行列の位置です。 –

+0

翻訳は簡単です。x、y、z座標をそれぞれ追加するだけです。あなたはR x Vを乗算する必要があります。Rはあなたの回転行列です。Vはあなたの位置ベクトルです。静的メソッドhttp://lwjgl.org/javadoc/org/lwjgl/util/vector/Matrix4f.htmlここではtransformと呼ばれます。回転行列と元のベクトルとターゲットベクトルを入れます。 –

+0

助けてくれてありがとう、しかし、私はまだ回転行列を取得する方法を知らない? –

0

これはできません... openglは頂点データをGPUに送信し、変換後はGPU上でしか取得できません。あなたは行列

for each vertex: 
    vertex_transformed = matrix * vertex 

いくつかのより高度な方法でそれらを乗算する必要が頂点を変換し得るために

フィードバックを変換し、バッファにそれらの変換された頂点を保存する(まだこのバッファが保存される使用することですGPU上で)。

関連する問題