2013-06-04 2 views
0

편집 : 그래서 glOrtho가 내가하고 싶은 일을하고있는 것 같습니다 (보고 싶은 영역을 설정합니다), 오류가 내 코드에있었습니다. 그러나 일반적인 초보자 오류 일 수 있으므로 누군가가 여전히 유용하다고 생각할 수도 있습니다.OpenGL - 보이는 영역 설정

저는 glOrtho를 사용하고 있습니다 (투시 투영을 원근감보다 쉽게 ​​설정해야한다고 생각합니다). 어쨌든, 500x500x500의 영역 (모든 보이는 영역)에 작은 큐브 (1x1x1)를 그립니다. OpenGL (OpenGL 2 사용)이 그 영역에있는 모든 것을 화면에 그려 넣으려면 어떻게해야합니까 (500,500,500)? 이 자바이지만,이 트릭을하지 않는 것 같은 ...

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(); 
} 

, 나는 단지 대신 수백 몇 사각형을 볼 수 있습니다 작동합니다 -

이 내 코드입니다.

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 전화가 축적되어 큐브의 아의 대부분을두고 : 여기

..

내 큐브 그리기 코드 (모든 큐브의 모든 좌표가 0과 500 사이)입니다 아마도 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와 같이) 더 이상 사용되지 않으므로 염두에 두십시오. 그렇게 넘어갈 계획이라면 셰이더에서 클립면을 다시 구현해야 할 것입니다.

또는 무엇을 그리는 지 확인하고 그리려는 영역에있는 경우에만 그립니다.