2011-03-05 3 views
4

센터가 월드 좌표의 원점이되도록 그라운드 평면을 정의하는 10 x 10 그리드를 그려야합니다. 이것은 그리드에 정의 된 각 라인에 대해 호출되는 코드입니다.OpenGL ES 안드로이드에서 그리드 라인을 그리는 방법?

gl.glMatrixMode(GL10.GL_MODELVIEW); 
gl.glLoadIdentity(); 

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVerticesBuffer); 

gl.glTranslatef(x, y, z); 
gl.glRotatef(rz, 0, 0, 1); 
gl.glRotatef(rx, 1, 0, 0); 
gl.glRotatef(ry, 0, 1, 0); 

gl.glDrawArrays(GL10.GL_LINES, 0, 2); 

gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 

문제는 한 개의 수평선 만 보입니다. 그래서 뭔가 잘못되었다고 생각합니다.

Line line; 

for (int i = 0; i <= 10; i++) { 
    // horizontal lines 
    line = new Line(-50, 0, 0, 50, 0, 0, 0, 0, 1, 1); // blue line 
    line.z = (i * 100) - 50; 
    lines.add(line); 

    // draw perspective lines 
    line = new Line(-50, 0, 0, 50, 0, 0, 0, 0, 1, 1); // blue line 
    line.x = (i * 100) - 50; 
    line.ry = 90; 
    lines.add(line); 
} 

내가 onDrawFrame에 그리기 코드를 호출 라인 컬렉션의 각 라인 :

는 선을 정의하는 코드입니다.

답변

3

이유는 한 줄만 그리기 때문입니다. glDrawArrays는 기본적으로 주어진 데이터로부터 OpenGL 프리미티브를 그립니다. 따라서 버퍼 mVerticesBuffer의 좌표는 glDrawArrays에 의해 한 번 그려집니다.

  • 는 회전이/
  • 이 glDrawArrays와 함께 첫 선을() 그리기 시작 위치를 번역;

    당신이 원하는 것을 할 수있는 간단한 방법은에있다

  • gl.glTranslatef (somenumber, 0, 0);
  • glDrawArrays()와 동일한 호출로 다시 그립니다.
  • gl.glRotatef (90, 0, 1, 0); y 축을 중심으로 회전 (또는 중 당신이 0이다 축)
  • 다시 2, 3, 4 글 머리를 수행합니다 (아마도 같은 시작 위치에 도달하기 위해 다시 한 축에서 번역)합니다.

이 작업을 수행하는 훨씬 더 효율적이고 효율적인 방법은 매트릭스를 밀고 팝하는 것일 수 있지만, 간결함을 위해 OpenGL을 처음 사용하는 경우에 효과적입니다.

+1

테스트를 마친 후 다시 쓸 것입니다. – ace

+0

좀 더 명확하게하기 위해 더 많은 코드로 내 쿠 에이스 인을 업데이트했습니다. 나는 이미 당신이 제안한 것을하고 있지만 그것은 효과가 없다. – ace

+1

흠, Line 클래스는 어디에서 왔습니까? 그리고 "lines"리스트는 mVerticesBuffer 어딘가로 변환됩니까? –

1

해결 방법은 문제가없는 것으로 보입니다. 문제를 해결하기 위해 노력해야합니다. 아마 가장 좋은 해결책은 정점을 한 번 생성하여 파일에 저장하는 것입니다. 파일을 한 번 읽고 한 번에 그리드를 렌더링하면 성능과 속도가 훨씬 향상됩니다.