Режим 7 - очень простой эффект. Он проецирует 2D х / у текстуру (или плитки) на некоторый пол / потолок. Старые SNES используют оборудование для этого, но современные компьютеры настолько мощны, что вы можете делать это в реальном времени (и, как вы упоминаете, не нуждаетесь в ASM).
Основная трехмерная математическая формула для проецирования 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. Я использую простую математику, потому что вы сказали, что хотите что-то простое (и, кажется, не знакомы с векторной математикой). Вы можете достичь того же, используя формулу Википедии или учебные пособия, которые вы даете. То, как они это сделали, намного сложнее, но у вас гораздо больше возможностей для настройки эффекта (в конце концов, он работает так же ...).
Для получения дополнительной информации я предлагаю прочитать: http://en.wikipedia.org/wiki/3D_projection#Perspective_projection