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 - Discussions


Index du Forum » Discussions » Question sur le raycasting
Mactul Hors ligne Membre Points: 699 Défis: 0 Message

Question sur le raycasting

Posté le 25/03/2019 19:45

Hello, Merci à tous ceux qui ont répondus à mon précédent topic: Test perspectives 3D besoin d'un avis
Comme le sujet à sérieusement dévié sur le raycasting, voici un topic dédié spécialement

Voilà postez touts les liens sur le sujet que vous trouvez et posez vos questions

lien de Disperseur: https://www.planet-casio.com/Fr/forums/topic14655-1-Les_espaces_3D_(coder).html ?
lien de Lightmare: http://projet-moteur-3d.e-monsite.com/pages/raycasting/raycasting.html
lien de Kikoodx: https://lodev.org/cgtutor/raycasting.html
lien de Disperseur: https://guy-grave.developpez.com/tutoriels/jeux/doom-wolfenstein-raycasting/#
lien de Kikoodx: https://en.m.wikipedia.org/wiki/Digital_differential_analyzer_(graphics_algorithm)

projet de Disperseur: https://www.planet-casio.com/files/forums/RCMOT001-164244.zip
projet C de Disperseur (à voir absolument): https://www.planet-casio.com/files/forums/RCMOT004-164576.g1a
projet C-Basic de Lightmare: https://www.planet-casio.com/files/forums/RAYCAST2-164505.g3m

algorithme DDA de Lightmare: https://www.planet-casio.com/files/forums/DDA-164671.g1m
Je posterais ici tout vos liens


Précédente 1, 2, 3, 4, 5, 6, 7 Suivante
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 27/03/2019 17:04 | #


Ah oui, il n'y as pas d'erreur de compile, le programme en C n'as pas le même résultat que celui en Basic et pourtant il me semble n'avoir rien oublié

Ajouté le 27/03/2019 à 17:10 :
En fait il y a ma map stockée dans le tableau du début du programme (tableau "map" et matrice A pour le prgm basic). J'ai mon personnage qui peut se déplacer à l'écran et dans le tableau/matrice en même temps (écran et tableau/matrice on la même taille de 21*7) et le programme affiche les "murs" (représentés pas les "1" dans mon tableau/matrice) qui se trouvent dans un chap de vision allant de -30° à 30° par rapport à la direction dans laquelle regarde mon personnage. Ces murs sont représentés à l'écran par de simples "1". Le tout en radians. (pour les -30° et 30° j'ai pris -1/6*PI et 1/6*PI).
Kikoodx Hors ligne Ancien labélisateur Points: 3038 Défis: 11 Message

Citer : Posté le 27/03/2019 17:12 | #


double r = 0, angleCam = 0, camX = 15, camY = 4, distRayon = 0, angleRayon = 0 ;

Oof.

Sinon ça vient probablement du fait que ton tableau n'est pas un tableau
Tableau : map[2][3] = {{1,2,3},{1,2,3}}
Pas tableau : map[2][3] = {1,2,3,1,2,3}
ouais ouais
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 27/03/2019 17:13 | #


Ah... et pourquoi
Kikoodx a écrit :
double r = 0, angleCam = 0, camX = 15, camY = 4, distRayon = 0, angleRayon = 0 ;

Oof.

?
Je suis plus ou moins débutant en C, je ne connais pas toutes les astuces
Kikoodx Hors ligne Ancien labélisateur Points: 3038 Défis: 11 Message

Citer : Posté le 27/03/2019 17:15 | #


Je ne connais pas le C, mais je pense que déclarer plusieurs variables sur une seule ligne n'est pas le plus lisible, surtout que c'est un langage compilé.
ouais ouais
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 27/03/2019 17:19 | #


Ca ne m'affiche toujours pas ce que je souhaite.

Edit: J'ai oublié de dire que ma rotation ne fonctionnait pas.. je pense que les deux sont liés..
Ajouté à cela, je ne sais pas pourquoi mais les conditions qui se trouvent après les deux utilisées pour avancer et reculer ne fonctionnent pas.. les touches ne répondent pas ?

Edit: Voici le code maj:
#include "fxlib.h"
#include "MonochromeLib.h"
#include "math.h"

