두 모서리가있는 대각선 가시선


9

지금은 가시 거리에 Bresenham의 라인 알고리즘을 사용하고 있습니다. 문제는 플레이어가 벽을 볼 수있는 가장자리 케이스를 찾았다는 것입니다. 플레이어가 특정 각도에서 다른쪽에 틈이있는 벽의 두 모서리를 볼 때 발생합니다.

가시선 케이스

내가 원하는 결과는 두 벽 사이의 타일이 유효하지 않은 것으로 표시되는 것입니다.

원하는 결과

이 문제를 해결하기 위해 Bresenham의 라인 알고리즘을 수정하는 가장 빠른 방법은 무엇입니까? 좋은 해결책이 없다면 더 적합한 알고리즘이 있습니까? 어떤 아이디어라도 환영합니다. 이 솔루션은 3d를 지원할 수 있어야합니다.

편집 : 내 간단한 해결책은 선의 x 및 y 좌표가 변경 될 때 두 모서리가 닫혀 있는지 확인하는 것입니다. 작업 소스 코드와 완성 된 제품의 대화식 데모는 http://ashblue.github.io/javascript-pathfinding/을 참조하십시오.


2
시작점과 끝점을 전환하면 차이가 있습니까? 두 계산에서 방해되지 않는 가시선을 반환하면 결과를 받아 들일 수 있습니다. RogueBasin에서 일부 LOS 기사가 도움이 될 수도 있습니다.
thalador

1
어느 쪽이든, 4-5에서 대각선의 두 검은 블록은 처음에는 벽에 연결되어 있지 않으며, 암시 적으로 대각선 움직임을 허용하기 때문에 이것을 말합니다. 연속적인 벽을 만들려면 대각선을 정사각형으로 잘라내거나 2-3과 4-5와 같이 순전히 대각선으로 이동하는 대신 라인 워커를 대각선으로 정사각형으로 만들어야합니다.
Patrick Hughes

뒤집는 것이 좋은 생각처럼 들리지만 문제가 해결되지는 않습니다. 내가 생각할 수있는 유일한 것은 두 모서리 중 하나가 비어 있는지 확인하고 확인하는 것입니다. 그래도 비싼 것 같습니다.
Ash Blue

5
"비싸 보인다"는 결코 무언가를 시도하지 않는다는 정당화에 충분하지 않습니다. "너무 비쌉니다"는 일반적으로 무언가가 너무 느리다는 것을 증명할 수 있다고 가정합니다.
Mokosha

3
필요한 알고리즘으로 만 변경하면 X와 Y가 동일한 단계에서 변경되면 먼저 X를 변경 한 다음 Y를 변경하면 대각선이 완전히 제거됩니다.
Patrick Hughes

답변:


7

에릭 리퍼 트 ​​(Eric Lippert)는 C #에서 쉐도우 캐스팅 으로 직사각형 평면 그리드 에서 가시 거리를 생성하는 데 뛰어난 시리즈를 썼습니다 .

다른 문제 중에서도 Eric은 다양한 결과를 제공하고 시선 요구 사항에 대해 답변해야하는 다양한 질문을 처리했으며 서로 다른 결과를 보여줍니다. 이 기사 중 하나는 초기 버전의 알고리즘에서 발생하는 "모퉁이를 돌보는"상황을 심층적으로 다룹니다.

Eric의 알고리즘을 6 각형 그리드 에 적용 했으며 가시성이 넓은 반경 (> 60 헥스)의 큰 6 각형 그리드 (> 400 x 700)에서 성공적으로 사용했습니다. 이 구현은 단일 i7 CPU를 사용하여 깜박일 수있는 한 빨리 완벽한 FOV를 계산하고 표시합니다. 이것은 내가 기대하는 용도에 충분히 빠릅니다.

업데이트 -고도와 시선 : 위
의 16 진 그리드 구현은 장애물이 아니라 고도와 시선을 계산합니다. 문서 참고 사항은 표고 계산과 관련하여 추가 결정을 내려야합니다 : 목표 높이와 관찰자 높이. 기본 선택은 둘 다 동일하게 만들어 대칭 시야를 생성하지만지면에서지면으로 및 관찰자의 눈으로도 선택할 수 있습니다. (코드는 MIT 라이센스 하의 오픈 소스입니다)


섀도 캐스팅을 실제로 파고 있지만 문제가 발생했습니다. z 축으로 작동하도록 알고리즘 스케일링에 대한 정보를 찾는 데 문제가 있습니다. 이것을 유감스럽게 생각하지만 3D로 작동시킬 수있는 제안 된 자료가 있습니까?
Ash Blue

@AshBlue : 위의 부록 참조
Pieter Geerkens

귀하의 코드베이스를보고 있습니다. 그것에 큰 것들이 있지만, 나는 헥스에 적용된 Bresenham 같은 선 그리기 알고리즘을 찾지 못하는 것 같습니다. 당신은 LOS와 함께합니까?
MLProgrammer-CiM

@EfEs : FieldOfView는 리턴 된 오브젝트입니다. ShadowCastingFov * .cs는 그림자를 투사하여 시야를 생성합니다. 코드에 대한 특정 질문이있는 경우 사이트의 토론 섹션에서 질문하는 것이 좋습니다. 더 일반적인 질문 여기에 답변을 드리겠습니다.
피터 게르 켄

@PieterGeerkens 여기에서 질문을 찾을 수 있습니다 gamedev.stackexchange.com/questions/57087/…
MLProgrammer-CiM

1

LOS 계산의 경우 코너 갭을 채우는 별도의 "고해상도"그리드가있는 경우 어떻게해야합니까? 나는 이런 식으로 생각하고 있었다 :

여기에 이미지 설명을 입력하십시오

왼쪽은 4 사각형의 원래 블록 섹션입니다.

오른쪽은 "고해상도"버전입니다. 각 원래 정사각형이 쿼터로 세분화되어 있고 모서리 중 하나가 채워져 있음을 알 수 있습니다. 알고리즘을 생성하여이를 생성하는 것은 확실하지 않지만 사전 계산할 수는 있습니다. 현재지도에서

그것은 좌표 공간이 네 배로 늘어났다는 것을 의미하지만 중요한 성능 문제는 아닙니다.


더 높은 해상도는 원본과 정확히 동일하게 보일 것입니다. 격자를 작은 격자로 나누면 작은 격자만으로도 동일한 시각적 표현을 얻을 수 있습니다. 각 단일 사각형은 동일한 지점에서 4 개의 작은 사각형이됩니다.
MichaelHouse

@ Byte56 맞습니다. 그 블록에 여분의 블록을 추가하기 위해 논리를 나눈 후에 추가 논리가 적용됨을 의미했습니다. 그렇게하는 논리는 독자에게 맡겨진 운동입니다.
Davy8

원본을 흐리게하여 고해상도 그리드를 쉽게 생성 할 수 있습니다. 그런 다음 0.5고해상도 셀을 채울지 여부에 대한 임계 값을 정의하십시오 . 따라서 고해상도 그리드를 사용하면 전혀 해키 느낌이들 것입니다.
danijar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.