본문 바로가기

Unity/Unity 기타

Unity3D- fieldOfView 시야구현(3)

0.최적화방법으로 방해물 뒷시야 사각지대 없애기

 1) 현재 방식 및 문제발생

 - 현재까지 방법은 발사된 Ray가 방해물에 충돌한 지점과 Mesh해상도에 따라 변하는 일정한 조각각도단위로 다음순번에 발사된 Ray가 방해물에 충돌하지 않고 시야각의 가장자리까지 나아간 지점을 커스텀메쉬화 하여 삼각형을 그리는 방식이다   

 - 이러한 방식으로 최대한 방해물 뒤의 사각지대를 없애기 위해서는 아래 씬뷰2 처럼 Mesh해상도를 늘려 많은 Ray를 발사해야하만 한다, 다만 그럴 수록 최적화와는 멀어지게 된다

 Scean뷰 1                                                                                     Scean뷰 2

 

 2) 문제해결방안

 - 1번 그림처럼 낮은 해상도로 적은 Ray를 발사하여 방해물 뒤 사각지대를 없애기 위해서

   먼저 방해물에 충돌한 Ray(씬뷰3, 2번 Ray)가 있고 이 바로 다음순번 Ray(씬뷰3, 3번 Ray)가 방해물에

   충돌하지 않은 경우(혹은 그 반대의 경우)에만 해상도를 높이는 방식을 사용한다

 

- 따라서 두 Ray사이에 중간값에 해당하는 새로운 Ray(씬뷰3, 노란Ray)를 계속해서 발사하는 방식으로

   방해물의 모서리에 가장 가깝게 충돌하는 새로운Ray(씬뷰3, 분홍Ray)

   방해물의 모서리에 가장 가깝게 충돌하지 않고 지나가는 새로운Ray(씬뷰3, 빨강Ray)를 찾는 것이다

 

Scean뷰 3(실제로 1번과 2번 Ray는 방해물에 충돌)

 

 

 

3) 코드 구현계획

 - 위 씬뷰3의 방해물에 충돌한 2번 Ray를 예시1의 minR라고 지칭하고, 충돌하지 않은3번 Ray를 maxR 라고 지칭하겠다

 - minR과 maxR 사이 중간 각도에 해당하는 새로운 Ray를 발사하여 예시2처럼 해당 Ray가 방해물에 충돌하지 않았다면 maxR로 새로이 정정하고

 - 새로이 정정된 maxR과 기존의 minR 사이 중간 각도에 해당하는 새로운 Ray를 발사하여 예시3처럼 해당 Ray가 방해물에 충돌했다면 minR로 새로이 정정한다

 - 이러한 방식을 계속해서 반복하면 방해물 모서리에 가장 가까이 근접하여 충돌하는 minR과

   방해물 모서리에 가장 가까이 근접하여 충돌하지 않는 maxR을 알아낼 수 있게 된다

 

예시1                        ------>                            예시2                       ------>                               예시3

 

 

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