//****************************************************************************
//  AddIn_main (Sample program main function)
//
//  param   :   isAppli   : 1 = This application is launched by MAIN MENU.
//                        : 0 = This application is launched by a strip in eACT application.
//
//              OptionNum : Strip number (0~3)
//                         (This parameter is only used when isAppli parameter is 0.)
//
//  retval  :   1 = No error / 0 = Error
//
//****************************************************************************
int AddIn_main(int isAppli, unsigned short OptionNum)
{
    double PI = 3.1415926535897932;
    double r = 0, angleCam = 0, camX = 15, camY = 4, distRayon = 0, angleRayon = 0 ;
    unsigned int key;

    int map[7] [21] =
    {{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},    
    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};

    ML_clear_vram();

    do{
    ML_clear_vram();
    ML_clear_screen();

    //Calculs de deplacements
    camX = camX+r*(cos(angleCam));
    camY = camY+r*(sin(angleCam));
    r = 0;
    
    //Personnage
    locate(camX, camY);
    Print((unsigned char*)"+");
    
    //Rayons de detection
    for(angleRayon = angleCam-(1/6*PI); angleRayon<angleCam+(1/6*PI); angleRayon = angleRayon+(1/60*PI))
    {
        for(distRayon = 0; distRayon<20; distRayon++)
        {
            if(map[(int) (distRayon*sin(angleRayon)+camY)] [(int) (distRayon*cos(angleRayon)+camX)] == 1)
            {
                locate((int)(distRayon*cos(angleRayon)+camX), (int)(distRayon*sin(angleRayon)+camY));
                Print((unsigned char*)"1");
                break;
            }
        }
    }

    ML_display_vram();

    while(GetKey( &key)){return 0;}

    //Commandes
    if(IsKeyDown(KEY_CTRL_UP))
    {
        r++;
    }
    if(IsKeyDown(KEY_CTRL_DOWN))
    {
        r--;
    }
    if(IsKeyDown(KEY_CTRL_F1))
    {
        angleCam = angleCam+(1/4*PI);
        //locate(1,1);
        //Print((unsigned char*)"OK");
    }
    if(IsKeyDown(KEY_CTRL_F6))
    {
        angleCam = angleCam-(1/4*PI);
    }

    }while (! IsKeyDown(KEY_CTRL_MENU));
    
    return 1;
}

Lephenixnoir En ligne Administrateur Points: 24563 Défis: 170 Message

Citer : Posté le 27/03/2019 19:15 | #


Kikoodx a écrit :
Tableau : map[2][3] = {{1,2,3},{1,2,3}}
Pas tableau : map[2][3] = {1,2,3,1,2,3}

Correction. Tableau à deux dimensions : map[2][3] = {{1,2,3},{1,2,3}}
Tableau à une dimension : map[2][3] = {1,2,3,1,2,3}

Ta gestion des touches est cassée, GetKey() est une fonction qui attend que toutes les touches soient relâchées, puis qu'une touche soit pressée avant de se terminer. De plus le pointeur passé en paramètre reçoit le numéro de la touche. Il faut donc écrire :

     GetKey(&key);

    //Commandes
    if(key == KEY_CTRL_UP)
    {
        r++;
    }
    if(key == KEY_CTRL_DOWN)
    {
        r--;
    }
    if(key == KEY_CTRL_F1)
    {
        angleCam = angleCam+(1/4*PI);
        //locate(1,1);
        //Print((unsigned char*)"OK");
    }
    if(key == KEY_CTRL_F6)
    {
        angleCam = angleCam-(1/4*PI);
    }

    }while (key != KEY_CTRL_EXIT);

J'ai changé la condition de sortie de MENU à EXIT car, si tu appuies sur MENU pendant un appel à GetKey(), cela te ramène automatiquement au menu principal.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 27/03/2019 19:21 | #


Alors c'est mon code qui ne vas pas, quand je presse F1 ou F6, aucune rotation n'est effectuée
Kikoodx Hors ligne Ancien labélisateur Points: 3038 Défis: 11 Message

Citer : Posté le 27/03/2019 23:10 | #


