Seuls les membres ayant 30 points peuvent parler sur le chat.

Forum Casio - Discussions


Index du Forum » Discussions » Question sur le raycasting
MactulHors ligneMembrePoints: 667 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 : Précédente1, 2, 3, 4, 5, 6, 7
KikoodxHors ligneMembrePoints: 1509 Défis: 9 Message

Citer : Posté le 01/11/2019 22:26 | #


OH !
C'est bô.
Tu comptes implémenter les couleurs ?
J'aimerais voir ça.
Combien de temps pour calculer l'image ?
CritorEn ligneAdministrateurPoints: 1454 Défis: 18 Message

Citer : Posté le 01/11/2019 22:43 | #


Superbe !
LephenixnoirHors ligneAdministrateurPoints: 16165 Défis: 140 Message

Citer : Posté le 01/11/2019 22:55 | #


Wow ! Ça mérite un topic à part, surtout vu que la méthode est pas pareil que le raycasting.

En Basic je présume ? Quel genre d'effets de lumière tu as ici ? Ça se calcule en combien de temps ?
DisperseurHors ligneMembrePoints: 1672 Défis: 1 Message

Citer : Posté le 02/11/2019 09:07 | #


Et combien de rayons surtout ?
Mes meilleurs jeux
N'hésitez pas, notez !

Jeux BasicCasio / CBasicCasio:
-World Tank War II
-Apollo 11
-GeoGraph ! Élu Jeu du Mois de Mars 2019 !
Jeux C:
-Planétarium 2 ! Chef d'Oeuvre !


√(2+2-2+2-2+2+2-2-2-2) = 0
KikoodxHors ligneMembrePoints: 1509 Défis: 9 Message

Citer : Posté le 02/11/2019 09:21 | #


Disperseur a écrit :
Et combien de rayons surtout ?

Un rayon par pixel.
DisperseurHors ligneMembrePoints: 1672 Défis: 1 Message

Citer : Posté le 02/11/2019 09:30 | #


Tu est sur ? Il y a des pixels blancs par endroits a intervalles reguliers.. peut peut-être qu'il en a mis moins par souci de vistesse d'exécution

Ajouté le 02/11/2019 à 10:19 :
Ah et @Lightmare: comment as tu implémenté la sphère dans le code ?
Mes meilleurs jeux
N'hésitez pas, notez !

Jeux BasicCasio / CBasicCasio:
-World Tank War II
-Apollo 11
-GeoGraph ! Élu Jeu du Mois de Mars 2019 !
Jeux C:
-Planétarium 2 ! Chef d'Oeuvre !


√(2+2-2+2-2+2+2-2-2-2) = 0
MactulHors ligneMembrePoints: 667 Défis: 0 Message

Citer : Posté le 02/11/2019 11:40 | #


Waw, pas mal, c'est quoi exactement la technique du raytracing ?
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...
DisperseurHors ligneMembrePoints: 1672 Défis: 1 Message

Citer : Posté le 02/11/2019 11:46 | #


Un lien est donné dans le post avant la photo
-> RayTracing
Mes meilleurs jeux
N'hésitez pas, notez !

Jeux BasicCasio / CBasicCasio:
-World Tank War II
-Apollo 11
-GeoGraph ! Élu Jeu du Mois de Mars 2019 !
Jeux C:
-Planétarium 2 ! Chef d'Oeuvre !


√(2+2-2+2-2+2+2-2-2-2) = 0
KikoodxHors ligneMembrePoints: 1509 Défis: 9 Message

Citer : Posté le 02/11/2019 15:40 | #


Disperseur a écrit :
Tu est sur ? Il y a des pixels blancs par endroits a intervalles reguliers.. peut peut-être qu'il en a mis moins par souci de vistesse d'exécution

Un pixel calculé s'affiche probablement sur plusieurs espaces Je dirai qu'un pixel en fait 2x2 sur l'image.
DisperseurHors ligneMembrePoints: 1672 Défis: 1 Message

Citer : Posté le 02/11/2019 15:45 | #


Parce que 8001 pixels (127*63) ça fait beaucoup de rayons. Sans compter les autres rayons utilisés pour les sources lumineuses...

Ajouté le 02/11/2019 à 15:46 :
Perso j'ai fait un essai de raycasting avec 127 rayons et ça prends du temps en Basic, même avec un truc optimisé.
Mes meilleurs jeux
N'hésitez pas, notez !

Jeux BasicCasio / CBasicCasio:
-World Tank War II
-Apollo 11
-GeoGraph ! Élu Jeu du Mois de Mars 2019 !
Jeux C:
-Planétarium 2 ! Chef d'Oeuvre !


√(2+2-2+2-2+2+2-2-2-2) = 0
MactulHors ligneMembrePoints: 667 Défis: 0 Message

Citer : Posté le 02/11/2019 17:01 | #


ah, merci Disperseur, je n'avais pas vu !

Ajouté le 02/11/2019 à 17:09 :
@Lightmare

Tu nous feras une mini explication de comment tu t'y prends ?
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...
LephenixnoirHors ligneAdministrateurPoints: 16165 Défis: 140 Message

Citer : Posté le 02/11/2019 17:11 | #


Je réitère ma demande de créer un autre topic d'ailleurs. :3
MactulHors ligneMembrePoints: 667 Défis: 0 Message

Citer : Posté le 02/11/2019 17:11 | #


oui, ce serais mieux
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...
LightmareHors ligneMembre de CreativeCalcPoints: 528 Défis: 0 Message

