Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Actualités


Index du Forum » Actualités » Starwars 3D: moteur de perspective open source.
Louloux Hors ligne Ancien administrateur Points: 7035 Défis: 61 Message

Starwars 3D: moteur de perspective open source.

Posté le 10/03/2012 16:06

J'ai posté aujourd'hui mon petit add-in Starwars 3D, réalisé en C.
Afin de guider ceux qui désirent mettre les pieds dans l'aventure de la perspective sur calculatrice, voici ici les explications du fonctionnement de ce moteur 3D.



Pour un moteur 3D, il est assez particulier puisqu'il affiche en fait des objets... 2D !
L'utilité ? Gagner considérablement en rapidité.

Pour l'organisation de l'espace, c'est simple: on le coupe en cases, et on utilise un tableau à trois dimensions: si il y a un vaisseau la case vaut 1, sinon 0.
La fonction d'affichage parcourt ce tableau et affiche un vaisseau si elle lit 1.

Les objets à afficher en perspective sont codés en un tableau à deux dimensions: les abscisses des points et leurs ordonnées.
Lorsqu'on veut afficher un objet on envoie ses trois coordonnées à une fonction qui le réduit d'un coefficient calculé à partir de la profondeur de l'objet, et l'affiche à l'écran.

Pour voir la structure du programme et mieux assimiler ces explications, téléchargez sur sa page le zip contenant les sources et ouvrez starwars.c.

Bonne lecture de mon petit code à tous !


Louloux Hors ligne Ancien administrateur Points: 7035 Défis: 61 Message

Citer : Posté le 10/03/2012 16:08 | #


Et n'hésitez pas à poser vos questions sur le code ici, et sur le jeu dans les commentaires du jeu.
Eiyeron Hors ligne Ancien modérateur Points: 5525 Défis: 57 Message

Citer : Posté le 10/03/2012 16:09 | #


Vectoriel?
Louloux Hors ligne Ancien administrateur Points: 7035 Défis: 61 Message

Citer : Posté le 10/03/2012 16:16 | #


De quoi ?
Pierrotll Hors ligne Ancien administrateur Points: 5488 Défis: 41 Message

Citer : Posté le 10/03/2012 16:24 | #


C'est bizarre de mettre les commentaires qui donnent des infos sur la fonction après la fonction

Pour les images de 128 pixels de large, il serait bien plus efficace de les copier avec un simple memcpy.

Globalement le code est bien commenté, mais pas très bien organisé, t'as des tableaux de données un peu partout.
Louloux Hors ligne Ancien administrateur Points: 7035 Défis: 61 Message

Citer : Posté le 10/03/2012 16:33 | #


Pourquoi un memcpy , J'ai pas besoin de copier des tableaux.

Mais c'est sûr mes codes ne valent pas les tiens...
Eiyeron Hors ligne Ancien modérateur Points: 5525 Défis: 57 Message

Citer : Posté le 10/03/2012 16:51 | #


C'est du vecto, les graphismes? (comme du xyLine en drawstat)
Cartix Hors ligne Membre Points: 2748 Défis: 98 Message

Citer : Posté le 10/03/2012 16:58 | #


Comment tu fais un tableau 3d ?
Avec plusieurs tableaux 2D ?
Totoyo Hors ligne Membre d'honneur Points: 16102 Défis: 102 Message

Citer : Posté le 10/03/2012 17:20 | #


Je pense qu'il utilise plusieurs tableaux 2D, chacun correspondant à une position Z (la profondeur).
Louloux Hors ligne Ancien administrateur Points: 7035 Défis: 61 Message

Citer : Posté le 10/03/2012 17:29 | #


Je fais un tableau à trois dimensions:
int exemple[A][C] avec A, B et C trois entiers positifs.
Adbook Hors ligne Membre Points: 1050 Défis: 39 Message

Citer : Posté le 10/03/2012 17:31 | #


Ok j'ai a peu près compris comment fonctionne l'affichage. Bien joué.
Eiyo: C'est un peu le même principe que du vectoriel sauf que c'est des points et pas des lignes.

Ajouté le 10/03/2012 à 17:33 :
Juste une question: pourquoi avoir mis \"espace\" en variable globale ?
--------------------------------------------------

Calculatrice: Graph 35+ (modifiée 75) + graph 75
Dead Labs est sorti ! N'hésitez pas à l'essayer et à voter !!!
Louloux Hors ligne Ancien administrateur Points: 7035 Défis: 61 Message

Citer : Posté le 10/03/2012 17:36 | #


Parce que le passage de tableaux à trois dimensions à des fonctions est souvent sources d'erreurs pour les pas doués comme moi
Adbook Hors ligne Membre Points: 1050 Défis: 39 Message

Citer : Posté le 10/03/2012 17:52 | #


Ça:

fonction(espace);

void fonction(int *espace)
{
    espace[x][y][z] = 0;
}

Ou ça:
fonction(&espace);

void fonction(int* *espace)
{
    *espace[x][y][z] = 0;
}

devrait fonctionner sans problème (théoriquement)
--------------------------------------------------

Calculatrice: Graph 35+ (modifiée 75) + graph 75
Dead Labs est sorti ! N'hésitez pas à l'essayer et à voter !!!
Louloux Hors ligne Ancien administrateur Points: 7035 Défis: 61 Message

Citer : Posté le 10/03/2012 18:11 | #


Dans la pratique on s'encombre avec des pointeurs. Si j'avais fait en C++ j'aurais mis une référence et l'utilisation aurait été normale, mais là je trouve pas ma solution trop sale.
Pierrotll Hors ligne Ancien administrateur Points: 5488 Défis: 41 Message

