Режим 7 - це дуже простий ефект. Він проектує 2D x / y текстури (або плитки) на деякий підлогу / стелю. Старі SNES використовують для цього обладнання, але сучасні комп’ютери настільки потужні, що ви можете це робити в режимі реального часу (і немає потреби в ASM, як ви згадуєте).
Основна 3D-математична формула для проектування 3D-точки (x, y, z) на 2D-точку (x, y):
x' = x / z;
y' = y / z;
Коли ви думаєте про це, це має сенс. Об'єкти, які знаходяться на відстані, менші, ніж об'єкти поблизу. Подумайте про залізничні колії, які йдуть нікуди:
Якщо ми поглянемо на вхідні значення формули: x
і y
буде поточним пікселем, який ми обробляємо, і z
буде інформація про відстань про те, наскільки далеко знаходиться точка. Щоб зрозуміти, що z
має бути, подивіться на цю картинку, вона показує z
значення для зображення вище:
фіолетовий = близька відстань, червоний = далеко
Отже, у цьому прикладі z
значення є 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)
ПРИМІТКА2: Я використовую просту математику, тому що ви сказали, що хочете чогось простого (і не здається знайомим з векторною математикою). Ви можете домогтися тих самих речей, використовуючи формулу wikipedia або підручники, які ви даєте. Те, як вони це зробили, набагато складніше, але у вас є набагато більше можливостей для налаштування ефекту (врешті-решт, він працює так само ...).
Для отримання додаткової інформації пропоную прочитати: http://en.wikipedia.org/wiki/3D_projection#Perspective_projection