2014-05-18 2 views
6

처음에는 명백한 것처럼 보였습니다 ... 4 개의 색인이 발견 된 곳마다 얼굴 당 2 개의 삼각형을 만듭니다. 맞습니까? 다음
의미 :OBJ 파일의 사변형을 삼각형으로 변환 하시겠습니까?

v 1.000000 1.000000 0.000000 
v -1.000000 1.000000 -0.000000 
v 1.000000 -1.000000 0.000000 
v -1.000000 -1.000000 -0.000000 
f -4 -3 -2 
f -2 -3 -1 

이 특정 예, 물론, 제대로 렌더링 것 :

v 1.000000 1.000000 0.000000 
v -1.000000 1.000000 -0.000000 
v 1.000000 -1.000000 0.000000 
v -1.000000 -1.000000 -0.000000 
f -4 -3 -2 -1 

이 ..., 차례로, 필요 같은 무언가로 변환 할 수 있습니다.
그러나 모든 경우가 얼굴을 두 얼굴로 분할하는 것처럼 간단하지는 않습니다 (첫 번째 얼굴은 원래 얼굴의 처음 세 개의 꼭지점을 포함하고 두 번째 얼굴은 위의 예와 같이 마지막 세 개의 꼭지점을 포함합니다). 예를 들어, 다음과 같은 큐브를 타고 ...

v 0.000000 1.000000 1.000000 
v 0.000000 0.000000 1.000000 
v 1.000000 0.000000 1.000000 
v 1.000000 1.000000 1.000000 
v 0.000000 1.000000 0.000000 
v 0.000000 0.000000 0.000000 
v 1.000000 0.000000 0.000000 
v 1.000000 1.000000 0.000000 
f 1 2 3 4 
f 8 7 6 5 
f 4 3 7 8 
f 5 1 4 8 
f 5 6 2 1 
f 2 6 7 3 

이 얼굴은 앞의 예에서 같은 방법으로 분할 할 수없는 그래서, 삼각형 얼굴이에 사각형 얼굴을 분할하는 방법을 알 수있는 방법이 필요 것, 두 번째면의 색인을 올바르게 사용하는 중 ...

어떻게 달성 할 수 있습니까? 고정 기능 파이프 라인을 사용하지 않기 때문에 GL_QUADS를 사용하는 것이 좋습니다. 내 렌더링 엔진은 GL_TRIANGLES를 사용하는 것에 만 고착되어 있습니다.

+0

, 내가 지출 (사이비 코드) 다음과 같은 삼각형에 대한 올바른 변환입니다 지난 이틀 동안 이것을 알아 내려고했습니다. 이것들은 QUADs가 아니라 삼각형 스트립입니다.이 문서는 매우 열악합니다. – Geoffrey

답변

9

4 개는 인덱스를 가질 경우, 예컨대 :

0 1 2 3 

개의 삼각형으로 분할은 제 3 개 인덱스를 가지는 하나 및, 제 3 및 제 4 한 것이다. 이 예에서 :

0 1 2 
0 2 3 

은의이을 설명하기 위해 몇 가지 ASCII 아트를 해보자 :

다음은 같은 쿼드, 첫 번째 삼각형으로 0 1 2 (오른쪽 아래), 그리고 0 2 30 1 2 3 참조
3-------2 
|  /| 
| /| 
|/ | 
|/  | 
0-------1 

두 번째 삼각형 (왼쪽 위).

는 더 일반적으로, n 정점으로 얼굴을 위해, 당신은 삼각형을 생성 : 별도의 삼각형을 주장하지 않는 경우

0 (i) (i + 1) [for i in 1..(n - 2)] 

은 또한 핵심 OpenGL은 아직 GL_TRIANGLE_FAN 프리미티브를 사용할 수 있습니다. 이렇게하면 원래의 인덱스 시퀀스를 사용하여 삼각형 팬을 사용하여 볼록한 다각형을 그릴 수 있습니다. 따라서 정점 순서가 0 1 2 3 인 삼각형 팬은이 경우 쿼드를 설명하며 4 개 이상의 정점이있는면으로 매우 쉽게 일반화됩니다.

편집 : 여전히 문제가있는 것으로 보아이 게시물이 게시물의 예에 어떻게 적용되는지 확인해 보겠습니다. 각면에 대한 쿼드의 원래 인덱스 시퀀스와 쿼드를 분할 한 후 두 개의 삼각형에 대한 인덱스 시퀀스를 나열합니다.

f 1 2 3 4 --> (1 2 3) (1 3 4) 
f 8 7 6 5 --> (8 7 6) (8 6 5) 
f 4 3 7 8 --> (4 3 7) (4 7 8) 
f 5 1 4 8 --> (5 1 4) (5 4 8) 
f 5 6 2 1 --> (5 6 2) (5 2 1) 
f 2 6 7 3 --> (2 6 7) (2 7 3) 

큐브를 그리면 나에게 맞아 보인다. 이것들은 1부터 시작하는 인덱스이기 때문에 인덱스에서 1을 뺀 것을 기억하십시오. 그리고 거의 확실하게 0을 기반으로하는 인덱스가 필요할 것입니다.

+1

이 모든 경우에 맞습니까? 위의 마지막 "큐브"예제에서는면 중 하나가 잘못 렌더링되어 GL_TRIANGLE_FAN이있는 경우에도 큐브의 한 쪽면에 "잘린 부분"이 생깁니다. 그래서 내 코드 나 객체 자체에 문제가 있거나 사용자의 대답이 모든 경우를 처리하지 못합니다. – RectangleEquals

+2

어떤 얼굴에 문제가 있습니까? 나는 그것을 스케치했고, 0 기반 색인을 사용할 때 모두 괜찮아 보였다. OBJ 파일의 인덱스가 1 기반이기 때문에 게시 한 예제 파일은 실제로 손상되었습니다. 다음은 큐브 예제입니다. http://people.sc.fsu.edu/~jburkardt/data/obj/cube.obj. 파일 형식 정의 : http://www.fileformat.info/format/wavefrontobj/egff.htm. –

+0

고마워, 내가 그걸 살펴보고 내가 너에게 돌아갈거야 – RectangleEquals

0

'f'매개 변수에 대한 세부 정보는 매우 모호합니다. 특히 일부 파일에 4 개 이상의 인수가있는 'f'줄이 포함되어있는 것을 보면 내 obj 로더를 작성하고 사양을 매우 자세히 읽을 수 있습니다.

사실 이들은 홀수 순서의 삼각형 스트립입니다.

n = 0; 
triangles[n++] = [values[0], values[1], values[2]]; 
for(i = 3; i < count(values); ++i) 
    triangles[n++] = [ 
    values[i - 3], 
    values[i - 1], 
    values[i] 
    ]; 

예 :

f: A B C D E F G 

은 5 개 삼각형과 같다 : 내가 여기 혼란을 이해

A B C 
A C D 
B D E 
C E F 
D F G