2014-09-24 3 views
1

Assimp 라이브러리를 사용하여 Wavefront Object 파일 (.obj)을 가져 오면 특정 정점이 두 배로 증가하고 Assimp SourceForge discussion에서 다음과 같은 답변을 발견하게되었습니다. http://sourceforge.net/p/assimp/discussion/817654/thread/026e9640/?limit=25#ba6c) :
Assimp vs. MeshLab Wavefront Object (.obj) import

는 다음을 상상해 : 당신은 그래픽 카드에 정점의 범위를 업로드 할 수 있습니다. 그런 다음 첫 번째 삼각형을 꼭짓점 3, 6 및 7로 만드는 인덱스 버퍼를 통해 GPU에 알립니다. 두 번째 삼각형은 1, 2 및 6입니다. 어떻게됩니까? GPU는 큐브를 그릴 것입니다. 그러나 큐브의 각 모서리는 동일한 UV 데이터, 법선 벡터, 정점 색상 또는 메시가 필요로하는 다른 것을 공유합니다.

큐브 코너를 얻지 만 그 모서리를 만지는 모든면에서 다른 UV 매핑을 얻으려면 어떻게해야합니까? 우리는 GPU에 "꼭지점 3을 사용하라"고 말할 수는 없지만 그 꼭지점의 UV 좌표 대신에 UV 좌표를 사용하십시오. " GPU는 이것을 할 수 없습니다. 그래서 그 꼭지점에서 꼭지점을 복제해야합니다. 이제 동일한 위치에 두 개의 정점이 있지만 다른 UV 좌표가 있습니다.

그리고 Assimp가 당신을 위해 무엇을하고 있습니다. JoinIdenticalVertices를 지정하면 정점이 24 개인 정육면체를 얻을 수 있습니다. 왜? 큐브에는 8 개의 모서리가 있지만 각 모서리에 3 개의 큐브면이 있으며 각 큐브면에는 해당 모서리에 대해 다른 UV 좌표가 설정되어 있으므로 각 모서리에 3 가지 버전이 있습니다. JoinIdenticalVertices를 지정하지 않으면 재사용하지 않고 일반 정점 배열을 얻게됩니다. 즉, 각 정육면체마다 3 개의 꼭지점이있는 2 개의 삼각형과 36 개의 꼭지점이 필요합니다.

대안으로는 3D uv 좌표와 큐브 맵을 사용하여 그 큐브를 텍스처링하는 것입니다. 이것은 큐브에서만 작동하는 특수한 경우이지만 거기에서 작동합니다. GPU는 내부적으로 6 개의 텍스처에 대한 매핑을 수행합니다. 위의 설명은 일반적인 경우이며, 발생할 수있는 모든 메쉬에 대해 이와 같이 작동합니다.

의미가 있습니다.
MeshLab에서 .obj 가져 오기 작업을 처리하는 방법을 모르는 것을 전제로하는 방법, 내가 찾은 대답이 맞다면 꼭지점 카운터가 증가하지 않는 객체를 가져올 때 어떻게해야합니까? 그들이 법선/접선/UV를 가질 때 정점을 분할하지 않고도 .obj 파일을 가져 오는 방법이있을뿐입니다.

답변

1

이것은 구현과 관련이 없습니다 (예 : 각 변수에 하나씩 여러 개의 벡터가 있음)하지만 로직은 동일합니다.

Meshlab은 공통 위치 외에 일반 및 텍스처와 같은 변수에 대해 가능한 여러 "값"을 사용하여 3D 좌표 당 하나의 정점을 생성합니다. 이 정점들은 정점 벡터에 저장됩니다.

이러한 여러 값은 별도의 정점 데이터 벡터 (VDV)에 저장됩니다. 삼각형면은 VDV에서 3 개의 항목을 가리키지 만 정점은 그 중 원하는 항목을 가리킬 수 있습니다.

렌더링시 VDV가 색인 목적으로 사용되지만 재료 계산시와 정점 수를 계산할 때 실제 정점이 사용됩니다. 인접한 모든면을 고려한 평범한 물건에 "결합 된"값이 별도로 있습니다.

+0

감사합니다. 선생님! – mrcointreau