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


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

Citer : Posté le 26/03/2019 07:55 | #


Tout le monde sait que le basic n'est pas réputé pour sa vitesse d'exécution. C'est pour cela que j'ai réfléchis et regardé un peu la vitesse d'exécution du lancé d'une dizaine de rayons (je ne pense pas en faire plus ou moin à cause de la vitesse). Je me suis rendu compte que contrairement à ce que je pensais on ne gardera pas de vitesse d'exécution bien longtemps. On a un pointeur qui se déplace 10 fois et à chaque fois qui avance de 3 ou 4 cases et a chaque fois on effectue un test.. le tout mis ensemble ralentis la bête.. donc je pense que l'on ira dire bonjour au C basic très bientôt

PS: Étant donné la vitesse d'exécution et les 127 pixels de largeur de l'écran, combien de raies seraient le mieux pour avoir un compromis entre vitesse et propreté d'affichage ?

Ajouté le 26/03/2019 à 13:05 :
J'ai réussit à mettre les déplacements et le lancé de rayons ensembles. J'ai créé un petit programme ou on peut déplacer un personnage en effectuant des rotations sur lui même et en avançant pu reculant sur l'axe ou il "regarde". Le programme affiche des "1" à l'endroit de l'écran ou mon personnage voit un mur dans son champ de vision. J'ai mis une distance de détection à 4 unités. Ce programme fonctionne en locate. Ce programme est lent.. joue le poste quand j'aurais accès à mon pc.

@Mactul: excuse moi d'avancer si vite seul mais ce sujet m'excite tellement que des que j'ai du temps libre je m'attaque à ma calto
Kikoodx Hors ligne Ancien labélisateur Points: 3039 Défis: 11 Message

Citer : Posté le 26/03/2019 15:23 | #


