Forum Casio - Discussions


Index du Forum » Discussions » Question sur le raycasting
MactulHors ligneMembrePoints: 390 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


Pages : 1, 2, 3, 4, 5Suivante
DisperseurHors ligneMembrePoints: 1332 Défis: 0 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
Planetarium

√(2+2-2+2-2+2+2-2-2-2) = 0
KikoodxHors ligneMembrePoints: 983 Défis: 7 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).
2+2=5
DisperseurHors ligneMembrePoints: 1332 Défis: 0 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 ?
Planetarium

√(2+2-2+2-2+2+2-2-2-2) = 0
LephenixnoirHors ligneAdministrateurPoints: 14128 Défis: 136 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
DisperseurHors ligneMembrePoints: 1332 Défis: 0 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.
Planetarium

√(2+2-2+2-2+2+2-2-2-2) = 0
LephenixnoirHors ligneAdministrateurPoints: 14128 Défis: 136 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]
DisperseurHors ligneMembrePoints: 1332 Défis: 0 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 ?
Planetarium

√(2+2-2+2-2+2+2-2-2-2) = 0
LephenixnoirHors ligneAdministrateurPoints: 14128 Défis: 136 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.
DisperseurHors ligneMembrePoints: 1332 Défis: 0 Message

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


ça c'est pas cool :'(
Planetarium

√(2+2-2+2-2+2+2-2-2-2) = 0
HackcellEn ligneMembrePoints: 978 Défis: 6 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 ♥
I usually spend meow time cosplaying as a diligent student...
So it can get pretty stressful.
That's exactly why PC is such a happy place for meow to be ⭐
DisperseurHors ligneMembrePoints: 1332 Défis: 0 Message

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


Sur le SDK Hackcell
Planetarium

√(2+2-2+2-2+2+2-2-2-2) = 0
HackcellEn ligneMembrePoints: 978 Défis: 6 Message

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


Oups, on est pas en Basic >_<
I usually spend meow time cosplaying as a diligent student...
So it can get pretty stressful.
That's exactly why PC is such a happy place for meow to be ⭐
DisperseurHors ligneMembrePoints: 1332 Défis: 0 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 ?
Planetarium

√(2+2-2+2-2+2+2-2-2-2) = 0
HackcellEn ligneMembrePoints: 978 Défis: 6 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π ♥
I usually spend meow time cosplaying as a diligent student...
So it can get pretty stressful.
That's exactly why PC is such a happy place for meow to be ⭐
MactulHors ligneMembrePoints: 390 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
DisperseurHors ligneMembrePoints: 1332 Défis: 0 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.
Planetarium

√(2+2-2+2-2+2+2-2-2-2) = 0
HackcellEn ligneMembrePoints: 978 Défis: 6 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 )
I usually spend meow time cosplaying as a diligent student...
So it can get pretty stressful.
That's exactly why PC is such a happy place for meow to be ⭐
DisperseurHors ligneMembrePoints: 1332 Défis: 0 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
Planetarium

√(2+2-2+2-2+2+2-2-2-2) = 0
KirafiHors ligneMembrePoints: 2014 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)
DisperseurHors ligneMembrePoints: 1332 Défis: 0 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).
Planetarium

√(2+2-2+2-2+2+2-2-2-2) = 0
Pages : 1, 2, 3, 4, 5Suivante

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2019 | Il y a 41 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