2주간의 삽질이었다.
이전 프로젝트(모델링된 삼각형 매시와 Height Field기반의)에선 몬스터들이 건물 내에 있을땐 평평한 바닥으로만 움직였다. 건물 밖에 있을 경우 Height Field위에서 움직였다. 따라서 부드러운 이동이 가능했다.
지금 프로젝트의 복셀월드에선 복셀 요철이 최소 50cm에서 최대 4m에 달한다. 그러다보니 몬스터가 복셀간 요철에 걸려서 바보 되는 일이 부지기수로 생긴다.
여러가지 방법을 생각했고 충돌매시를 2중으로 갖고 필요에 따라 사용하는 방법을 실험해봤다.
좀 부드러운 삼각형 매시를 만들어서 충돌처리에 사용하면 한결 나을걸로 예상했다.
1. marching cube 알고리즘을 이용해서 복셀월드에서 비교적 부드러운 삼각형 매시를 뽑아냈다. 물론 이렇게 뽑은 매시는 삼각형 개수가 어마 무지하게 많다.
2. 이걸 최적화된 삼각형 매시로 자동변환하는 코드를 짰다. 최적화하는데 꽤나 고생했다. 납득할만한 수준의 삼각형 개수로 줄였고 코드의 안정성도 확보했기에 이제 다 해결했다고 생각했다.
결과적으로 실패했다.
메모리 사용량이라든가 이런저런 문제는 둘째치고 실사용에 문제가 있다.
경사진 삼각형이면 무난히 미끄러져서 통과할 수 있을줄 알았는데 중력벡터 생각을 안했다.
요철에 걸렸을때 중력을 무시하게 하는 등의 꼼수도 있지만 그런식으로 충돌처리 방법에 예외가 생기면 서버랑 클라이언트의 동기가 많이 깨져나간다. 서버와 클라이언트는 타이밍이 조금씩 다르기 때문에 작은 예외처리 하나도 대단히 민감하게 영향을 끼친다.
결국 그냥 몬스터의 행동 방식을 바꿔서서 점프 가능하도록 해야할것 같다.
2주 투자해서 결론은 냈으니 아무 실적이 없었던건 아니다…라고 정신승리 해본다.
“Voxel Horizon – 실패한 기능 – 부드러운 충돌 삼각형 매시 생성”에 대한 답글 1개