IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement 2D, 3D et Jeux Discussion :

Quel calcul pour le Mode7


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut Quel calcul pour le Mode7
    Tout est dans le titre , je me demande comment on peut avoir une perspective en faisant des zoom sur les lignes , en faite je sais faire mais les calcul que j'avais effectuer n'ont pas marché du coup je n'ai aucun idée du calcul mathématique qu'il faut faire :/
    J’espère que ici quelqu'un a une idée vu que moi je sèche la ^^
    Donc j'ai décidé d'y aller de manière empirique c'est long et fastidieux mais au moins j'ai un peu une idée du résultat attendu.
    Cela fait un moment que je suis dessus donc du coup je me demande si j'ai pas besoin d'un petit recul pour réussir

    Voila un screen :

    Il faut regarde le bas , pas le haut (je remplacerais ceci par un jolie ciel bleu je présume).

    Ma première semaine de test je faisais les calcul en asm et c'était vraiment très pénible avec l'assembleur de la SNES (assez limité pour faire des calcul a vrai dire).
    Pour tes raisons de facilité j'ai décidé de precalculer tout ça en C et de test , donc voici la code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    #include <time.h>
     
     
    int main(int argc, char** argv)
    {
        int i;
     
        FILE *fichier;
        fichier = fopen("main.smc","rb+");
     
        if(fichier == NULL) return 0;
     
        char chaine[200];
        int bt = 0;
        int n,zoom,sub;
     
        fseek(fichier,0x8000*14,SEEK_SET);
     
        //on commence a cet valeur de zoom
        zoom = 0x278;
        for(i = 0; i < 0x80;i++) //0x80 soit 128 ligne
        {
            //n c'est 8 lines
            n = i/8;
     
            // valeur completement arbitraire
            if(n == 0) sub = 0x10;
            if(n == 1) sub = 0x0C;
            if(n == 2) sub = 0x08;
            if(n == 3) sub = 0x06;
            if(n == 4) sub = 0x05;
            if(n == 5) sub = 0x04;
            if(n == 6) sub = 0x03;
            if(n == 7)
            {
                //Nt : pour simuler la virgule ici c'est 2.5
                bt++;
                if(bt == 2) bt = 0;
     
     
                if(bt == 0) sub = 0x02;
                else sub = 0x03;
            }
            if(n == 8) sub = 0x02;
     
     
            if(n == 9)
            {
                bt++;
                if(bt == 4) bt = 0;
     
     
                if(bt == 0) sub = 0x01;
                else sub = 0x02;
            }
     
            if(n == 10)
            {
                bt++;
                if(bt == 3) bt = 0;
     
     
                if(bt == 0) sub = 0x01;
                else sub = 0x02;
            }
     
            if(n == 11)
            {
                bt++;
                if(bt == 2) bt = 0;
     
     
                if(bt == 0) sub = 0x02;
                else sub = 0x01;
            }
     
            if(n == 13)
            {
                bt++;
                if(bt == 3) bt = 0;
     
     
                if(bt == 0) sub = 0x02;
                else sub = 0x01;
            }
            if(n == 15)
            {
                bt++;
                if(bt == 4) bt = 0;
     
     
                if(bt == 0) sub = 0x02;
                else sub = 0x01;
            }
     
            if(n == 16) sub = 0x01;
     
            fputc(zoom&0xFF,fichier);
            fputc((zoom>>8)&0xFF,fichier);
            printf("%d\n",zoom);
     
            zoom -= sub;
     
        }
     
        fclose(fichier);
     
        return 0;
    }
    La variable zoom ces valeurs correspond a que 0X100 (256) ne fait aucun zoom , en faire cela n'est pas tout a fait une valaur de zoom mais l'indication du nombre de pixel sur une ligne.
    Je m'explique si zoom = 256 , et on a une résolution sur SNES de (256x224) , ben 256 pixel sur 256 ben on a aucun zoom , par exemple si zoom = 512 , on a un équivalent de 0.5 (vu qu'on demande d'afficher 512 pixel sur 256 de réso).
    Et donc un 0x80 (128) on a un x2 en zoom.

    Par observation je dirait que le fond est un zoom sur 0x300 et le devant de 0x60.
    Un zoom lineaire ne marche pas deja testé ^^

    La difficulté supplémentaire c'est cette basse résolution , je dois faire la perspective sur 128 pixel :/ (et le reste 128 pour le ciel).
    Et donc les résultats doit être assez 'précis' , surtout qu'on est la ligne est proche de l'écran il faut que les valeurs soit toujours différente (je dirait que -1 est le minimum).

    Si vous testez vous remarquez une légère ''bosse' mais j'ai parce que j'ai pas mal frignolé les valeurs , mais a la base c'était beaucoup plus marqué.

    Pour ceux qui veulent compiler+test (la rom du jeu est include) :
    http://www.mediafire.com/download/nc.../snesmode7.zip
    NT : si vous avez code block + linux compiler et exécuter lancera l'émulateur snes9x (si vous l'avez) sur windows faudra changer la config de C::B ou de choisir l"émulateur de votre choix manuellement.

    Voila

  2. #2
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Hello,

    Citation Envoyé par Kannagi Voir le message
    Un zoom lineaire ne marche pas deja testé ^^
    Bizarre, j'aurais pensé que le théorème de Thalès s'appliquait ici (et donc zoom linéaire).

    Sinon tu peux partir du calcul classique pour un rendu 3D (matProj*matView) pour projeter ton terrain (= plan horizontal).
    Ya surement moyen de bien simplifier les calculs pour éviter les multiplications de matrices vu que tu as beaucoup de constantes.

  3. #3
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Le zoom linaire c'est le premier truc que j'ai testé
    Enfaîte si on observe bien le zoom est beaucoup plus marqué au fond , que devant.


    Sinon tu peux partir du calcul classique pour un rendu 3D (matProj*matView) pour projeter ton terrain (= plan horizontal).
    Ya surement moyen de bien simplifier les calculs pour éviter les multiplications de matrices vu que tu as beaucoup de constantes.
    Je ne comprend pas , pour moi une matrice de projection c'est pour la caméra , sauf si cela me permet de connaître le zoom sur chaque ligne ?.
    On fait il me faudrait surtout un calcul pour savoir quel zoom j'applique sur ma ligne , donc oui j'aurais si tu veux une matrice constante , cela ne m'indique pas le calcul a effectuer aux zoom je pense.

    J'ai test un nouveau calcul :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    zoom = 0x200+0x200;
        for(i = 0; i < 0x80;i++) //0x80 soit 128 ligne
        {
     
     
            sub = zoom/55;
     
            //ce code ne sert a écrire que sur la  rom
            fputc(zoom&0xFF,fichier);
            fputc((zoom>>8)&0xFF,fichier);
     
            zoom -= sub;
     
        }
    résultat : http://pixelretro.hebergratuit.net/NesBox/m7.html

    Je pense que le zoom vertical et horizontal ne doit pas être pareil si on veut avoir un résultat de perspective.


    Edit : enfaite il faut bien un zoom lineaire(donc merci a toi de me le reconfirmer)mais je pense que c'est 'visuel' mais en tout cas niveau valeur faire un zoom du genre 100,99,98,97 ect ne marche pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    zoom = 0x200;
        float div = zoom*0.062; ;angle
        int ozoom;
        float pr,tzoom = zoom;
     
        for(i = 0; i < 0x80;i++) //0x80 soit 128 ligne
        {
     
            sub = zoom/div;
     
            pr = ((float)zoom/tzoom);
     
            octet[i] = zoom;
     
            ozoom = zoom;
            fputc(ozoom&0xFF,fichier);
            fputc((ozoom>>8)&0xFF,fichier);
            printf("$%x %f %f\n",ozoom,pr,pl);
     
            zoom -= (sub  *pr);
     
        }
    (par contre ça va être chaud pour faire le calcul en soft).
    resultat : http://pixelretro.hebergratuit.net/NesBox/m7_2.html
    Je pense que je tient le bon bout

  4. #4
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Je met le probleme en résolu finalement , j'ai résolu mon probleme tout seul comme un grand , même si je ne connais absolument pas le type de mathématique que j'ai utilisé pour faire de la perspective , j'avais lu que pour le mode 7 il fallait faire de l'algébre linaire au final je n'en ai pas fait (ou alors j'en ai fait sans le savoir ? ).
    On tout cas si quelqu'un a un type de calcul optimisé (donc d'éviter mes multiplication/division a tout va ^^) , je suis preneur .
    Si je dois fait ce calcul niveau soft je dois faire un multiplication/division sur 3 octet (2 pour l'entier et 1 pour la virgule) , sur un processeur 16 bits , pas la joie c'est ma petite idée pour mais assez lourd en calcul.

  5. #5
    Expert éminent
    Avatar de Vetea
    Homme Profil pro
    Technicien Test - Maintenance - Production - BE dans une PME d'electronique
    Inscrit en
    Février 2005
    Messages
    2 061
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Test - Maintenance - Production - BE dans une PME d'electronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2005
    Messages : 2 061
    Points : 6 443
    Points
    6 443
    Par défaut
    J'ai rien compris, mais le résultat est là ... Alors Bravo !!
    Développeur - Créateur Amateur de Jeux vidéos
    Visitez ma page dédiée
    Visitez mon espace Itch.io
    Mon canal Discord

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Quel langage pour un programme simple de calcul ?
    Par touche2clavier dans le forum Langages de programmation
    Réponses: 18
    Dernier message: 19/11/2007, 12h08
  2. Quel langage d'avenir simple choisir pour du calcul, pour Windows et Linux ?
    Par c-paspire dans le forum Langages de programmation
    Réponses: 26
    Dernier message: 09/03/2007, 11h46
  3. Quel langage pour automatiser des calculs acoustiques ?
    Par michael.mytnik dans le forum Langages de programmation
    Réponses: 5
    Dernier message: 04/01/2007, 18h51
  4. Quel Outil pour les applis Industrielles ET bases de données
    Par ThierryAIM dans le forum Débats sur le développement - Le Best Of
    Réponses: 8
    Dernier message: 23/04/2003, 09h14
  5. Quel outil pour du développement Client/Serveur (Win XP) ?
    Par jey_bonnet dans le forum Débats sur le développement - Le Best Of
    Réponses: 5
    Dernier message: 02/11/2002, 14h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo