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.

31

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

moi non plus triso

beuurkk couic2
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); 
}


recapitulation grin
- t'as ton vecteur de vision dans ta scene 2D, donc juste l'angle de rotation autour de l'axe qui passe verticalement dans le plan de ta scene, d'apres ton code c'est w->angle
- cet angle/vecteur de vision correspond a la direction du rayon qui passe par le milieu de l'ecran, en x = XSIZE / 2;
- l'angle entre le coin gauche et le coin droit de l'ecran est donne par le fov.
- tu veux balayer la scene pour chaque colonne de pixels de gauche a droite, donc en commencant a angle - fov / 2 et en t'arretant a angle + fov / 2
- pour chaque colonne, tu veux lancer un rayon dans ta scene a l'angle correspondant a la colonne.

pour l'instant ca donne a peu pres ce que t'as deja:

float cur_angle;
float inc_angle;
int i;

cur_angle = w->angle - fov / 2.0f;
inc_angle = fov / (float)XSIZE;
for (i = 0; i < XSIZE; i++)
  {
    raycast(w, cur_angle, i);
    cur_angle += inc_angle;
  }


rien de complique jusque la nan?

bon, donc t'as l'angle du rayon que tu veux lancer dans ta scene...
la tu veux afficher une colonne pour chaque rayon, colonne composee d'un plafond (eventuellement), d'un mur, et d'un sol (eventuellement aussi).
vu que c'est tout en 2D et que la seule information que t'as c'est la distance de l'oeil au mur que ton rayon a (eventuellement) intersecte, et que plus un mur est loin, plus il est petit (en fonction de 1 / la distance), plus la distance est grande, plus ton mur apparaitra petit, ok jusque la...

donc quand t'as la distance d'intersection (tu te demmerde deja pour l'avoir et visiblement ca ca marche), tu scale la colonne correspondant au mur avec cette valeur. sauf que juste faire ca, ca te donne l'effet fishbowl en question, vu que plus t'envoie un rayon sur le cote, cad decentre par rapport a ton vecteur de vision (celui qui passe par le centre de l'ecran), plus l'intersection est loin. si t'as un mur infiniment long 5 cm en face de ton ecran, et que t'as un fov de 180 degres, aux extremites de ton ecran, le mur aura une distance infinie...

bon, la distance que tu veux est celle qu'aurait le mur si il etait pile en face de ta camera.
comme l'a dit je sais plus qui (flemme de remonter), tu dois projeter le vecteur qui va de ton oeil a l'intersection du mur sur le vecteur de vision (celui qui passe par le centre de ta camera), c'est a dire faire la racine carree du produit scalaire entre les deux vecteurs, c'est a dire multiplier par le cos de l'angle entre le vecteur de vision et le vecteur courant (de la colonne):

void raycast(t_mlx *w, float angle, float x)
{
  VECTOR2D vec;
  float dist;

  vec.x = cosf(angle); // ca ca depend ce comment t'as foutu ton repere, et de comment est mesure l'angle
  vec.y = sinf(angle);
  dist = intersect(w, &vec); // retourne la distance avec le mur le plus proche
  dist *= cosf(w->angle - angle);
  draw_column(w, dist, x);
}


apres, le draw_column, bah si t'as la hauteur de tes murs dans w->height (tu peux faire des murs plus ou moins hauts avec ca, mais tu verra pas ceux de derriere si ils sont plus hauts), il suffit de faire:

void draw_column(t_mlx *w, float dist, float x)
{
  draw_hline(w, x, w->height / dist);
}
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

32

samsung: ton vecteur de direction ne devait pas etre perpendiculaire au plan de la camera

33

samsung: ton vecteur de direction ne devait pas etre perpendiculaire au plan de la camera

samsung trisotfl
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

34

-

35

kk = k * cos(RADIAN(w->angle - a)); draw_wall_line(w, x, YSIZE / (2 * k));


kk c'est bien de le calculer, ca serait encore mieux de l'utiliser nan? triso
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

36

-

37

-

38

-

39

-

40

1) Bizarre que la précision change. Normalement ça ne devrait pas poser de problème... Surtout si tu utilises des floats.
Tu considères que les tiles font quelle largeur ?

2) La longueur tu peux facilement l'obtenir avec un peu de trigonométrie, tu connais les coordonnées et l'angle (utilise la tangente). N'oublie pas d'apporter la correction fishbowl. Et il est fort possible qu'il y ait une simplification possible de ce côté là.

3) La face du mur tu la connais parce que tu sais si ton intersection est faite du côté horizontal ou du côté vertical (en regardant ta map de haut), et tu connais la direction du rayon donc tu peux déterminer facilement si c'est le côté EST ou OUEST d'une intersection verticale et pareil pour les intersections horiontales.
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. »

