2011-12-30 93 views
4

我想获得OpenGL中对象的坐标。我画了一个四边形。之后我做了一些转换,比如GL11.glTranslatef()和GL11.glRotatef()。在OpenGL中获取对象在opengl中的位置

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

你是指哪个位置?模型视图转换的位置或者顶点的屏幕位置(通过模型视图和透视矩阵进行转换)?我不太了解java ogl绑定,但可能会有类似'gluProject'的东西。此外,如果绑定直接映射到opengl函数,请注意,在现代opengl矩阵运算(glTranslate/glRotate)和直接模式(glBegin/glVertex/glEnd)中已弃用,所以查看其他方法可能无论如何都值得。 – Grizzly 2011-12-30 17:21:59

回答

2

当然。将相同的变换(平移和旋转)应用于保存对象位置的位置矢量。结果将是变换后对象的位置。如果您想将三维坐标转换为二维屏幕坐标,您可能需要在某个点进行一些缩放。但这是非常可行的。它涉及基于对象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更加完整。 Google vecmath,处理,统一。 3D很棘手,似乎没有真正的捷径,所以只要不断尝试,你就会得到它。

+0

使用lwjgl在opengl中的顶点矢量上编译翻译或旋转?我需要的只是模型视图矩阵中的位置? – 2011-12-30 21:22:10

+0

翻译很简单,您只需分别添加x,y,z合作伙伴。旋转你需要乘以R×V,其中R是你的旋转矩阵,V是你的位置矢量。有一个静态方法http://lwjgl.org/javadoc/org/lwjgl/util/vector/Matrix4f.html这里叫做transform。你把你的旋转矩阵,你的原始和目标向量。 – 2011-12-31 16:27:02

+0

感谢您的帮助,但我仍然不知道如何获得旋转矩阵? – 2012-01-01 12:05:44

0

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

得到变换的顶点必须由矩阵

for each vertex: 
    vertex_transformed = matrix * vertex 

一些更高级的方法是使用变换反馈和那些变换的顶点存储到缓存(但仍这个缓冲区将被存储到它们乘以在GPU上)。