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
Alexot Hors ligne Membre Points: 539 Défis: 18 Message

Citer : Posté le 06/04/2019 09:46 | #


On calcule les segments du carré car l'un d'eux a une intersection avec [AB], et on veut connaître ce point d'intersection. On doit donc calculer l'intersection de [AB] avec chacun de ces segments. Et pour calculer l'intersection entre deux segments, on a besoin de connaître les coordonnées des points qui les délimitent.
Cliquez pour découvrir
Cliquez pour recouvrir
2b 5b 2d 2d 2d 2d 2d 3e 2b 2b 2b 3c 5d 3e 2b 2e 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2e 2e 2d 2d 2d 2d 2e 2b 2b 2b 2e 2b 5b 2d 2d 3e 2b 3c 5d 3e 2e 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2e 2e 2b 5b 2d 2d 3e 2b 2b 2b 2b 2b 3c 5d 3e 2b 2e 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2e 2b 2b 2b 2b 2b 2b 2e 2d 2e 2b 2e 2d 5b 2b 2b 3e 2d 2d 2d 3c 5d 3e 2e 2b 2b 2b 5b 2d 3e 2b 2b 3c 5d 3e 2e 2b 2b 2b 2e 5b 2d 3e 2b 2b 2b 3c 5d 3e 2e 5b 2d 2d 2d 3e 2b 3c 5d 3e 2d 2e 2d 5b 2d 3e 2b 2b 2b 2b 2b 2b 3c 5d 3e 2d 2e 2d 5b 2d 2d 3e 2b 2b 2b 3c 5d 3e 2d 2e 2b 5b 2b 2b 3e 2d 2d 2d 3c 5d 3e 2e 5b 2d 2d 2d 3e 2b 2b 3c 5d 3e 2d 2e 2d 5b 2d 2d 3e 2b 3c 5d 3e 2d 2d 2e 2b 5b 2d 2d 3e 2b 2b 2b 3c 5d 3e 2e 2b 2b 2b 5b 2d 3e 2b 2b 2b 2b 3c 5d 3e 2d 2e 3e 2b 5b 2d 2d 2d 3e 2b 2b 3c 5d 3e 2b 2b 2e 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2e 5b 2d 3e 2b 2b 2b 2b 2b 2b 3c 5d 3e 2d 2e
Lephenixnoir En ligne Administrateur Points: 24563 Défis: 170 Message

Citer : Posté le 06/04/2019 10:11 | #


Bon, j'ai réfléchi de nouveau et je ne suis pas fou. Bresenham ne sera pas tout à fait suffisant pour le raycasting car il ne parcourt pas assez de points. Le DDA pourrait aller mais il est plus coûteux. Je serais partisan de modifier l'algorithme de Bresenham, je pense que ça se fait...
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 06/04/2019 11:31 | #


@Alexot: Je vois. Cependant il va falloir que j'y réfléchisse un bon moment
@Lephenixnoir: Attends, j'en suis pas là ! Il faut en premier que je parvienne à reproduire cet algo en Basic (pour comprendre clairement le fonctionnement). Ensuite seulement je pourrais envisager de le modifier pour répondre à mes besoins
Mactul Hors ligne Membre Points: 699 Défis: 0 Message

Citer : Posté le 07/04/2019 17:38 | #


Bon moi je suis à la traine, mais dans la plupart des liens que vous avez donnés il parlent du DDA
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 07/04/2019 17:43 | #


Oui en effet, le Differential Digital Analyser. C'est ce que je cherche à faire en Basic d'abord puis en C.. mais je rame
Mactul Hors ligne Membre Points: 699 Défis: 0 Message

Citer : Posté le 07/04/2019 17:46 | #


tu peux peut être regarder ici (je sais pas si c'est bien, je n'ai pas regardé en détail , mais il y a des exemples ):
https://www.geeksforgeeks.org/dda-line-generation-algorithm-computer-graphics/
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...
Lightmare Hors ligne Membre de CreativeCalc Points: 690 Défis: 0 Message

Citer : Posté le 07/04/2019 21:28 | #


Alexot a écrit :
Imaginons que notre texture fasse 6 pixels de large, on multiplie 0.2 par 6 : 0.2×6 = 1.2, on arrondit : 1, le pixel à afficher est donc le pixel n°1 de la texture(sachant que le pixel tout à gauche est le n°0)


je ne pense pas que cette étape soit bien utile, il suffit de connaître la colonne de texture à afficher, pas besoin d'aller au pixel près, non ? ce qui de toute façon n'est pas vraiment possible avec le raycasting...
"Quand je dis à la cour : "Sautez ! ", tout le monde me demande "jusqu'où ?" "
Dijkstra - The Witcher
Alexot Hors ligne Membre Points: 539 Défis: 18 Message

Citer : Posté le 08/04/2019 19:45 | #