Lephenixnoir a écrit :
Correction. Tableau à deux dimensions : map[2][3] = {{1,2,3},{1,2,3}}
Tableau à une dimension : map[2][3] = {1,2,3,1,2,3}

Désolé... Maintenant j'éviterai d'affirmer des informations sur des langages que je comprends mal
ouais ouais
Sentaro21 Hors ligne Membre Points: 878 Défis: 0 Message

Citer : Posté le 28/03/2019 14:45 | # | Fichier joint


@Disperseur
I found something to be fixed.

Here the value is zero.
1/6*PI
1/60*PI
1/4*PI

Correctly as follows.
1.0/6*PI
1.0/60*PI
1.0/4*PI


and more,
for(distRayon = 0; distRayon<20; distRayon ++)

Correctly as follows.
for(distRayon = 0; distRayon<=20; distRayon ++)


The array of C has an index start value of 0.
So adjusted the array.

Here is the corrected source.
[Fichier joint]Test3D.c
Je continue à développer C.Basic. (Il est compatible avec Basic Casio.)
Overclocking utilitaire Ftune/Ptune2/Ptune3 est également disponible.
Si vous avez des questions ou un rapport de bogue, n'hésitez pas à me le faire savoir.
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 28/03/2019 17:31 | #


Je suis parvenu à passer le programme en Basic en C. Merci à Sentaro21 et aux autres pour leur aide
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 28/03/2019 18:16 | # | Fichier joint


Voici en fichier joint le programme dans son état actuel en C et en Basic.
Si possible Mactul, passe ce fichier en tête du topic stp

PS:
Le programme en C est SH3
Mactul Hors ligne Membre Points: 699 Défis: 0 Message

Citer : Posté le 28/03/2019 19:00 | #


OK disperseur j'ajoute ton prog en tête de liste
Et avec plaisir!
Mes programmes
Cliquer pour enrouler

Venez me rejoindre sur mon nouveau serveur Discord dédié a la programmation sur toutes les plateformes
https://discord.gg/bzfymHQ

Venez vous instruire, dans ce magnifique cours sur les Intelligences Artificielles que j'ai créé:
http://reseaux-neurones-a--z.ml/
Faites apprendre des choses à une machine, faites reconnaître à un ordi des images...
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 28/03/2019 19:10 | #


Merci. Prends le temps de lire mon MP aussi
Mactul Hors ligne Membre Points: 699 Défis: 0 Message

Citer : Posté le 28/03/2019 19:10 | #


Fait et répondu
Mes programmes
Cliquer pour enrouler

Venez me rejoindre sur mon nouveau serveur Discord dédié a la programmation sur toutes les plateformes
https://discord.gg/bzfymHQ

Venez vous instruire, dans ce magnifique cours sur les Intelligences Artificielles que j'ai créé:
http://reseaux-neurones-a--z.ml/
Faites apprendre des choses à une machine, faites reconnaître à un ordi des images...
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 29/03/2019 11:59 | #


Comme promis dans mon dernier MP Mactul, je poursuis mes explications ici.
Dans mon MP je t'expliquais quelque chose que tu savais déjà mais que je préférais rappeler pour que l'on parte de la même base: le fonctionnement du lacé de rayons.
Mactul a écrit :
Peut être dois je dessiner virtuellement un décor 2D avec des pixels plus petits que la taille d'un cube de mur?

Il ne s'agit pas de ça. En fait, dans ta matrice, lieu de stockage de la map, les murs sont "codés" avec des "1" et le vide avec des "0". En fait, un "1" ne représente pas une partie d'un mur, il informe juste qu'à cet endroit, il y a un mur. Pour l'afficher c'est un autre problème qui se posera bientôt mais pas maintenant . Tes rayons ont, comme je te l'ais dit, une origine (0,0 si il n'y as pas de notion de joueur mais ici il y en as une ) qui est la position du joueur. Pour ce faire, on ajoute aux coordonnées des rayons (lors du calcul et du déplacement d'un rayon avec les deux fameuses formules de rotations) les coordonnées du joueur sur la map (matrice). On obtient quelque chose comme ça:
//On se place dans les deux boucles "for". Je rappelle que la première fait varier l'angle (-30° à 30°) (soit θ) et que l'autre, imbriquée dans la première fait varier la distance du rayon au joueur (soit r). On as donc:
distanceRayon*cos(angleRayon)+posXJoueur, distanceRayon*sin(angleRayon)+posYJoueur //Coordonnées du pointeur qui évolue dans la matrice en X,Y ici.


