2010-01-25 4 views
1

여러 객체를 추가하고 3D 세계에서 객체를 사용하는 방법을 배우려고합니다. 나는 iPhone 용으로 개발 중이다. 아래의 제 질문에 대해서는 인터넷 검색을하는 동안 좋은 정보를 찾을 수 없습니다.OpenGL-ES에서 여러 객체를 사용하는 방법

구형을 만들기 위해 데이터가있는 모든 정점 배열을 만드는 함수가 있습니다. 유일한 객체로 추가하는 데 문제가 없습니다. 문제는 구체의 데이터가 내가 작성하고 추가 한 다른 오브젝트를 인식하지 못한다는 것입니다. 물론 배열을 정점과 병합하고 동시에 모든 것을 추가 할 수 있다는 것을 이해합니다. 그러면 세상에서 내 객체를 원하는대로 볼 수 있습니다. 그렇다면 glTranslatef(,,), glScalefglRotatef(,,,)을 어떻게 처리합니까? 그것은 전 세계에 영향을 미치고 아마도 구를 회전시키고 싶을 것입니다. 구의 꼭지점 위치 만 변경하면 어떻게됩니까? 구를 이동하려면 어떻게해야합니까?

그래서 내가 물어보고 싶은 질문은 단일 개체로 작업하고 하나의 청크로 세계와 작업하지 못하게하기 위해 여러 개체로 작업 할 때 사용할 전략/패턴은 무엇일까요? 많은 물체를 포함하고 있습니까? 나중에 충돌 감지와 함께 작동하는 전략이 필요할 것입니다. 나는 배우면서 올바른 방향으로 움직이기 위해서는 약간의 도움이 필요합니다.

답변

1

기본적으로 두 가지 패턴이 있습니다. 행렬 스택 사용 및 데이터 복사입니다.

행렬 스택을 사용하려면, 당신은 같은 것을 할 :이 다른 위치에 그려집니다 때문에

for each object { 
glPushMatrix 
glTranslate(location of first object) 
/* rotate as desired too */ 
draw_one_object(); 
glPopMatrix(); 
} 

같은 좌표 데이터를 재활용 할 수 있습니다.

대안 (데이터 복사)은 더 큰 배열을 할당하고 데이터를 N 번 복사 한 다음 각 복사본에 개체 오프셋을 추가하여 원본 데이터의 고유 복사본을 만듭니다.

+0

감사합니다. 다른 곳에서 찾은 정보와 비슷하기 때문에 일반적인 방법이라고 생각합니다. 이해할 수없는 한 가지 점은 "동일한 좌표 데이터가 다른 위치에 그려지기 때문에 재활용 될 수 있습니다."입니다. 설명해 주시겠습니까? 나는 초보자입니다. "이해할 수없는"것에 대해 미안합니다 ... – Nicsoft

2

"변형"명령 (glRotate, glTranslate 등)은 이 (가) 영구히 좌표 데이터에 영향을주지 않습니다. 한 번에 수행되는 도면에만 영향을 미칩니다. 당신이 원 주위에 큐브가있는 경우 예를 들어, ... 즉

draw_cube(); // draws the cube around the origin 
glTranslate(10,0,0); 
draw_cube(); // draws the cube 10 units to the right 
glTranslate(2,0,0); 
draw_cube(); // draws the cube 12 units to the right 
draw_cube(); // draws the cube 12 units to the right again 
glTranslate(-12,0,0); 
draw_cube(); // draws the cube around the origin (again). 

, 당신은 glDrawElements 또는 glDrawArrays 그릴 때마다, 좌표는 이전의 모든 매트릭스 루틴의 TOTAL 결과에 의해 영향을 받는다. 그러나 요소를 그리는 데 사용하는 원시 데이터은 변경되지 않습니다.

(행성 명령은 그래픽 카드 이 지오메트리 데이터를 어떻게 보는지 변경하는 것으로 생각할 수 있습니다. 지오메트리 데이터 자체는 변경되지 않습니다.) 실제로 빨간색을 칠하는 것과 빨간색을 칠하는 것의 차이점과 같습니다 붉은 착색 선글라스; 행렬 루틴은 그래픽 카드에 의해 의 데이터가으로 표시되는 방식을 변경하므로 변경 사항은 영구적이지 않습니다.

+0

좋습니다, 감사합니다! 나는 그것을 밖으로 시도 할 것이다. – Nicsoft

관련 문제