41

-

42

Tu sais si c'est une intersection horizontale ou verticale parce que tu ne testes pas de la même manière l'une et l'autre, cf ./37 ou plutôt : http://www.permadi.com/tutorial/raycast/rayc7.html
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. »

43

-

44

En effet, ton code ne permet pas du tout d'obtenir des infos sur la collision.
Par contre, c'est bizarre que la précision soit meilleure qu'en testant case par case (cad comme indiqué chez Mr Permadi), parce que ton code augmente la taille du rayon jusqu'à ce qu'il tombe sur une case WALL, donc tu ne t'arrêtes pas dès que tu es en collision avec un mur, mais dès que tu es en superposition avec un mur, donc tu perds en précision.

Je te conseille vivement d'utiliser la technique de Permadi, en plus d'être plus rapide, ça permet de faire plus de choses.
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. »

45

-

46

Ben si tu utilises une technique case par case, ta précision est excellent puisque la distance que tu calcules pour ton rayon lorsque tu te trouves dans un cas de collision est celle entre la bordure de la case et le point de vue. Donc normalement ça devrait être mieux... Cela dit, tout dépend des échelles que tu choisis.
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. »

47

-

48

Alors tu t'en sors ?

Euh, si tu veux je peux ressortir mes vieux shémas quand j'en avais codé un sur TI, il y a toutes les formules tritop
Sinon, j'ai l'impression que dans le tuto de Permadi on te tient suffisemment la main de toute façon, ça ne devrait pas être trop compliqué...
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. »

49

-

50

virgule fixe ou flottante, peu importe, si le principe est le 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. »

51

heu, au fait, petite precision, j'avais pas lu tout le debut du topic mais je viens de voir ca:
sauf erreur de ma part, dans la fonction:
void render_raycast(t_mlx *w);
ceci = return_vector(x, a); 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:
return_vector(&e, x, a);
de modifier la declaration de ta fonction:
t_floatpoint return_vector(t_floatpoint *e2, int x, double a);
de supprime la declaration de e2 dans cette fonction
est de modifier les affectations de valeurs:

e2->x = (e1.x * cos(RADIAN(a))) - (e1.y * sin(RADIAN(a))); e2->y = (e1.x * sin(RADIAN(a))) + (e1.y * cos(RADIAN(a)));

Orion_
:
Folays :
Il n'est pas possible de retourner une structure.

et si smile
preuve en est, j'utilise cette fonction (return vector) pour generer mes deplacements dans la map et ça fonctionne parfaitement smile


ca depend de la calling convention mais.. des que tu return un datatype qui ne peut pas etre retourne directement dans un registre (eax/edx ou fp0), il est retourne en memoire.
et cette memoire est allouee par la fonction appelante, qui passe un pointeur vers cette zone memoire a la fonction appelee (generalement en premier parametre (cache)).

faire ca:

t_truc pwet(int a, int b)
{
t_truc toto;

toto.a = a;
toto.b = b;
return (toto);
}

et l'appeler avec:

{
t_truc toto;

toto = pwet(1, 2);
}

revient, dans le code final, exactement au meme que de faire:

void pwet(t_truc *toto, int a, int b)
{
toto->a = a;
toto->b = b;
}

et l'appeler avec:

{
t_truc toto;

pwet(&toto, 1, 2);
}

enfin ca c'est pour stdcall, cdecl (et tres probablement fastcall) et peut etre qques autres, y en a peut etre qui ont une convention de retour differente...

d'ailleurs tu peux matter le code que genere gcc avec -S histoire d'en etre sur smile

EDIT: lol... je viens d'aller voir flipcode, et ils ont un lien sur un texte la dessus dans leur news d'aujourd'hui, allez voir si ca vous interesse smile
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

52

-

53

gni?
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

54

C'était quoi, le pb ?
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. »

55

-

56

-

57

? O_o
pour ton raycaster? trifus

et en quoi VC.NET c'est une usine a gaz? trifus
et c'est pas particulierement complique a installer ou a utiliser...
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

58

-

59

-

60

pake gcc et surtout gdb, ça suxxxx mais alors d'une force quand on commence a utiliser des floattants !!
et on dirait que vc++ ne fait pas exception.

[8:44:46 PM] Onori : t assis ?
[8:44:51 PM] Onori : accroche toi
[8:44:55 PM] sBibi : assis et je mange des m&ms
[8:44:59 PM] Onori : j'avais oublier d'inclure le math.h lolpaf



rhalala ces compilateurs, tous des farceurs... smile
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