2011-12-30 45 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上)。