Lightmare a écrit :
je ne pense pas que cette étape soit bien utile, il suffit de connaître la colonne de texture à afficher, pas besoin d'aller au pixel près, non ? ce qui de toute façon n'est pas vraiment possible avec le raycasting...

Si j'ai bien compris ton message, je pense que ce que je propose de faire est exactement ce que tu décris. J'ai néanmoins été assez imprécis dans le choix de mes termes puisque par "pixel n°1" je voulais dire "colonne de pixels n°1 dans la texture". Par contre je pense que c'est possible d'avoir le pixel près, en calculant l'abscisse dans la texture avec la technique décrite plus tôt, et l'ordonnée doit pouvoir se trouver avec la hauteur du pixel de l'écran par rapport au milieu de l'écran (en ordonnée) et la distance du mur à afficher par rapport à la caméra.
Cliquez pour découvrir
Cliquez pour recouvrir
2b 5b 2d 2d 2d 2d 2d 3e 2b 2b 2b 3c 5d 3e 2b 2e 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2e 2e 2d 2d 2d 2d 2e 2b 2b 2b 2e 2b 5b 2d 2d 3e 2b 3c 5d 3e 2e 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2e 2e 2b 5b 2d 2d 3e 2b 2b 2b 2b 2b 3c 5d 3e 2b 2e 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2e 2b 2b 2b 2b 2b 2b 2e 2d 2e 2b 2e 2d 5b 2b 2b 3e 2d 2d 2d 3c 5d 3e 2e 2b 2b 2b 5b 2d 3e 2b 2b 3c 5d 3e 2e 2b 2b 2b 2e 5b 2d 3e 2b 2b 2b 3c 5d 3e 2e 5b 2d 2d 2d 3e 2b 3c 5d 3e 2d 2e 2d 5b 2d 3e 2b 2b 2b 2b 2b 2b 3c 5d 3e 2d 2e 2d 5b 2d 2d 3e 2b 2b 2b 3c 5d 3e 2d 2e 2b 5b 2b 2b 3e 2d 2d 2d 3c 5d 3e 2e 5b 2d 2d 2d 3e 2b 2b 3c 5d 3e 2d 2e 2d 5b 2d 2d 3e 2b 3c 5d 3e 2d 2d 2e 2b 5b 2d 2d 3e 2b 2b 2b 3c 5d 3e 2e 2b 2b 2b 5b 2d 3e 2b 2b 2b 2b 3c 5d 3e 2d 2e 3e 2b 5b 2d 2d 2d 3e 2b 2b 3c 5d 3e 2b 2b 2e 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2e 5b 2d 3e 2b 2b 2b 2b 2b 2b 3c 5d 3e 2d 2e
Lightmare Hors ligne Membre de CreativeCalc Points: 690 Défis: 0 Message

Citer : Posté le 08/04/2019 21:16 | # | Fichier joint


Bonjour ! j'apporte un peu de neuf !
je pense que ça intéressera surtout Disperseur, car j'ai fait un algorithme de DDA qui permet de dessiner des segments.
le programme tourne avec C.Basic et c'est un g1m
"Quand je dis à la cour : "Sautez ! ", tout le monde me demande "jusqu'où ?" "
Dijkstra - The Witcher
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 09/04/2019 07:24 | #


@Lightmare : Merci. Je télécharge quand j'ai plus de temps. Merci
Mactul Hors ligne Membre Points: 699 Défis: 0 Message

Citer : Posté le 14/04/2019 19:23 | #


Aaah bravo Lightmare ,
Je le met en haut si ça ne te dérange pas

PS: Je n'ai pas eu le temps de tester et je n'ai pas FA-124 à porté de main
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...
Lightmare Hors ligne Membre de CreativeCalc Points: 690 Défis: 0 Message

Citer : Posté le 07/05/2019 19:14 | #


Alors que j'essayais de porter mon moteur de raycasting en C pour Graph 90 avec le PrizmSDK, je me suis heurté à un obstacle :
la calculatrice ne m'affiche rien alors que j'ai bien vérifié de ne pas avoir fait les erreurs bêtes du genre oublier le Bdisp_PutDisp_DD()
Alors je laisse le programme ci dessous ( commenté comme il se doit !Si besoin de détails ou d'explications, je suis bien évidemment là car je conçois qu'il est chiant de décortiquer un programme mal codé !

void main(void) {

    Bdisp_AllClr_VRAM();
    
    double r = 0;
    double camera_angle = 0;
    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 map[20][20] = {                                       // map
        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,1,
        1,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,1,
        1,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,1,
        1,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,1,
        1,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,1,
        1,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,1,
        1,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,1,
        1,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,1,
        1,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,1,
        1,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,
    };


    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 + 300; ray_angle = ray_angle + 0.47) { // lancer de rayon
            cursor++;
            for (ray_distance = 0; ray_distance < 30; ray_distance++) { // on vérifie régulierement laz présence de murs sur le trajet du rayon

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

                    wall_dist = (double) sqrt((double) pow (ray_distance * (double) cos(ray_angle), 2) + (double) pow (ray_distance * (double) 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_DD(cursor, wall_height_1, black); // dessin de la limite haute du mur
                    Bdisp_SetPoint_DD(cursor, wall_height_2, black); // dessin de la limite basse du mur

                    Bdisp_PutDisp_DD();
                }

            }

        }

    }
    
    return;
}