Citer : Posté le 10/03/2012 19:51 | #


@Louloux : La VRAM est un tableau, ton image est un tableau. Donc copier une image de 128 de large à l'abscisse 0 peut se faire avec memcpy, et ce sera bien plus rapide qu'avec une fonction de sprite qui est prévue pour gérer le clipping et des coordonnées quelconques.

@Catrix : Un tableau 2D est une liste de tableaux 1D. Un tableau 3D est une liste de tableaux 2D. etc

@Adbook : Non, t'es 2 codes sont faux.
Il y a 2 sortes de tableaux 2D en réalité. Un tableau 2D peut être :
-> Une liste de pointeurs vers des tableaux 1D, qui ne sont pas forcément à la suite dans la mémoire, et qui ne font pas forcément la même longueur.
-> Un tableau simple avec toutes les données à la suite mais qu'on a déclaré avec 2 dimensions.
Le premier est un pointeur de pointeur, le second un simple pointeur.

Exemple :
int a[] = {1, 2, 3};
int b[] = {4, 5, 6};
int* tableau_type1[2];
tableau_type1[0] = a;
tableau_type1[1] = b;
Ce tableau, je peux le passer à une fonction comme un simple pointeur de pointeur, et si dans la fonction j'écris tableau[1][2], elle saura que tableau[1] est un pointeur qui vaut b et donc qu'il faut prendre la case 2 du tableau b.

Si par contre je crée un tableau ainsi :
int tableau_type2[2][3] = { {1, 2, 3}, {4, 5, 6} };
Ici les 6 entiers sont à la suite les uns des autres dans la mémoire, et tableau_type2 est un pointeur sur la première case. Quand j'écris tableau_type2[1][2], le compilateur traduit ça tableau_type2[1*3+2], 3 étant la "largeur" du tableau. Cette "largeur" est indispensable pour se repérer dans un tableau de ce type. Si je veux passer ce tableau à une fonction, je peux lui passer comme un simple tableau 1D, mais si je veux qu'elle puisse également comprendre tableau_type2[1][2], il faut qu'elle aussi connaisse la "largeur" du tableau. Il faut donc écrire dans son prototype
void fonction(int tableau[][3]);
A noter que la première dimensions est facultative, seule la "largeur" est indispensable pour comprendre que tableau_type2[1][2] équivaut à tableau_type2[1*3+2].
Quand je dis que la fonction a besoin de cette information, en réalité c'est le compilateur qui en a besoin, pour compiler correctement la fonction.


KrtX Invité

Citer : Posté le 11/03/2012 00:39 | #


Ok. Merci pour m'explication
Purobaz Hors ligne Membre d'honneur Points: 2690 Défis: 110 Message

Citer : Posté le 11/03/2012 21:32 | #


Pour l'organisation de l'espace, étant donné que il y a juste à gérer la perspective, tu aurais pu faire plus simple il me semble.

En utilisant simplement un tableau 2D : tie[nbmax_de_chasseur][4]

On aurait donc un tableau de par exemple 6 colonnes pour 4 lignes.
La première ligne contient 1 si la colonne contient un chasseur tie sinon 0.
La deuxième ligne contient la coordonnées X du chasseur.
La troisième ligne contient la coordonnées Y du chasseur.
La quatrième ligne contient la coordonnées Z du chasseur.

Ensuite l'utilisation d'un tel tableau est très simple.
Tu choisis un nombre aléatoire de chasseur. Tu affectes les colonnes, puis à chaque itération tu augmentes la quatrième ligne.
Si elle est égale à celle du X-wing, tu check et tu supprimes la colonne en mettant 0 dans la première case.

Je sais pas si je me suis bien exprimé, mais c'est très similaire à ce qu'on pourrait faire en basic. Ca évite de devoir consulter tout l'espace à chaque fois.
I'll be back !
pour plus de fun
mes programmes fun
de technique
mes projets
et de Swag
les projets que je soutiens
Louloux Hors ligne Ancien administrateur Points: 7035 Défis: 61 Message

Citer : Posté le 12/03/2012 17:14 | #


C'est effectivement un moyen, mais on perd en clarté, et la vitesse ne manque pas j'ai mis un ralentisseur
En tout cas merci pour ta collaboration et tes idées.
Nitrosax Hors ligne Ancien rédacteur Points: 1061 Défis: 17 Message

Citer : Posté le 13/03/2012 13:04 | #


Je trouve ton jeu plutôt bien fait et les graphismes sont sympathiques.

Par contre, je rejoins les autres, les vaisseaux arrivent vraiment trop vite, et on se lasse de perdre aussi rapidement.
Limachi Hors ligne Youtuber Points: 2798 Défis: 67 Message

Citer : Posté le 13/03/2012 13:53 | #


je vais le tester, ces commentaires piquent ma curiositée
Mes Programmes
Cliquer pour enrouler
-en basic: un programme nommé PICFMLIM convertissant une picture en code basic.
-en C:
-Un pong.
-Un projet en pause. Je compte le reprendre de temps en temps: Summer Cursed


-mon tuto sur les Str


Mes calto: G25+, G75
Mon minecraft en dévelopement


Projets et Programmes que je soutiens (sur une idée de Marmotti)
Cliquer pour enrouler
-Pokemon Jade de Dodormeur
-Portal2D de JavierXD
-CalCraft de Wime
-GeekBros du groupe GeekBrothers (Eiyeron,Siapran,KevKevVTT,Adbook,LIMachi)

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 285 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd