삼각형 인접 데이터 작성


9

삼각형 인덱스 목록이 주어 졌을 때, 지오메트리 쉐이더와 인접하여 인덱스 목록으로 변환하는 방법은 무엇입니까?

우리는 여기서 인덱스 에 대해 엄격하게 이야기하고 있습니다-정점이 존재하지만 부동 소수점 비교 및 ​​엡실론에 빠지지 않고 중복 정점을 일치시키는 데 사용할 수 있기 때문에 인덱스에만 초점을 맞출 것입니다. 이미 완료되었습니다.

목록의 주어진 삼각형에 대해 인덱스 {0, 1}, {1, 2} 및 {2, 0} (또는 {n, n + 1}, {n + 1, n + 2}, { n + 2, n} 원하는 경우) 가장자리를 형성합니다. 인덱스리스트는 올바른 형식이며 와인딩 순서를 올바르게 준수합니다.

주어진 가장자리에 대해 두 인덱스를 사용하는 다른 삼각형을 전체 목록에서 검색 할 수 있으며 해당 삼각형의 세 번째 인덱스는 해당 가장자리에 인접한 삼각형을 완성하는 데 사용되는 인덱스입니다.

인접 목록에서 각 원래 삼각형은 6 개의 인덱스로 표시되고 원래 인덱스는 슬롯 0, 2, 4로 이동합니다. 인접성을 완료하기위한 새 인덱스는 슬롯 1, 3, 5로 이동합니다. 에지 {0, 1}에 대해 완료 할 인덱스는 슬롯 1에, 에지 {1, 2}에 대해 완료 할 인덱스는 슬롯 3에, 인덱스 가장자리 {2, 1}에 대해 완료하려면 슬롯 5에 들어갑니다.

내가 무엇을 시도 했습니까?

나는 그것을 무차별 강제로 시도했지만 그래도 효과가 있지만 더 우아한 접근 방식을 따르고 있습니다.

Eric Lengyel의 Edge List Builder를 사용해 보았지만 (1) 원래 삼각형 순서를 존중하지 않는 것, (2) 감기 순서를 존중하지 않는 것, (3) 어디로 가야할지 진흙처럼 분명합니다. 다음으로 엣지 목록을 작성한 후 (4) "triangleIndex"와 "faceIndex"와 같이 눈부신 오류가있는 샘플 코드가 의심됩니다. 작성자가 코드를 컴파일해도 상관 없습니다. 그것을 확인?

여기에서 제안이나 조언이 있습니까?


지미, 나는 쉐도우 볼륨에 대한 내용을 편집하고 제목이 바뀌었기 때문에 제목과 관련이 없었고 혼란 스러웠 기 때문에 제목은 변경되었습니다. 궁극적 인 목적은 섀도우 볼륨에 사용하는 것이지만 인접 데이터를 만드는 것입니다.
Nathan Reed

답변:


11

이를 위해 해시 테이블을 사용하려고합니다 (예를 들어 std::unordered_mapC ++에있는 경우). 반쪽 가장자리 (한 쌍의 색인으로 표시)에서 반쪽 가장자리가 속한 삼각형의 세 번째 색인에 매핑되는 해시 테이블을 작성하십시오.

이것은 단순히 삼각형 목록을 반복하고 각 삼각형의 세 반쪽 가장자리를 해시 테이블에 추가하여 만들 수 있습니다. 초기 색인 목록에 인접한 삼각형 쌍 (0, 1, 2, 2, 1, 3)이 있으면 다음을 포함하는 해시 테이블이 생깁니다.

(0, 1) -> 2
(1, 2) -> 0
(2, 0) -> 1
(2, 1) -> 3
(1, 3) -> 2
(3, 2) -> 1

가장자리 (1, 2) 및 (2, 1)이 모두 표에 나타나 가장자리의 양면을 나타내고 두 삼각형 각각의 세 번째 정점을 나타냅니다.

그런 다음 인접성 데이터를 작성하려면 삼각형 목록을 다시 반복하고 반대 방향으로 각 삼각형의 모서리를 쿼리하면됩니다. 따라서 삼각형 (0, 1, 2)을 처리 할 때 가장자리 (1, 0), (2, 1) 및 (0, 2)를 쿼리합니다. 각 가장자리의 정점이있는 경우 정점을 찾습니다.


1
순서가 반대 인 가장자리를 시원하게 검색 하는 것은 중요한 정보 누락입니다. 챔피언을 일한다; +1하고 수락했습니다.
Maximus Minimus

2

하프 에지 데이터 구조를 살펴보십시오 .

아이디어는 대략 절반 모서리 의 목록 ( 예 : 특정면에 부착 된 특정 모서리 의 절반) 을 저장하는 것 입니다. 그런 다음이 구조는 인접한면의 해당 반쪽 가장자리에 대한 정보도 저장합니다.

데이터 구조는 연결성, 인접성 등에 대한 쿼리를 매우 효율적으로 만듭니다. 데이터를 효율적으로 생성하는 알고리즘이 있지만 반드시 "게임 런타임"을 효율적으로 할 필요는 없습니다 (자산 파이프 라인에서 오프라인으로 수행하는 것이 좋습니다).

이 블로그 게시물을 참조하십시오 . 구조와 알고리즘도 실시간 충돌 감지에 있다고 생각하지만 사무실에 사본이 없다는 것을 확실히 기억하지 못합니다.


-1, 죄송하지만, 아직 가지고 있지 않은 정보는 없었으며 GS에서 사용할 수있는 인접성을 가진 목록을 작성하는 대신 CPU 사용에 중점을 두었습니다.
Maximus Minimus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.