0.최적화방법으로 방해물 뒷시야 사각지대 없애기
1) 현재 방식 및 문제발생
- 현재까지 방법은 발사된 Ray가 방해물에 충돌한 지점과 Mesh해상도에 따라 변하는 일정한 조각각도단위로 다음순번에 발사된 Ray가 방해물에 충돌하지 않고 시야각의 가장자리까지 나아간 지점을 커스텀메쉬화 하여 삼각형을 그리는 방식이다
- 이러한 방식으로 최대한 방해물 뒤의 사각지대를 없애기 위해서는 아래 씬뷰2 처럼 Mesh해상도를 늘려 많은 Ray를 발사해야하만 한다, 다만 그럴 수록 최적화와는 멀어지게 된다
2) 문제해결방안
- 1번 그림처럼 낮은 해상도로 적은 Ray를 발사하여 방해물 뒤 사각지대를 없애기 위해서
먼저 방해물에 충돌한 Ray(씬뷰3, 2번 Ray)가 있고 이 바로 다음순번 Ray(씬뷰3, 3번 Ray)가 방해물에
충돌하지 않은 경우(혹은 그 반대의 경우)에만 해상도를 높이는 방식을 사용한다
- 따라서 두 Ray사이에 중간값에 해당하는 새로운 Ray(씬뷰3, 노란Ray)를 계속해서 발사하는 방식으로
방해물의 모서리에 가장 가깝게 충돌하는 새로운Ray(씬뷰3, 분홍Ray)와
방해물의 모서리에 가장 가깝게 충돌하지 않고 지나가는 새로운Ray(씬뷰3, 빨강Ray)를 찾는 것이다
3) 코드 구현계획
- 위 씬뷰3의 방해물에 충돌한 2번 Ray를 예시1의 minR라고 지칭하고, 충돌하지 않은3번 Ray를 maxR 라고 지칭하겠다
- minR과 maxR 사이 중간 각도에 해당하는 새로운 Ray를 발사하여 예시2처럼 해당 Ray가 방해물에 충돌하지 않았다면 maxR로 새로이 정정하고
- 새로이 정정된 maxR과 기존의 minR 사이 중간 각도에 해당하는 새로운 Ray를 발사하여 예시3처럼 해당 Ray가 방해물에 충돌했다면 minR로 새로이 정정한다
- 이러한 방식을 계속해서 반복하면 방해물 모서리에 가장 가까이 근접하여 충돌하는 minR과
방해물 모서리에 가장 가까이 근접하여 충돌하지 않는 maxR을 알아낼 수 있게 된다
4)코드 구현
- DrawFieldOfView()함수내부
- DrawFieldOfView()함수내부
- Edge Resolve Iteration 을 6으로 설정하여 FindEdge()함수안에서 방해물 모서리와 가장 가까운 2개의Ray를 찾기위해서 minRay와 maxRay 사이의 중간각도에 새로운 Ray를 발사하고 새로운 Ray를 minRay 또는 maxRay중 하나로 재설정하는 3)코드구현 계획에 따른 작업을 6회 반복
- 그 결과로 최종적으로 아래 씬뷰의 노란색Ray가 minRay가 되었고 보라색Ray가 maxRay가 되어 각각의 끝지점을 PointA, PointB로 정의하고 커스텀메쉬를 반들기 위한 정점(vertice)에 추가하였다.
- 이로써 사각지대를 없애기 위해 높은 MeshResolution으로 많은Ray를 발사하지 않고도 적은 Mesh해상도로 Ray를
조금 발사하면서도 사각지대를 없앨 수 있게 되어 최적화가 되었다
'Unity > Unity 기타' 카테고리의 다른 글
Unity - C# List정리 (0) | 2021.04.23 |
---|---|
Unity3D- FieldOfView 시야구현(최종) (0) | 2021.04.06 |
Unity3D- FieldOfView 시야구현(2) (0) | 2021.04.05 |
Unity3D- DrawRay와 DrawLine 차이점 (0) | 2021.04.04 |
Unity3D- FieldOfView 시야구현(1) (0) | 2021.04.04 |