yuchi's Development Home
글 수 201
SS3D엔진에서는 진영씨가 충돌처리 코드를 이미 사용하고 있었다. 실전적용된적은 한번도 없지만.
이번 프로젝트에서 실전 사용될것이다. 문제는...
씬 그래프의 기반이 왕창 바뀌어서 기존 코드를 쓸 수가 있느냐 하는 것이었다.
다행히 진영씨가 퇴직할때까지 충돌처리 코드를 분리해서 잘 정리해놨다.
덕택에 bsp기반의 엔진에 이 충돌처리 코드를 붙이는건 어렵지 않았다. 필드쪽에 대해서는 무난하게 작동,
역시나 문제는 BSP로 바뀐 건물과의 충돌처리.
충돌테스트용 삼각형이 무진장 많이 쏟아져나와서 진행이 불가능할정도로 느려졌다.
초기 버젼에서는 충돌처리용 삼각형을 집어넣던 그리드라도 있었는데 BSP기반으로 오면서 그 부분까지 완전 제거된것을 모르고 있었던 것이다.
대구 내려간 진영씨한테 전화 걸어서야 알게 되었다.
일단 충돌처리용 삼각형리스트를 어떤 식으로든 분할해야했다. 쩝...보스 잡으려고 칼 받으러 장로한테 갔더니 장로가 자기 아들 구해오면 칼 준다고 해서 다시 아들 찾아나서는...그런식의 스토리가 또 전개되는 것이다. 충돌처리하려고 자료구조를 또 몇개씩 만들고 만들고 만들어야하는...
그리하여 머리를 싸매기 시작한것이 지난주 초.
첨에는 3차원 그리드를 사용했다.하루 웬종일 작업해서 코드를 다 짜고 로직상으론 테스트가 다 끝났다. 뭔가 석연치 않아서 집에 오는 내내 고민하다 심각한 결함을 발견. 폐기하기로 결정했다.
고민고민하다가 이동 및 충돌처리에서 쓰이는 바운딩 매쉬는 캡슐이라는데 착안해서 KD트리를 사용하기로 했다.
일단 충돌처리용 삼각형 리스트를 이미 빌드된 BSP에 때려넣는다. 각 리프에 삼각형들이 들어가면 리프 안에서 KD트리로 잘라나간다.
좀 세밀하게 샘플링하도록 했더니 거의 완벽하게 균형을 잡은 트리가 만들어졌다.
이 과정에서 상당히 삽질했다. KD트리 빌드 코드를 넣고 나니 pvs빌드 시간이 황당하게 길어져버린것. 거의 네배쯤 증가했다.
처음에는 내 눈을 의심했으나 곧 원인을 파악했다.
new,delete로 할당한 힙블럭 갯수가 너무 많아져서 할당,해제할때마다 힙체크 시간이 기하급수적으로 길어진것이었다.
pvs빌드시에 실시간으로 new,delete를 많이 사용하는데 이미 bsp노드와 포탈로 new,delete를 많이 사용한 상태에서, KD트리 빌드한다고 BSP리프마다 수많은 KD트리 노드들이 new로 할당된채 존재하고 있으니....
그 상태에서 pvs빌드한다고 new,delete를 미친듯이 호출해대니 느려질수밖에.
이 문제는 일단 간단하게 해결했다. pvs빌드 하기 전에 KD트리빌드를 끝내고 new,delete로 할당한 노드들은 모두 제거, new 한번으로 할당하는 배열스타일로 바꿔버렸다.
그 다음은 .BSP파일로 저장할때 KD트리까지 같이 저장하는 문제인데, 기술적으로 어려울것 없으나 상당히 짜증나는 부분임에는 틀림없다.
토요일 출근해서 이 부분까지 다 짜긴 했는데 테스트하면 제대로 안돌아갈게 뻔해서 그냥 집으로 와버렸다.
방금까지 새벽 내내 코딩해서 일단 이 부분도 테스트하고 디버깅 완료.
이제 실전적용이 남아있다.
이동경로를 나타내는 캡슐 구조체로 BSP노드들을 걸러내고 그 BSP노드들이 가지고 있는 KD트리에 다시 캡슐을 주고 노드들을 걸러낸다. 최종적으로 KD트리 노들로부터 삼각형들을 추출해내면 이 놈들이 충돌처리할 삼각형 리스트.
여기서 중복되는 삼각형들도 제거해야된다. 코드는 다 짜뒀는데 역시 테스트하기 겁나는군.
스샷은 충돌매쉬를 표현한것이다. 연두색 부분은 카메라의 뷰 포인트가 속하는 KD트리 노드의 삼각형들. 저놈들 가지고 충돌 테스트를 하게 될 것이다.
에휴...이거 언제쯤 완료되려나..재미없다.
일단 해보는겁니다. 하다보면 또 하게 되더라고요. ㅋㅋ ^^