2013-06-04 125 views
0

編輯因此,看起來glOrtho做我想做的事情(設置你想查看的區域),錯誤是在我的代碼中。然而,這可能是一個常見的初學者錯誤,所以有人可能仍然覺得這有用OpenGL - 設置可見區域

我正在使用glOrtho(我認爲它應該更容易設置正投影比透視)。總之,我在500x500x500的區域(全部可見區域)繪製小立方體(1x1x1)。我如何告訴OpenGL(使用OpenGL 2)在屏幕上繪製該區域中的所有內容(500,500,500)?

這是我的代碼 - 這是在Java中,但它應該工作一樣...

public void reshape(GLAutoDrawable gLDrawable, int x, int y, int width, int height) 
{ 
    final GL2 gl = gLDrawable.getGL().getGL2(); 

    if (height <= 0) // avoid a divide by zero error! 
    { 
     height = 1; 
    } 

    final float h = (float) width/(float) height; 

    gl.glViewport(0, 0, width, height); 
    gl.glMatrixMode(GL2.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    gl.glOrtho(0, 512, 0, 512, 0, 512); 
    gl.glMatrixMode(GL2.GL_MODELVIEW); 
    gl.glLoadIdentity(); 
} 

這似乎並沒有這樣的伎倆,我只能看,而不是數百幾個正方形。 ..

這裏是我的立方體的繪製代碼(所有多維數據集的所有座標是0和500之間):

public void display(GLAutoDrawable gLDrawable) 
{ 
    final GL2 gl = gLDrawable.getGL().getGL2(); 
    gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT); 
    gl.glLoadIdentity(); 

    for(InterestingVoxel iv: visibleList) { 
     gl.glTranslatef(iv.getI(), iv.getJ(), iv.getK()); 
     System.out.println("x:"+iv.getI() + ", y:" + iv.getJ() + ", z:" + iv.getK()); 
     drawCube(gl); 
    } 


} 

void drawCube(GL2 gl) 
{ 
    gl.glBegin(GL2.GL_QUADS); 

    // front 
    gl.glVertex3f(0.5f, 0.5f, 0.5f); 
    gl.glVertex3f(1.5f, 0.5f, 0.5f); 
    gl.glVertex3f(1.5f, 1.5f, 0.5f); 
    gl.glVertex3f(0.5f, 1.5f, 0.5f); 
    // back 
    gl.glVertex3f(0.5f, 0.5f, -0.5f); 
    gl.glVertex3f(1.5f, 0.5f, -0.5f); 
    gl.glVertex3f(1.5f, 1.5f, -0.5f); 
    gl.glVertex3f(0.5f, 1.5f, -0.5f); 
    // right 
    gl.glVertex3f(1.5f, 0.5f, 0.5f); 
    gl.glVertex3f(1.5f, 0.5f, -0.5f); 
    gl.glVertex3f(1.5f, 1.5f, -0.5f); 
    gl.glVertex3f(1.5f, 1.5f, 0.5f); 
    // left 
    gl.glVertex3f(0.5f, 0.5f, 0.5f); 
    gl.glVertex3f(0.5f, 0.5f, -0.5f); 
    gl.glVertex3f(0.5f, 1.5f, -0.5f); 
    gl.glVertex3f(0.5f, 1.5f, 0.5f); 
    // top 
    gl.glVertex3f(0.5f, 1.5f, 0.5f); 
    gl.glVertex3f(1.5f, 1.5f, 0.5f); 
    gl.glVertex3f(1.5f, 1.5f, -0.5f); 
    gl.glVertex3f(0.5f, 1.5f, -0.5f); 
    // bottom 
    gl.glVertex3f(0.5f, 0.5f, 0.5f); 
    gl.glVertex3f(1.5f, 0.5f, 0.5f); 
    gl.glVertex3f(1.5f, 0.5f, -0.5f); 
    gl.glVertex3f(0.5f, 0.5f, -0.5f); 

    gl.glEnd(); 
    gl.glFlush(); 
} 
+1

我看不出有什麼問題。我們可以看到你的立方體 - 繪製代碼嗎? – Thomas

+0

當然...只是添加了代碼。 – neuromouse

回答

2

glTranslate呼叫正在積累,這使大部分多維數據集的WEL超過512.也許你想使用矩陣堆棧,否則在循環內使用glLoadIdentity

+0

你說得對 - 我不得不在循環中使用glLoadIdentity。謝謝! – neuromouse

0

我假設你問如何限制繪圖到一個特定的區域。如果沒有,這是一個更通用的「我的代碼不起作用」的問題,你可能會忽略這個答案。

由於您使用的是GL 2.x,因此您可能需要考慮使用ClipPlane將繪圖剪切到特定區域。因此,就你而言,(根據你傳遞給GL的數據是什麼),你可能想要傳遞3到6個剪輯平面並啓用它們(Enable(CLIP_PLANEi),其中i是剪輯平面索引/編號) 。

例如(僞代碼,因爲我沒有工作GL2測試平臺現在):

plane planes[] = { 
    plane::from_triangle(
     500, 500, 500, 
     500, 500, 0, 
     500, 0, 500, 
    ), 
    plane::from_triangle(
     500, 500, 500, 
     0, 500, 500, 
     500, 0, 500, 
    ), 
    ... 
} 
// Assume the above is just a lot of GLdoubles somehow [e.g., POD types] 

ClipPlane(6, planes) 
for (unsigned plane_index = 0 to 5) { 
    Enable(CLIP_PLANE0 + plane_index) 
} 

這樣做,你可以合理地限制渲染到任何指定的飛機的一側。請記住,這已被棄用(如許多GL 2.x),所以如果您打算超出這個範圍,您可能希望重新實現着色器中的剪輯平面。

或者,只需檢查您正在繪製的圖形,並只在繪製的區域繪製圖形。