Citer : Posté le 06/11/2019 17:32 | #


Alors, j'ai retenté de faire fonctionner mon code de raycasting en C pour Graph 90, et j'ai changé les Bdisp_SetPoint_DD par Bdisp_SetPoint_VRAM. Cependant, le compilateur n'a pas apprécié le Bdisp_PutDisp_VRAM(), du coup j'ai remis le Bdisp_PutDisp_DD et ca compile. Mais je me retrouve toujours avec un écran blanc...
42
LephenixnoirHors ligneAdministrateurPoints: 16165 Défis: 140 Message

Citer : Posté le 06/11/2019 19:18 | #


Ouh là, faut pas utiliser les fonctions de dessin DD. Il faut bien utiliser Bdisp_SetPoint_VRAM().

Cependant tu t'es trompé, Bdisp_PutDisp_DD() est une exception. Ça copie la VRAM à l'écran. Il n'y a pas de Bdisp_PutDisp_VRAM().

Il faut que les commandes soient bien claires pour toi avec le double buffering. Si tu as un doute, n'hésite pas à demander.
LightmareHors ligneMembre de CreativeCalcPoints: 528 Défis: 0 Message

Citer : Posté le 07/11/2019 21:10 | #


@Lephenixnoir : C'est ce j'ai fait, et je me retrouve avec un écran blanc... Je met le code ci dessous, ca doit être un truc idiot je pense.

void main(void) {

    Bdisp_AllClr_VRAM;

    double r = 0;
    double camera_angle = 0; // angle de la camera
    double player_x = 0;
    double player_y = 0;
    double ray_distance = 0;
    double ray_angle = 0;
    double wall_dist = 0;
    double wall_height_1 = 0; // limite haute du mur
    double wall_height_2 = 0; // limite basse du mur
    double cursor = 0;
    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 } };


    while (1) {

        // deplacements de la camera
        player_x = player_x + r * (cos(camera_angle));
        player_y = player_y + r * (cos(camera_angle));
        r = 0;


        cursor = 0;
        for (ray_angle = camera_angle - 30; ray_angle < camera_angle + 30; ray_angle = ray_angle + 0.47) { // lancer de rayon
            cursor++;
            for (ray_distance = 0; ray_distance < 30; ray_distance + 0.1) { // on vérifie régulierement la présence de murs sur le trajet du rayon

                if (map[ (int) (ray_distance * sin(ray_angle) + player_y)][ (int) (ray_distance * cos(ray_angle) + player_x)] == 1) {

                    wall_dist = sqrt( pow(ray_distance * cos(ray_angle), 2) + pow(ray_distance * sin(ray_angle), 2)); // calcul de la distance du mur
                    wall_height_1 = (60 / wall_dist) + 30; // calcul de la limite haute du mur
                    wall_height_2 = (-60 / wall_dist) + 30; // calcul de la limite basse du mur

                    Bdisp_SetPoint_VRAM(cursor, wall_height_1, 0); // dessin de la limite haute du mur
                    Bdisp_SetPoint_VRAM(cursor, wall_height_2, 0); // dessin de la limite basse du mur

                    Bdisp_PutDisp_DD();
                }

            }

        }
        GetKey(&key);

        if (key == KEY_CTRL_UP) {
            r++;
        }
        if (key == KEY_CTRL_DOWN) {
            r--;
        }
        if (key == KEY_CTRL_LEFT) {
            camera_angle = camera_angle - 15;
        }
        if (key == KEY_CTRL_RIGHT) {
            camera_angle = camera_angle + 15;
        }

    }



            
    return;
}

42
LephenixnoirHors ligneAdministrateurPoints: 16165 Défis: 140 Message

Citer : Posté le 07/11/2019 21:16 | #


Bdisp_AllClr_VRAM;

Tu n'as pas appelé la fonction, cette ligne n'a aucun effet à part nommer une fonction. L'opérateur d'appel c'est les parenthèses :

Bdisp_AllClr_VRAM();

Tu peux virer ton Bdisp_PutDisp_DD() qui va te bouffer la majorité du temps de caclul. Il suffit d'afficher à la fin, ce que GetKey() fait déjà pour toi.

Il y a certainement autre chose mais dans l'immédiat je ne vois pas quoi. N'hésite pas à changer la couleur des points (troisième paramètre de Bdisp_SetPoint_VRAM()) pour être sûr.
LightmareHors ligneMembre de CreativeCalcPoints: 528 Défis: 0 Message

Citer : Posté le 07/11/2019 21:27 | #


Merci ! Mais du coup maintenant j'ai juste l'écran du menu qui est freeze sans rien d'autre qui s'affiche... J'ai également enlevé le Bdisp_PutDisp_DD() de la fin. Et pour les couleurs, j'ai pas compris quels ints correspondaient à quelle couleur.
42
LephenixnoirHors ligneAdministrateurPoints: 16165 Défis: 140 Message

Citer : Posté le 07/11/2019 21:31 | #


C'est du 16-bit donc R5G6B5. Basiquement 0x0000 c'est noir, 0xf800 c'est rouge, 0x07e0 c'est vert, 0x001f c'est bleu et 0xffff c'est blanc. Donc t'es bon normalement.

N'oublie pas que les coordonnées à l'écran c'est x, y pour 0 ≤ x ≤ 383 (en partant de la gauche) et 0 ≤ y ≤ 215 (en partant du haut). J'ai cru voir passer des coordonnées négatives.
Pages : Précédente1, 2, 3, 4, 5, 6, 7

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