转换后获取opengl中对象的位置

时间:2011-12-30 17:13:27

标签: java opengl transform lwjgl

我想在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(); 

转换后是否可以获得顶点的位置?

2 个答案:

答案 0 :(得分:2)

不确定。将相同的变换(平移和旋转)应用于位置矢量,该矢量保存对象的位置。结果将是变换后对象的位置。如果要将3d co-ords转换为2d屏幕指令,您可能需要在某些时候进行一些缩放。但这非常可行。它涉及基于对象的z深度进行缩放。

编辑:

 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更完整的东西。谷歌vecmath,处理,团结。 3D很棘手,似乎没有真正的捷径,所以只要继续尝试,你就会得到它。

答案 1 :(得分:0)

这是不可能的...... opengl将您的顶点数据发送到GPU,只有在GPU上才能在转换后获得它们。

要获得变换顶点,必须将它们乘以矩阵

for each vertex:
   vertex_transformed = matrix * vertex

一些更高级的方法是使用变换反馈并将这些变换后的顶点存储到缓冲区中(但这个缓冲区仍将存储在GPU上)。