Есть ли такая вещь, как краткий ответ о том, как сделать эффект типа 7 / mario kart в pygame?
Я много гуглил, все документы, которые я могу придумать, - это десятки страниц на других языках (asm, c) с множеством странно выглядящих уравнений и тому подобное.
В идеале я хотел бы найти что-то объясненное больше на английском языке, чем в математических терминах.
Я могу использовать PIL или Pygame, чтобы манипулировать изображением / текстурой, или чем-то еще необходимым.
Я бы очень хотел добиться эффекта режима 7 в пигмеях, но мне кажется, что я близок к концу. Помощь будет принята с благодарностью. Любые ресурсы или объяснения, которые вы можете предоставить, были бы фантастическими, даже если бы они не были такими простыми, как мне бы того хотелось.
Если я смогу это выяснить, я напишу окончательный вариант, как сделать режим 7 для страницы новичков.
редактировать: режим 7 документ: http://www.coranac.com/tonc/text/mode7.htm
Ответы:
Режим 7 - очень простой эффект. Он проецирует 2D х / у текстуру (или плитки) на некоторый пол / потолок. Старые SNES используют оборудование для этого, но современные компьютеры настолько мощны, что вы можете делать это в реальном времени (и, как вы упоминаете, не нуждаетесь в ASM).
Основная трехмерная математическая формула для проецирования 3D-точки (x, y, z) в 2D-точку (x, y):
Когда вы думаете об этом, это имеет смысл. Объекты, которые находятся на большом расстоянии, меньше, чем объекты рядом с вами. Думайте о железнодорожных путях, идущих в никуда:
Если мы оглянемся на входные значения формулы:
x
иy
будет текущий пиксель, который мы обрабатываем, иz
будет информацией о расстоянии до того, как далеко находится точка. Чтобы понять, чтоz
должно быть, посмотрите на это изображение, оно показываетz
значения для изображения выше:Так что в этом примере
z
значение равноy - horizon
(при условии, что оно(x:0, y:0)
находится в центре экрана)Если мы соберем все вместе, то получится: (псевдокод)
И напоследок: если вы хотите сделать игру для Марио-картов, я думаю, вы также хотите повернуть карту. Ну, это тоже очень просто: повернуть
sx
иsy
до получения значения текстуры. Вот формула:и если вы хотите перемещаться по карте, просто добавьте некоторое смещение, прежде чем получить значение текстуры:
ПРИМЕЧАНИЕ: я проверил алгоритм (почти копировать-вставить), и он работает. Вот пример: http://glslsandbox.com/e#26532.3 (требуется недавний браузер и включенный WebGL)
ПРИМЕЧАНИЕ 2. Я использую простую математику, потому что вы сказали, что хотите что-то простое (и, кажется, не знакомы с векторной математикой). Вы можете достичь того же, используя формулу Википедии или учебные пособия, которые вы даете. То, как они это сделали, намного сложнее, но у вас гораздо больше возможностей для настройки эффекта (в конце концов, он работает так же ...).
Для получения дополнительной информации я предлагаю прочитать: http://en.wikipedia.org/wiki/3D_projection#Perspective_projection
источник
Вот код, чтобы сделать это. Я тот же код учебника, который я сделал в своем блоге . Проверьте там, чтобы узнать метод Mode 7 и RayCasting.
По сути, псевдокод таков:
Вот код, который я сделал в JAVA, следуя моему уроку.
Результат:
источник