"Quand je dis à la cour : "Sautez ! ", tout le monde me demande "jusqu'où ?" "
Dijkstra - The Witcher
Mactul Hors ligne Membre Points: 699 Défis: 0 Message

Citer : Posté le 07/05/2019 19:27 | #


Déjà, il me semble que se serait mieux avec MonochromeLib
Je doute tout de même que le problème vienne de là

Edit:
Il te laisse assigner tes variables quand tu les déclares?

Edit:
Je ne connais pas du tout l'objet "map" mais tu es sur de ton coup?
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...
Lightmare Hors ligne Membre de CreativeCalc Points: 690 Défis: 0 Message

Citer : Posté le 07/05/2019 19:55 | #


Il n'y a pas de problème du côté de la déclaration des variables et de la map, sinon il y aurait eu une erreur de compilation.

... Et monochromelib est comme son nom l'indique uniquement pour les calculatrices monochromes !
"Quand je dis à la cour : "Sautez ! ", tout le monde me demande "jusqu'où ?" "
Dijkstra - The Witcher
Shadow15510 Hors ligne Administrateur Points: 5503 Défis: 18 Message

Citer : Posté le 07/05/2019 19:59 | #


Pour l'assignement, à terme, tu peux faire comme ça :

double r = 0, camera_angle = 0, player_x = 0, player_y = 0, ray_distance = 0, ray_angle = 0, wall_dist = 0, wall_height_1 = 0, wall_height_2 = 0, cursor = 0;


Ca permet de ne prendre qu'une seule ligne mais tu perd un peu en lisibilité…
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

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

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


Shadow15510 a écrit :
Pour l'assignent, à terme, tu peux faire comme ça :

Pitié, garde ce que tu as actuellement !

Je pense que la VRAM est en faute, localise le calcul de l'adresse, il faut utiliser un syscall au lieu de prendre la valeur hardcodée pour la Prizm, qui n'est pas la même que celle de la Graph 90+E.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Shadow15510 Hors ligne Administrateur Points: 5503 Défis: 18 Message

Citer : Posté le 07/05/2019 21:17 | #


Je comprend pas en quoi changé d'écriture influence des erreurs sur la RAM ?
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

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

Citer : Posté le 07/05/2019 21:25 | #


Non ça n'a rien à voir, mais son style actuel est meilleur en lisibilité et posera moins de problèmes plus tard (par exemple en l'obligeant à penser au type qu'il est en train de mettre au lieu de juste rajouter un nom à la liste).
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Lightmare Hors ligne Membre de CreativeCalc Points: 690 Défis: 0 Message

Citer : Posté le 07/05/2019 22:13 | #


merci pour les conseils Lephe !
Tu saurais où trouver les syscalls pour connaître la VRAM de la Graph 90 ?
Et sinon il n'y a pas de fautes évidentes dans le programme ?
"Quand je dis à la cour : "Sautez ! ", tout le monde me demande "jusqu'où ?" "
Dijkstra - The Witcher
Lephenixnoir En ligne Administrateur Points: 24563 Défis: 170 Message

Citer : Posté le 07/05/2019 22:50 | #


D'après mes notes sur le portage des add-ins Prizm vers la Graph 90+E, il faut virer les références à l'ancienne VRAM qui est 0xa8000000, et utiliser le sys 0x1e6 à la place. Normalement il est déjà codé et la fonction s'appelle GetVRAMAddress(). (Il y a régulièrements des fautes sur le nombre de d, mets-en un seul si jamais le nom n'existe pas.)

S'il compile, tout va bien. Mais tu te tues à tout caster en double, c'est inutile. Toutes les fonctions mathématiques que tu as utilisé renvoient déjà des double.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Lightmare Hors ligne Membre de CreativeCalc Points: 690 Défis: 0 Message

Citer : Posté le 08/05/2019 08:37 | #


merci beaucoup ! je vais essayer ca !
pour les "doubles", je les avais mis là pour le debug, je vais les enlever !

Ajouté le 08/05/2019 à 10:27 :
Alors j'ai mis la commande GetVRAMAddress() dans la fonction main, et ca compile. Mais la calculatrice ne m'affiche toujours rien...
J'ajoute que le seul changement que j'ai effectué est d'ajouter la fonction qui change l'addresse de la VRAM.
"Quand je dis à la cour : "Sautez ! ", tout le monde me demande "jusqu'où ?" "
Dijkstra - The Witcher
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 84 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