모드 7 은 매우 간단한 효과입니다. 2D x / y 텍스처 (또는 타일)를 일부 바닥 / 천장에 투사합니다. 구식 SNES는이를 위해 하드웨어를 사용하지만 최신 컴퓨터는 너무 강력하여이 실시간을 수행 할 수 있습니다 (앞서 언급 한대로 ASM 필요 없음).
3D 점 (x, y, z)을 2D 점 (x, y)으로 투영하는 기본 3D 수학 공식은 다음과 같습니다.
x' = x / z;
y' = y / z;
당신이 그것에 대해 생각할 때, 그것은 의미가 있습니다. 멀리있는 물체는 가까운 물체보다 작습니다. 철도 트랙이 어디에도 없는지 생각해보십시오.
우리는 수식 입력 값 회고 경우 x
와 y
우리는 처리중인 현재 화소 될 것이며, z
포인트가 얼마나 대한 거리 정보가 될 것이다. 무엇이 z
있어야 하는지 이해하려면 해당 그림을 보면 z
위의 이미지 값 이 표시 됩니다.
자주색 = 근거리, 적색 = 멀리
따라서이 예에서 z
value는 y - horizon
( (x:0, y:0)
화면 중앙에 있다고 가정 )
모든 것을 합치면 다음과 같이됩니다. (의사 코드)
for (y = -yres/2 ; y < yres/2 ; y++)
for (x = -xres/2 ; x < xres/2 ; x++)
{
horizon = 20; //adjust if needed
fov = 200;
px = x;
py = fov;
pz = y + horizon;
//projection
sx = px / pz;
sy = py / pz;
scaling = 100; //adjust if needed, depends of texture size
color = get2DTexture(sx * scaling, sy * scaling);
//put (color) at (x, y) on screen
...
}
마지막으로 마리오 카트 게임을 만들고 싶다면지도를 회전하고 싶을 것입니다. 그럼 그 또한 매우 간단합니다 : 회전 sx
및 sy
텍스처 값을 얻기 전에. 공식은 다음과 같습니다.
x' = x * cos(angle) - y * sin(angle);
y' = x * sin(angle) + y * cos(angle);
그리고 맵을 통해 이동하려면 텍스처 값을 얻기 전에 오프셋을 추가하십시오.
get2DTexture(sx * scaling + xOffset, sy * scaling + yOffset);
참고 : 알고리즘 (거의 복사 붙여 넣기)을 테스트했으며 작동합니다. 예를 들면 다음과 같습니다. http://glslsandbox.com/e#26532.3 (최신 브라우저 및 WebGL 사용 가능)
NOTE2 : 나는 당신이 간단한 것을 원한다고 말했기 때문에 간단한 수학을 사용합니다 (벡터 수학에 익숙하지 않은 것 같습니다). 당신이 제공하는 위키피디아 공식이나 튜토리얼을 사용하여 같은 것을 달성 할 수 있습니다. 그들이했던 방식은 훨씬 더 복잡하지만 효과를 구성 할 수있는 가능성이 훨씬 더 많습니다 (결국 동일하게 작동합니다 ...).
자세한 내용은 http://en.wikipedia.org/wiki/3D_projection#Perspective_projection을 참조하십시오 .