Je ne pense pas que tu dois t'excuser pour ça
Ce serait intéressant que vous arriviez à créer une démo 3D en Basic Casio "Vanilla" tournant à un frame-rate raisonnable (entre 0.5 et 3 fps serait le minimum), ça vous permettrait de voir chaque optimisations possibles, le portage vers le C.Basic vous pouvez le faire une fois le programme terminé.
(Et j'aime bien Locate.)

Je pense que pour ta question du nombre de scans, tu devrais te baser sur la vitesse d'un scan unique, donnée que le n'on a pas.
Mais je pense que le strict minimum serait le format 4:3, ici 84 colonnes, au mieux 16:9 soit 112 colonnes (j'ai fait de tête ce sont des approximations).
ouais ouais
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 26/03/2019 20:56 | #


@Mactul : Comme tu as pu le lire plus haut j'ai commencé à développer en Basic mais je peux facilement porter en C sur le SDK. Le truc c'est que j'ai un niveau en C qui ne dépasse pas les pointeurs mais je pense que pour un projet de cette taille ça peut aller. J'ai cru comprendre que tu sait programmer en C ?

Ajouté le 27/03/2019 à 08:42 :
Je suis en train de porter mon programme en C mais il y a un élément important qui m'embête: existe-t-il une commande qui permet de passer un nombre en int sur le sdk? Comme la commande "int()" en basic ?
Lephenixnoir En ligne Administrateur Points: 24574 Défis: 170 Message

Citer : Posté le 27/03/2019 08:45 | #


"Nombre" n'est pas très clair ici. De quoi est-ce que tu disposes comme donnée ?

Si c'est un float ou un double : utilise un cast, sous la forme (int)valeur. Cela tronque à l'entier inférieur.

Si c'est une chaîne de caractères : utilise la fonction atoi() de <stdlib.h> (ou mieux, strtol qui permet de vérifier toutun tas de choses comme les overflows).

Si c'est autre chose, précise-nous quoi
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 09:20 | #


Bon mon SDK se plain de voir ça:
map[(int) (distRayon*sin(angleRayon)+camY), (int) (distRayon*cos(angleRayon)+camX)] == 1

On est d'accord que le tableau tel qu'il est ici indique un pointeur et non pas une valeur.
Lephenixnoir En ligne Administrateur Points: 24574 Défis: 170 Message

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


Ah mais le problème est juste de syntaxe, quand tu as un double tableau la syntaxe est map[y][x] et pas map[y,x]
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 11:56 | #


Merxi

Ajouté le 27/03/2019 à 13:31 :
Il existe une commande pour changer les angles de radians à degrés, mon programme tourne en degrés ?
Lephenixnoir En ligne Administrateur Points: 24574 Défis: 170 Message

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


Non, par contre tu peux définir ta propre fonction sinus/cosinus en degrés. Tu n'as pas tellement envie de faire des transformations matricielles en degrés, souviens-t'en si ça t'arrive un jour.
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 13:34 | #


ça c'est pas cool :'(
Hackcell En ligne Maître du Puzzle Points: 1531 Défis: 11 Message

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


Yep, ya une instruction Deg pour passer en degré, et Rad pour passer en Radian (Sans oublier Grad pour…).
Tu devrais pouvoir les trouver dans [opt] ou quelque chose comme ça ♥
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

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


Sur le SDK Hackcell
Hackcell En ligne Maître du Puzzle Points: 1531 Défis: 11 Message

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


Oups, on est pas en Basic >_<
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

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


Mais du coup ça c'est un truc que j'ai pas encore vu en maths, en degrés on à:
X=r*cos(θ)
Y=r*sin(θ)
Mais qu'as-t-on en radians ?
Hackcell En ligne Maître du Puzzle Points: 1531 Défis: 11 Message

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


La même chose, sauf qu'au lieu de dire qu'un tour c'est 360°, on dit que c'est 2π ♥
Mactul Hors ligne Membre Points: 699 Défis: 0 Message

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


Hello,
@Disperseur c'est cool que tu avance bien, moi je suis un peu bloqué car j'ai pas vraiment trouvé ou tirer mes rayons, sur la matrice? (Si oui, alors je pige pas comment, NB: je n'ai pas eu le temps de lire tout vos liens)
Tu me demande si je sais programmer en C, la réponse est "non" car je suis tout débutant mais je sais traduire un programme de basic-casio vers du C, les instruction étant tellement simples...
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 27/03/2019 13:45 | #


Heu... Je ne sais pas si c'est exactement la même chose mais si tu le dit.
Hackcell En ligne Maître du Puzzle Points: 1531 Défis: 11 Message

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


En degré, sin(90) = 1

En Radian, sin(π/2) =1

Ce qui change c'est l'unité de mesure des angles, c'est un peu comme la différence entre les métrés et les pouces, les deux mesures des longueurs, mais selon la situation on utilisera soit l'un soit l'autre (ou les deux et on créera le crash d'une fusée )
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 27/03/2019 16:18 | #


Bon, c'est bourrin comme demande mais là je suis bloqué, il y as un truc qui m'échappe et je vois pas quoi
Voici le code en Basic:
0->A~Z
0->Theta:0-><r>
Rad

'PARAM POS JOUEUR'
0->Theta
15->X
4->Y

'MAP'
[[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]]->Mat A
Do
ClrText

'MOOVE CALCS'
X+(cos Theta)<r>->X
Y+(sin Theta)<r>->Y
0-><r>

'PERSO'
Locate 1,1,Theta
Locate Int X,Int Y,"+"

'RAYONS'
For Theta-1frac6*pi->A To Theta+1frac6*pi Step 1frac60*pi
For 0->B To 20
If Mat A[Int ((Bsin A)+Y),Int ((Bcos A)+X)]=1
Then
Locate Int ((Bcos A)+X),Int ((Bsin A)+Y),"1"
Break
IfEnd
Next
Next

Do
LpWhile Getkey=0
Getkey=28=><r>+1-><r>
Getkey=37=><r>-1-><r>
Getkey=27=>Theta+1frac12*pi->Theta
Getkey=38=>Theta-1frac12*pi->Theta
LpWhile Getkey<>47

Et je souhaite le porter en C. J'obtiens donc çe code qui ne me rends pas la même chose et je ne vois pas pourquoi..
#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)
{
    const double PI = 3.1415926535897932;
    double r = 0, angleCam = 0, camX = 15, camY = 4, distRayon = 0, angleRayon = 0 ;
    unsigned int key;

    int map[21] [7] = {
    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{

    //Calculs de deplacements
    camX = camX+r*(cos(angleCam));
    camY = camY+r*(sin(angleCam));
    r = 0;
    
    //Personnage
    locate(camX, camY);
    Print((unsigned char*)"O");
    
    //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 = distRayon+1)
        {
            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;
    }
    ML_clear_vram();
    ML_clear_screen();

    //Commandes
    if(IsKeyDown(KEY_CTRL_UP))
    {
        r++;
    }
    if(IsKeyDown(KEY_CTRL_DOWN))
    {
        r--;
    }
    if(IsKeyDown(KEY_CTRL_LEFT))
    {
        angleCam = angleCam+(1/12*PI);
    }
    if(IsKeyDown(KEY_CTRL_RIGHT))
    {
        angleCam = angleCam-(1/12*PI);
    }

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


Si quelqu'un voit de quoi il s'agit
Kirafi Hors ligne Membre Points: 2180 Défis: 10 Message

Citer : Posté le 27/03/2019 16:34 | #


Une précision sur les erreurs ?
iPod
Pour des parties rapides
Jusqu'où pourras-tu aller dans ce jeu "partie rapide" qu'est Dextris (élu Jeu Du Mois)
Pourras-tu survivre plus de 20 secondes dans ce fameux tunnel appelé Graviton
Rebondis entre les murs en évitant les piques dans SpikeBird
Pourras-tu éviter de te faire écraser dans FallBlocs (élu Jeu Du Mois)
Autres
Franchement ils valent le coups
Deviens l'amiral de la marine dans SeaRush (jeu concours) (élu Jeu Du Mois)
La version 2048 tactile amélioré au plus haut point : 2048 Delux !
Pars à la recherche des morceaux d'étoile dans Lumyce (élu Jeu Du Mois)
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).
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 224 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