Comme tu l'as lu dans le commentaire, on fait varier l'angle des rayons de -30° à 30°. On prends donc pour 0° la direction dans laquelle regarde le joueur. On obtient un champ de vision de 60°. Pour réaliser les déplacements, on ne va donc pas faire comme dans un jeu en 2D ou on peut aller en avant en arrière à gauche à droite avec les touches directionnelles, ici on va faire uniquement avant et arrière et tourner sur soit-même à gauche ou à droite, en faisant varier la variable correspondant à l'orientation (angle) du joueur, la direction dans laquelle il regarde.

Si tu as compris tant mieux , sinon.. ben je réponds à tes questions
Mactul Hors ligne Membre Points: 699 Défis: 0 Message

Citer : Posté le 29/03/2019 17:30 | #


Merci beaucoup Disperseur
En fait j'avais pas fait gaffe que l'on pouvait voir une matrice comme un repere pouvant contenir des nombres à virgules (pas représentables du coup il faut faire des arrondis pour trouver l'es coordonées matricielles)

En tout cas bravo pour ton poste très clair, j'espère qu'il en aidera d'autres que moi
Mes programmes
Cliquer pour enrouler

Venez me rejoindre sur mon nouveau serveur Discord dédié a la programmation sur toutes les plateformes
https://discord.gg/bzfymHQ

Venez vous instruire, dans ce magnifique cours sur les Intelligences Artificielles que j'ai créé:
http://reseaux-neurones-a--z.ml/
Faites apprendre des choses à une machine, faites reconnaître à un ordi des images...
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 29/03/2019 18:52 | #


Merci, je ne me suis pas trouvé clair perso
PS: Je suis en train d'éssayer de faire le rendu à l'écran en Basic.. pas une simple affaire

Ajouté le 29/03/2019 à 19:12 :
D'ailleurs, et je pose la question à tous, j'aurais besoin d'aide pour le rendu à l'écran.. je suis en radians et on à une fenetre de 1,127,0,1,63,0, pas pratique quand on veut un point de fuite au milieu de son écran (c'est à dire le 0,0 au milieu..). Donc si quelqu'un sait comment il faut s'y prendre techniquement ça m'aiderais
Lephenixnoir En ligne Administrateur Points: 24563 Défis: 170 Message

Citer : Posté le 29/03/2019 19:29 | #


Tu fais une transformation affine (translation puis échelle). D'abord, tu retires 64 à la coordonnée x pour mettre le 0 au milieu, pareil en retirant 32 en y ; tu te retrouves avec un repère dont les 0 est au milieu, ie. [-64;63] en x et [-32;31] en y. Ensuite si tu veux un autre intervalle tu fais une échelle, par exemple si tu veux te ramener dans [-1;1] sur les deux axes.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 29/03/2019 20:48 | #


Ok merci. J'ai fait un premier jet de Raycasting en Basic. Il fonctionne assez bien avec C-basic mais en C ça sera plus rapide. Je prends le temps d'appliquer ce que tu m'as dit en C demain.
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 30/03/2019 13:36 | # | Fichier joint


Voici la première version fonctionelle de notre moteur 3D de Raycasing en fichier joint. C'est un programme Basic, il fonctionne plus rapidement avec CBasic mais je suis en train de le porter en C. Pour donner une première impression voici une image de ce dernier:

NB: On est sensé voir un cube en face de soi, dans une salle de 21*7 cases.

Comme on peut le voir, le rendu à l'écran est moyen. Les murs sont trop cascadés.. je pense que ça vient du nombre de rayons lancés donnant une trop grande précision de lecture de la matrice ...
Lephenixnoir En ligne Administrateur Points: 24563 Défis: 170 Message

Citer : Posté le 30/03/2019 13:44 | #


Si tu modifies le fichier joint dans ton message, le précédent disparaît. Poste un deuxième message avec la capture !
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Précédente 1, 2, 3, 4, 5, 6, 7 Suivante

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 81 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