¿Existe una respuesta breve sobre cómo hacer un efecto de tipo Modo 7 / mario kart en pygame?
He buscado mucho en Google, todos los documentos que se me ocurren son docenas de páginas en otros idiomas (asm, c) con muchas ecuaciones de aspecto extraño y demás.
Idealmente, me gustaría encontrar algo más explicado en inglés que en términos matemáticos.
Puedo usar PIL o pygame para manipular la imagen / textura, o cualquier otra cosa que sea necesaria.
Realmente me gustaría lograr un efecto de modo 7 en pygame, pero parece estar cerca del final de mi ingenio. La ayuda sería muy apreciada. Cualquiera y todos los recursos o explicaciones que pueda proporcionar serían fantásticos, incluso si no son tan simples como me gustaría que fueran.
Si puedo resolverlo, escribiré una forma definitiva de cómo hacer el modo 7 para la página de novatos.
editar: modo 7 doc: http://www.coranac.com/tonc/text/mode7.htm
Respuestas:
El modo 7 es un efecto muy simple. Proyecta una textura 2D x / y (o mosaicos) en algún piso / techo. Los SNES antiguos usan hardware para hacer esto, pero las computadoras modernas son tan poderosas que puedes hacer esto en tiempo real (y no necesitas ASM como mencionas).
La fórmula matemática 3D básica para proyectar un punto 3D (x, y, z) en un punto 2D (x, y) es:
Cuando lo piensas, tiene sentido. Los objetos que están muy lejos son más pequeños que los objetos cercanos a usted. Piensa en las vías del ferrocarril que no van a ninguna parte:
Si miramos hacia atrás a los valores de entrada de la fórmula:
x
yy
será el píxel actual que estamos procesando, yz
será la información de distancia sobre qué tan lejos está el punto. Para entender lo quez
debería ser, mira esa imagen, muestraz
valores para la imagen de arriba:Entonces, en este ejemplo, el
z
valor esy - horizon
(suponiendo que(x:0, y:0)
esté en el centro de la pantalla)Si ponemos todo junto, se convierte en: (pseudocódigo)
Una última cosa: si quieres hacer un juego de Mario Kart, supongo que también quieres rotar el mapa. Bueno, también es muy fácil: girar
sx
ysy
antes de obtener el valor de la textura. Aquí está la fórmula:y si quieres moverte por el mapa, solo agrega algo de desplazamiento antes de obtener el valor de textura:
NOTA: probé el algoritmo (casi copiar y pegar) y funciona. Aquí está el ejemplo: http://glslsandbox.com/e#26532.3 (requiere navegador reciente y WebGL habilitado)
NOTA 2: uso matemáticas simples porque dijiste que quieres algo simple (y no pareces familiarizado con las matemáticas vectoriales). Puede lograr lo mismo utilizando la fórmula de Wikipedia o los tutoriales que ofrece. La forma en que lo hicieron es mucho más compleja, pero tiene muchas más posibilidades para configurar el efecto (al final funciona igual ...).
Para obtener más información, sugiero leer: http://en.wikipedia.org/wiki/3D_projection#Perspective_projection
fuente
Aquí está el código para hacerlo. Soy el mismo código del tutorial que hice en mi blog . Verifique allí para aprender el método del Modo 7 y RayCasting.
Básicamente, el pseudocódigo es:
Aquí está el código que hice en JAVA, siguiendo mi tutorial.
El resultado es:
fuente