Voxel오브젝트의 최적화된 삼각형 리스트 만들기.

복셀 오브젝트에 딱 맞는 최적화된 삼각형 리스트를 만들었다.

복셀 오브젝트를 그냥 삼각형으로 변환하면 복셀 한칸한칸마다 삼각형12개가 생긴다. 인접한 복셀이 있을 경우 면을 제거해도 최소 2개씩은 생긴다. 이걸 최적화해줘야 하는데 boolean연산으로 줄여야한다고 생각하고 있었다.
예전에 room/portal 에디터 만들때 N각형 boolean연산의 지랄같음을 맛보았기 때문에 다신 하고 싶지 않았다.

그런데 가만 생각해보니 이미 사용하는 방법을 조금 응용하면 boolean연산 없이도 삼각형들을 합칠 수 있다.
현재 복셀오브젝트의 중심부의 임의의 복셀로부터 AABB를 키워 나가는 식으로 복셀 오브젝트를 뚫지 않는 AABB를 만들고 있다. 이 AABB를 HW Occlusion Test의 Occluder로 사용하고 있다.

이것을 2D에도 적용하면 되지 않을까? 복셀을 이루는 사각형들 완전히 축정렬되어있고 몇개의 평면에 몰려서 존재하므로 같은 평면에 존재하는 삼각형들을 2D 좌표로 맵핑하고 위와같은 방법으로 최적화된 2차원 사각형들을 만들면 된다.

그래서 다음과 같이 처리했다.

1. 복셀 오브젝트의 각 복셀로부터 사각형 6개씩을 만든다. 8x8x8짜리 복셀 오브젝트라면 8x8x8x6개의 사각형이 나오겠지.

2. 이때 인접한 복셀이 존재할 경우 인접한 면의 사각형은 제외한다. 8x8x8짜리 복셀 오브젝트를 꽉 채운 상태라면 6개의 면에 대해 각 64개의 사각형이 나온다.

3. 이렇게 나온 사각형들을 면방정식이 같은 놈들끼리 모아서 그룹을 짓는다.

4. 각 그룹별로 x,y평면으로 투영

5. xy평면에서 2차원 비트맵으로 맵핑. 비트맵상에서 사각형이 존재하는 영역은 픽셀값을 1로 표시.

6. 2차원 비트맵 상에서 1로 표시된 픽셀을 골라서 그 픽셀로부터 비트맵의을 뚫고 나가지 않는 가장 큰 사각형으로 키워나간다. (사각형의 내부는 2로 표시. 사각형이 없는 영역 0, 사각형이 존재하면 1. 사각형을 키워나가서 방금 새로 만든 영역은 2)

7. x,y축에 대해서 -x,+x,-y,+y로 한픽셀씩 키워나간다. 이렇게 만들어진 사각형이 3차원상에서 여러개의 작은 사각형이 합쳐진 큰 사각형으로 맵핑되는 것이다.

8. 2차원상에서 만들어진 비트맵 사각형을 다시 원래의 3차원 좌표계로 맵핑.

복셀 렌더링
VoxelHorizon_04_04_11_00_10

각각의 복셀을 사각형으로 변환만 한 경우
VoxelHorizon_04_04_11_00_13

복셀로부터 생성한 사각형들을 최적화
VoxelHorizon_04_04_11_00_54

아 만들어놓고 보니 쓸모가 너무 많다.
복셀 한칸한칸에 대한 충돌처리를 할때 실시간으로 복셀 오브젝트 내에서 Octree를 탐색하며 삼각형을 만들어내는 방법을 사용했다. 이것도 이미 만들어놓은 최적화된 삼각형 리스트를 사용하면 대폭 빠르고 간단하게 처리할 수 있다.


답글 남기기

댓글을 게시하려면 다음의 방법 중 하나를 사용하여 로그인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중