블록 기반 2D 게임에서 폐색 조명을 어떻게 구현합니까? 배치하고 해당 라이트 주위에 벽을 배치한다고 가정하겠습니다.

게임 내 오브젝트로 차단할 수있는 2D 조명을 갖고 싶습니다. 내 게임에는 하향식보기가 있으며 모든 게임 개체는 사각형으로 표시됩니다.

10×10 월드가 있고 1×1에 라이트를 배치하고 해당 라이트 주위에 벽을 배치한다고 가정하겠습니다. 1×1에서 광원을 볼 수 있기를 원하지만 벽에 의해 막혀 있기 때문에 다른 곳에서는 볼 수 없습니다.

나는 광선이 작동한다는 이야기를 들었지만 실제로 어떻게 작동합니까?



답변

Amit Patel은 2D 레이 캐스팅에 관한 매우 훌륭한 기사 를 작성 했습니다 .

여기에는 광원 범위 내의 각 정점에 광선을 캐스팅하여 라이트 메시를 만드는 과정이 포함됩니다.

모든 시각적 예는 게시물에서 대화식이며 이해하기 매우 쉽습니다.

상자에 자신을 제한 할 필요는 없습니다. 추적하는 경계선은 원하는 모양이 될 수 있습니다.


답변

당신은 사용해야 raycasting 알고리즘 당신은 당신의 장면에서 모든 개체와 선 (하프 라인)의 교차점을 계산 할 수 있어야한다, 수단 (선, 사각형, 원, 삼각형 ….)와 가장 가까운 교차로를 선택합니다. 광선을 모든 방향으로 투사 한 다음 가장 가까운 물체에만 “빛을 그립니다”.

다음 과 같이 보일 수 있습니다.


답변

레이 캐스팅이 무엇인지 아는 경우 실제로 하드 코딩하기 만하면됩니다. 각 정점에 대한 좌표가있는 한 지나치게 복잡하지 않습니다.

먼저 빛을 발산하는 물체를 만듭니다. x, y 좌표에 조명을 놓습니다.

#include <math.h>
int i = 0;
if ( sqrt( abs( light.x - vertex.x )^2 + abs( light.y - vertex.y )^2 ) <= light.radius)
{
    lightOccludingVertices[i] = vertex;
    i++;
}

//If two or more vertices are both a member of an individual wall,
//illuminate the triangular area between the light, the furthest 
//vertex on the x-axis, and the furthest vertex on the y-axis

이것은 오목한 다각형에는 적용되지 않지만 볼록한 다각형에는 적합합니다.

조명을 적용한 후 폐색 물체 (벽, 캐릭터, 날고있는 자주색 사람 먹는 사람)를 화면에 페인트하면이 기능이 작동합니다. 그렇지 않으면 벽의 절반이 다른 절반보다 훨씬 밝게 나타납니다. 포인트 라이트가 동일한 벽의 두 쌍의 꼭짓점에서 동일 거리에 있으면 (정확히 벽 높이의 절반) 삼각형을 멀리 떨어진 두 개의 꼭짓점에 적용하십시오.

또한이 방법을 사용하려면 빛의 반경 가장자리가 폐색 물체의 표면과 만나는 역동적으로 생성 된 정점이 필요 합니다. 이렇게하면 폐색 오브젝트에 대해 최소 3 개의 꼭짓점이 만들어지고 빛의 반경을지나 (또는 ​​화면 바깥쪽으로) 벽이 빛을 차단할 수 있습니다.

오목 및 볼록 다각형에 대한 추가 정보