2D 아이소 메트릭 게임에서 실시간 그림자 캐스팅


15

C ++로 작은 2D 아이소 메트릭 엔진을 작성 중이며 실시간 그림자 캐스팅을 구현하려고합니다. 이 페이지에 설명 된 간단한 접근법을 따르고 결과는 다음과 같습니다 (빛은 노란색 큐브와 동일한 위치에 있습니다).

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

결과는 매우 좋지만 벽과 큐브 상단에 그림자가 없습니다. 다음은 어떻게 보일지에 대한 예입니다 (예상 그림자를 녹색으로 그립니다).

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

그려진 모든 큐브는 XY 위치에 Z 깊이 (z = x + y) 인 3 개의 2D 쿼드로 간단히 만들어집니다. 직교 행렬 (glOrtho)과 함께 OpenGL을 사용합니다. 스텐실 버퍼를 사용하여 그림자를 그립니다.

이 섀도 캐스팅 구현을 완료하는 데 도움이되는 리소스 또는 솔루션을 찾고 있습니다.

고마워요!


5
"이 페이지"에 대한 링크가 페이지가 아니라 이미지를 가리키고 있습니다. 또한, 나는 여기서 추측하고 있지만 3D로 문제를 해결하고 카메라를 등각 투영하는 것이 더 쉬울 수 있습니다.
Tetrad

웁스, 당신 말이 맞아요 확실히 3D 프로젝션을 사용하면 더 쉬울 수 있지만 2D에도 장점이 있으며이를 2D로 구현하는 솔루션이 있다고 확신합니다.
XPac27

답변:


6

지붕과 벽의 경우 벽 세그먼트와 생성 된 그림자 영역 사이의 교차점을 결정하려고 시도 할 수 있습니다. 그림자를 두 번 패스 렌더링해야합니다. 첫 번째는 현재 메모리 저장소에서 수행하는 작업을 수행합니다. 두 번째 패스는 지붕과 벽의 교차점을 계산합니다. 마지막 단계는 실제 렌더링입니다. DeadMG가 잘못되었습니다. 그렇게 할 수 있습니다.

참고 : 지붕의 경우 그림자 영역과 지붕 영역을 교차해야합니다.


좋은 조언을 주셔서 감사합니다! 그림자 세그먼트와 비교하여 세그먼트의 내적을 사용하여 계산해야하는 벽을 확인하여이 두 번째 패스를 최적화 할 수 있습니다. 나는 그것을 시도하고 그것이 작동하면 다시 게시 할 것입니다.
XPac27

시간이 지났지 만 당신의 제안 덕분에 마침내 작동하게되었습니다! 나는 2 개의 지오메트리 메소드 (하나는 점이 다각형 내에 있는지, 하나는 두 세그먼트의 교차점을 얻는 지 아는 것) 만 필요했습니다. 여전히 지붕을 다룰 필요가 있지만 쉽게 알 수 있습니다. 이 비디오 에서 결과를 보고 여기 에서 소스 코드를 볼 수 있습니다 (1 일 동안 작업하여 더 최적화 할 수 있음).
XPac27

@ XPac27 정말 놀랍습니다. 공유해 주셔서 감사합니다.
ashes999

0

근본적으로, 당신이 찾고있는 것은 할 수 없습니다. 많은 2D 객체를 가져와 마치 3D 객체 인 것처럼 그림자를 드리 우려 고합니다. 전체 3D 그림자를 원한다면 3D 객체가 있어야합니다.


1
그러나 그것은 질문에서와 같이 3D 그림자 캐스팅이 아닙니다. 모든 벽은 해당 방향으로 시야를 완전히 차단하므로 높이가 다양한 물체를 가질 수 없습니다.
yuriks

0

설명 된 솔루션은 전체 3D 솔루션이 필요하지 않으므로 전체 3D가 아닙니다. 모양은 같지만 그렇지 않습니다. 섀도 캐스팅 생성은 볼륨 간의 교차로 간주해야합니다. 그가 필요한 것은 덜 복잡합니다. 렌더링 엔진과 같은 운명과 운명을 기억하십시오. 모든 처리는 2 차원으로 이루어졌다.


0

이 게임을 작게 만들고 싶다면 현재 그림자 구현이 충분하다고 말하는 것은 어떻습니까?

나는 이것이 실제로 행동하는 것을 보지 못했다는 것을 인정한다. 하지만 이미지에서 판단 m "좋아, 이제 게임을 끝내는 데 집중하라"고 말하고 싶은 마음이 들었습니다. 현재 구현이 작고 빠르게 실행되고 문제가 있다고 인식하는 것이 코드를 크게 느리게 만들면 그림자에 대해 걱정하지 않는 것이 좋습니다.

나는 문제에 대한 해결책이 나쁜 습관 일 수 있기 때문에 "문제를 해결하려고하지 말라"는 것을 안다. 여전히 솔직히 말해서 코드에 작은 공간을 원한다면 실제로 좋다고 말하고 싶습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.