1

-

2

Ben là tu ne multiplies pas par cos(angle) donc c'est normal que ça ne change rien.
Il faut à priori que tu remplaces l'appel à draw_wall_line(w,x,YSIZE / (2*kk)) par draw_wall_line(w,x,YSIZE/(2*cos(a-w->angle)*kk))
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

3

-

4

-

5

Ce n'est pas au début du for qu'il faut appliquer une correction sur k, ça ne sert à rien... Il faut le faire seulement à l'appel de draw_wall_line. Teste la modif que je t'ai dite, stp (en changeant ce qu'il y a à changer pour que la fonction cos reçoive un argument en radians - je ne me suis pas préoccupé de ça).
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

6

-

7

Moi non plus neutral
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

8

-

9

Bon petite question, tu regardes dans quelle direction?

10

-

11

si tu regardes dans la direction horiz droite, je comprendrai la scene.
Perso je pense que le probleme vient du fait qu'il faut discretiser la profondeur:
2 rayons allant sur le mure d'en face n'ont pas forcement la meme longueur, -> il faut impreativement projeter sur l'axe de vision, et non l'axe du rayon lance (ce qui donne strictment aucun changement).
J'ai pas lu le code, mais je poste ce que je pense pouvoir etre la source du probleme... apres a toi de verifiertongue

12

axe de vision = axe perpendiculaire au epoles du joueur.

13

Orion_ :
• Orion_ invoque sBibi


• sBibi invoque google triso

http://www.google.com/search?hl=en&q=raycaster+fisheye+correction
2eme resultat
In many respects the Yoshi is like a beautiful woman. A man can come so enamoured that he bestows on her all his time, his energy and his fortune.
- Fred whipple, 1960

*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & Sabrina

14

-

15

Yup,

sauf erreur de ma part, dans la fonction:
[code]void render_raycast(t_mlx *w);[/code]
ceci [code] = return_vector(x, a);[/code] donne un resultat innatendu.
En effet, la donne de type t_floatpoint n'est pas modifiee.
Et au vu de l'utilisation dans la fonction return_vector(), le type de donnée
ne m'as pas l'air d'etre un pointeur mais plutot une structure/union.
Il n'est pas possible de retourner une structure.
Ca ne doit pas etre une union vu que que t'y stockes des floats.

Je te conseillerai d'appeler ta fonction ainsi:
[code] return_vector(&e, x, a); [/code]
de modifier la declaration de ta fonction:
[code]t_floatpoint return_vector(t_floatpoint *e2, int x, double a);[code]
de supprime la declaration de e2 dans cette fonction
est de modifier les affectations de valeurs:
[code]
e2->x = (e1.x * cos(RADIAN(a))) - (e1.y * sin(RADIAN(a)));
e2->y = (e1.x * sin(RADIAN(a))) + (e1.y * cos(RADIAN(a)));
[/code]

Le resultat graphique jusqu'ici devrait s'expliquer par les autres trucs que t'incrementes et qui modifient ainsi ta distance aux objects.

Voili voilou smile
Vini, vidi, vici !

16

En gros le probleme venait du fait que tu ne faisais pas une homotetie du Virtual-Screen sur le Real-Screen?

17

-

18

Je viens de tester y'a 5 mins et ca ne me changeait pas les valeurs moi.
T'est netsoulé la? c'est quoi ton login ? (le mien: folays)

@tte
Vini, vidi, vici !

19

-

20

En effet tu avais raison pour retourner une structure, je l'avais jamais fait preferant de toute maniere modifier par l'intermediaire d'une pointeur sur struct passé en parametre.
Je suis en train de voir pour ton pb, mais je ne comprends pas ta fonction put_pixel.

Que sont ses 2eme et 3emes arguments?
Vini, vidi, vici !

21

-

22

Bon j'ai pas reussi a trouver le bug je reeserai p-t demain si j'ai le temps.

Si y'en a qui veulent essayer, ...
#include <math.h> #include <X11/Xlib.h> #define XSIZE 800 #define YSIZE 600 #define FOV 90.0f #define WALL     1 #define CARRE(a) ((a) * (a)) #define RADIAN(a) ((a) * 2 * 3.141592f / 360) typedef struct s_mlx { Display *dpy; Window win; GC     v1; GC     v2; float     angle; int     level_size_x; int     level_size_y; float     pos_x; float     pos_y; int     tab[50 * 50]; } t_mlx; typedef struct s_floatpoint { float     x; float     y; } t_floatpoint; typedef struct s_point { float     fx; float     fy; int     x; int     y; } t_point; void     put_pixel(t_mlx *w, int x, int color) { if (color == 0xFF)      XDrawPoint(w->dpy, w->win, w->v1, x % XSIZE, x / XSIZE - 1); //plafond vert else if (color == 0xFF0000)      XDrawPoint(w->dpy, w->win, w->v2, x % XSIZE, x / XSIZE - 1); //sol bleu else      XDrawPoint(w->dpy, w->win, DefaultGC(w->dpy, DefaultScreen(w->dpy)), x % XSIZE, x / XSIZE - 1); } /*  ** Affiche une ligne de l'ecran en X contenant le plafond, le mur (avec shading), et le sol, suivant la distance K du rayon [personnage -> colision mur]  */  void          draw_wall_line(t_mlx *w, int x, int k)  {    int          i;      if (k > (YSIZE / 2))      k = YSIZE / 2;    for (i = 0; i < (YSIZE / 2) - k; i++)      put_pixel(w, x += XSIZE, 0xFF);   for (i = 0; i < k * 2; i++)      put_pixel(w, x += XSIZE, k);    for (i = 0; i < (YSIZE / 2) - k; i++)      put_pixel(w, x += XSIZE, 0xFF0000);  }      /*  ** Calcul le vecteur du rayon a tracer suivant l'angle courant du joueur  */    t_floatpoint     return_vector(int x, double a)  {    t_floatpoint     e1;    t_floatpoint     e2;      e1.x = 0.5;    e1.y = (1.0 * ((XSIZE / 2) - x)) / XSIZE;    e2.x = (e1.x * cos(RADIAN(a))) - (e1.y * sin(RADIAN(a)));    e2.y = (e1.x * sin(RADIAN(a))) + (e1.y * cos(RADIAN(a)));    return (e2);  }      /*  ** Fonction pas a la norme (je sais)  ** affiche le monde 3D a l'ecran de X0, a XSIZE-1, en balayant le tableau en fonction du FOV du joueur (FOV = 90.0f, XSIZE = 640)  ** je passe par un xsize_f parceque sinon une division d'un float par un entier tout les 2 mis en #define, ca me sort automatiquement 0     ** (la aussi j'aimerais comprendre), a = angle courant incrementer a chaque ligne, ainc = incrementation suivant XSIZE et FOV  ** k = distance de ma droite/rayon, kk etait utilise pour la correction de distance, genre: kk = k * cos(x * ainc) ou truc du genre, mais ca ne fonctionne pas, j'ai le meme resultat graphique  */    void          render_raycast(t_mlx *w)  {    t_floatpoint     e;    t_point     final;    double     a;    float          xsize_f;    float          ainc;    int          x;    float          k;    float          kk;      xsize_f = XSIZE;    ainc = FOV / xsize_f;    a = w->angle + (FOV / 2);    for (x = 0; x < XSIZE; x++)      {        e = return_vector(x, a);        for (k = 0; k < w->level_size_x * 2; k = k + 0.01f)       {         kk = k;        final.x = w->pos_x + e.x * kk;        final.y = w->pos_y + e.y * kk;        final.y = w->level_size_y - final.y - 1;        if ((final.x >= 0) && (final.x < w->level_size_x) &&             (final.y >= 0) && (final.y < w->level_size_y))           if (w->tab[final.y * w->level_size_x +                           final.x] >= WALL)             {            draw_wall_line(w, x, YSIZE / (2 * (kk)));           break ;             }       }        a = a - ainc;      }  }  #include <stdlib.h> int     main() { t_mlx d_mlx;   XGCValues     xv1,xv2;   XColor        pix;   XColor        useless;   int x;   int y; d_mlx.dpy = XOpenDisplay(NULL); d_mlx.win = XCreateSimpleWindow(d_mlx.dpy, DefaultRootWindow(d_mlx.dpy), 0, 0, 800, 600, 1,                             BlackPixel(d_mlx.dpy, DefaultScreen(d_mlx.dpy)),                             WhitePixel(d_mlx.dpy, DefaultScreen(d_mlx.dpy)));   XMapWindow(d_mlx.dpy, d_mlx.win);   XFlush(d_mlx.dpy);   XAllocNamedColor(d_mlx.dpy, DefaultColormap(d_mlx.dpy, DefaultScreen(d_mlx.dpy)),                    "green", &pix, &useless);   xv1.foreground = pix.pixel;   XAllocNamedColor(d_mlx.dpy, DefaultColormap(d_mlx.dpy, DefaultScreen(d_mlx.dpy)),                    "blue", &pix, &useless);   xv2.foreground = pix.pixel;  d_mlx.v1 = XCreateGC(d_mlx.dpy, DefaultRootWindow(d_mlx.dpy), GCForeground, &xv1);   d_mlx.v2 = XCreateGC(d_mlx.dpy, DefaultRootWindow(d_mlx.dpy), GCForeground, &xv2); d_mlx.angle = 180; d_mlx.level_size_x = d_mlx.level_size_y = 50; d_mlx.pos_x = 20; d_mlx.pos_y = 30; for (y = 0; y < 50; ++y) { for (x = 0; x < 50; ++x) { d_mlx.tab[50 * y + x] = 0; if (x == 18) d_mlx.tab[50 * y + x] = 1; if (y == 30 && x >= 22) d_mlx.tab[50 * y + x] = 1; if (y == 0 || y == 49 || x == 0 || x == 49) d_mlx.tab[50 * y + x] = 2; if (y == d_mlx.pos_y && x == d_mlx.pos_x) printf("X"); else { if (d_mlx.tab[50 * y + x] == 1) printf("1"); else if (d_mlx.tab[50 * y + x] == 2) printf("@"); else printf("0"); } } printf("\n"); } XSelectInput(d_mlx.dpy, d_mlx.win, ExposureMask|KeyPressMask); while (1) { XEvent xev; XNextEvent(d_mlx.dpy, &xev); if (xev.type = KeyPress) { printf("key: %u.\n", xev.xkey.keycode); switch (xev.xkey.keycode) { case 98: d_mlx.pos_y-=1 ; break; //haut case 104: d_mlx.pos_y+=1 ; break; //bas case 100: d_mlx.pos_x-=1 ; break; //g case 102: d_mlx.pos_x+=1 ; break; //d case 86: d_mlx.angle+=45 ; break; //g case 82: d_mlx.angle-=45 ; break; //d case 9: exit(0); //echap } printf("x: %f, y: %f, a: %f.\n", d_mlx.pos_x, d_mlx.pos_y, d_mlx.angle); }      render_raycast(&d_mlx); }   XCloseDisplay(d_mlx.dpy); }

cc -o ray ray.c -I/usr/X11R6/include/ -L/usr/X11R6/lib/ -lX11 -lm

La touche echap quitte
Les touches de direction deplacent sur les axes (non pas par rapport a l'angle de vue)
Les touches +/- modifient l'angle de vue.

Et il faut appuyer sur enter lorsqu'on l'as lancé pour afficher.

good luck
Vini, vidi, vici !

23

 parceque sinon une division d'un float par un entier tout les 2 mis en #define...
>> non est non, tu as du te tromper, ca marche parfaitement.

24

Alors, Orion, tu as trouvé ?
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

25

Je ne comprends pas comment fonctionne ta fonction return_vector. Pourquoi elle utilise un paramètre x ? À quoi correspond-il exactement ?

Ça me rappelle ma tentative de faire un wolfenstein3D tout ça trilove w3d.gif
Mais la précision des calculs était trop moyenne...
Et puis il y a les cas particuliers où le rayon est horizontal ou vertical, et ne rencontre pas d'intersection avant un tile situé à 3 km... J'étais un peu frustré.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

26

-

27

Je ne comprends pas pourquoi tu as besoin de connaître la colonne qui sera affichée à l'écran pour calculer l'orientation de ton vecteur de direction trifus
Tu peux m'expliciter comment elle fonctionne (j'ai la flemme d'essayer de comprendre à partir du code lui-même) ?
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

28

-

29

j'utilise betement la formule qu'on nous a donner, mais je ne l'ai pas comprise smile

bienvenue dans les cours d'ol tritop
ca risque d'etre sportif quand vous attaquerez le rt grin (vu que ses cours s'ameliorent pas du raycaster au raytracer, et qu'ils s'ameliorent pas non plus d'une annee a l'autre (de tte facons il a pas du les refaire, leur pourritude devait correspondre a ce qui etait attendu d'un cours d'igraph je suppose gol))
donc si quelqu'un pourrais nous expliquer aussi

et les asteks y peuvent pas? smile
sinon au pire je peux te taper une explication vite fait (c'est pas garanti que ca soit plus clair hein grin)
In many respects the Yoshi is like a beautiful woman. A man can come so enamoured that he bestows on her all his time, his energy and his fortune.
- Fred whipple, 1960

*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & Sabrina

30

et ben sous netbsd ça morche po :/ je pas compris non plus, mais dans tout les cas ça me renvoyais un resultat faux. sauf si je passais l'entier en float, la c'etait bon.

>> sous osX et nux, ca marche parfaitement. Là c'est quand meme honteux comme bug.