Existe-t-il une réponse courte sur la façon de faire un effet de type Mode 7 / Mario Kart dans Pygame?
J'ai beaucoup cherché sur Google, tous les documents que je peux trouver sont des dizaines de pages dans d'autres langues (asm, c) avec beaucoup d'équations étranges et autres.
Idéalement, je voudrais trouver quelque chose expliqué plus en anglais qu'en termes mathématiques.
Je peux utiliser PIL ou pygame pour manipuler l'image / la texture, ou tout ce qui est nécessaire.
J'aimerais vraiment obtenir un effet mode 7 en pygame, mais je semble proche de la fin de mon esprit. De l'aide serait grandement appréciée. Toutes les ressources ou explications que vous pouvez fournir seraient fantastiques, même si elles ne sont pas aussi simples que je le souhaiterais.
Si je peux le comprendre, je vais écrire une page définitive sur le mode 7 pour les débutants.
modifier: mode 7 doc: http://www.coranac.com/tonc/text/mode7.htm
Réponses:
Le mode 7 est un effet très simple. Il projette une texture 2D x / y (ou des tuiles) sur certains sols / plafonds. Les anciens SNES utilisent du matériel pour ce faire, mais les ordinateurs modernes sont si puissants que vous pouvez le faire en temps réel (et pas besoin d'ASM comme vous le mentionnez).
La formule mathématique 3D de base pour projeter un point 3D (x, y, z) vers un point 2D (x, y) est:
Quand on y pense, cela a du sens. Les objets éloignés sont plus petits que les objets près de chez vous. Pensez aux voies ferrées qui ne vont nulle part:
Si nous regardons en arrière les valeurs d'entrée de formule:
x
ety
sera le pixel actuel que nous traitons, etz
sera des informations de distance sur la distance du point. Pour comprendre ce quiz
devrait être, regardez cette image, elle montre lesz
valeurs de l'image ci-dessus:Donc, dans cet exemple, la
z
valeur esty - horizon
(en supposant qu'elle se(x:0, y:0)
trouve au centre de l'écran)Si nous mettons tout ensemble, cela devient: (pseudocode)
Une dernière chose: si vous voulez faire un jeu de mario kart, je suppose que vous voulez aussi faire pivoter la carte. Eh bien, c'est aussi très facile: faites pivoter
sx
etsy
avant d'obtenir la valeur de la texture. Voici la formule:et si vous voulez vous déplacer dans la carte, ajoutez simplement un décalage avant d'obtenir la valeur de la texture:
REMARQUE: j'ai testé l'algorithme (presque copier-coller) et cela fonctionne. Voici l'exemple: http://glslsandbox.com/e#26532.3 (nécessite un navigateur récent et WebGL activé)
NOTE 2: j'utilise des mathématiques simples parce que vous avez dit que vous vouliez quelque chose de simple (et que vous ne semblez pas familier avec les mathématiques vectorielles). Vous pouvez réaliser les mêmes choses en utilisant la formule wikipedia ou les tutoriels que vous donnez. La façon dont ils l'ont fait est beaucoup plus complexe mais vous avez beaucoup plus de possibilités pour configurer l'effet (au final ça marche de la même façon ...).
Pour plus d'informations, je suggère de lire: http://en.wikipedia.org/wiki/3D_projection#Perspective_projection
la source
Voici le code pour le faire. Je suis le même code du tutoriel que j'ai fait sur mon blog . Cochez là pour apprendre la méthode Mode 7 et le RayCasting.
Fondamentalement, le pseudo-code est le suivant:
Voici le code que j'ai fait en JAVA, suite à mon tutoriel.
Le résultat est:
la source