Page 1 sur 2

Raytracing

Publié : jeu. 21/mai/2009 22:37
par Anonyme
Bonjour à tous , je suis en train de faire un petit moteur de raytracing

Rendu pré calculé sous purebasic :
Raytracing vidéo

je suis a la recherche d'algorithmes d'intersection entre une demis-droite et un triangle , et une ABB ( boite englobante )
Y'en a t'il parmis vous qui ont cela qui traîne quelque part ?
Comtois , tu n'a pas fait du picking sous ogre ?

Merci. :)

Re: Raytracing

Publié : jeu. 21/mai/2009 22:42
par Le psychopathe
Cpl.Bator a écrit :Bonjour à tous , je suis en train de faire un petit moteur de raytracing

Rendu pré calculé sous purebasic :
Raytracing vidéo

je suis a la recherche d'algorithmes d'intersection entre une demis-droite et un triangle , et une ABB ( boite englobante )
Y'en a t'il parmis vous qui ont cela qui traîne quelque part ?
Comtois , tu n'a pas fait du picking sous ogre ?

Merci. :)
video indisponible pour le moment

Publié : ven. 22/mai/2009 1:10
par Backup
la video fonctionne chez moi:)

Re: Raytracing

Publié : ven. 22/mai/2009 7:59
par tmyke
Cpl.Bator a écrit :je suis a la recherche d'algorithmes d'intersection entre une demis-droite et un triangle, ...
Si cela peux aider, ce topic fournis quelques codes de base qui fonctionnent. Cela peut être un bon point de départ.
http://www.purebasic.fr/french/viewtopi ... tersection

Pour ce qui est des intersections avec des éléments AABB, pareil, j'essaierais de poster un
truc ce soir en rentrant...

Publié : ven. 22/mai/2009 9:01
par Anonyme
Merci tmyke pour le plan , ca m'évite de me bouffé de la recherche :D
j'va implémenté cela. :)


@Dobro , Pour ton purelogo , tu exportes des AVI , est ce que ton code est portable ?


ps : je voudrais diffusé les sources , je n'ai pas d'espace de stockage , avez vous un équivalent à purestorage ?

Re: Raytracing

Publié : ven. 22/mai/2009 10:01
par tmyke
Cpl.Bator a écrit :je suis a la recherche d'algorithmes d'intersection entre une demis-droite et une ABB ( boite englobante )
au fait, question subsidiaire, tes boites englobantes ont une orientation quelconques dans l'espace (donc soumis à une transformation par
le biais d'une matrice), ou elles sont toujours orientées suivant le repère global ?

Publié : ven. 22/mai/2009 10:07
par Anonyme
Toujours aligné suivant le repère global , je me servirais de ces boites pour faire de l'environnement mapping.

Publié : ven. 22/mai/2009 10:16
par tmyke
Cpl.Bator a écrit :Toujours aligné suivant le repère global , je me servirais de ces boites pour faire de l'environnement mapping.
Ok, c'est plus simple dans ce cas, un petit code la dessus ce soir comme promis ;)

Publié : ven. 22/mai/2009 16:53
par Ollivier
@Cpl

Pour le stockage gratos, il y a Google (environ 7 giga). Sinon ta question est très intéressante. Il me faudrait plusieurs heures pour comprendre et trouver un algo au risque qu'il soit lent.

Une petite idée au pif: en admettant que la droite pointe dans le triangle, prendre un des trois côtés du triangle, calculer le vecteur vitesse pour faire "coulisser" le côté jusqu'au sommet opposé. Etablir la boucle et trouver la distance minimum entre la droite support du côté coulissant et la droite support du segment.
Reproduire cet algo avec un des deux autres côtés du triangle.
Puis calculer l'intersection des deux droites résultantes à chacun des deux algos.
Si le résultant est proche d'un des trois sommets, ça peut signifier que le segment ne pointe pas dans le triangle.

Maintenant, est-ce que c'est le plus rapide, j'en sais vraiment rien...

Ollivier

Publié : ven. 22/mai/2009 17:36
par Anonyme
j'ai pensé à testé la direction du rayon et la normale d'un triangle

si la normale du triangle en Z n'a pas le même signe que la direction du rayon en Z alors , risque d'intersection.

mais c'est pas le risque qu'il me faut , mais la réponse de l'intersection en Z :D

Publié : ven. 22/mai/2009 19:12
par tmyke
Comme promis voici un petit code qui permet de faire deux test sur une boite englobante.
Savoir si un point se trouve dedans (facile), et savoir si il y a une intersection entre une droite
et la boite. C'est une adaptation d'un code Irrlicht. Pour l'intersection entre une droite et un triangle, le code
que je fournie dans le post dont je donne le lien au dessus marche bien, il donne en plus les
coordonnées de traversé du triangle par le vecteur.

code:

Code : Tout sélectionner

Structure VECTOR3
  x.f
  y.f
  z.f
EndStructure
Macro VECTOR3_(dest,v1,v2,v3)
  dest\x = v1
  dest\y = v2
  dest\z = v3
EndMacro


Structure AABBOX
  min.VECTOR3
  max.VECTOR3
EndStructure
Macro AABBOX_(dest,minx, miny, minz, maxx, maxy, maxz)
  dest\min\x = minx
  dest\min\y = miny
  dest\min\z = minz
  dest\max\x = maxx
  dest\max\y = maxy
  dest\max\z = maxz
EndMacro


Procedure.l isPointInside( *ab.AABBOX, px.f, py.f, pz.f)
  If ( px>= *ab\min\x  And  px<= *ab\max\x)
    If ( py>= *ab\min\y  And  py<= *ab\max\y)
      If ( pz>= *ab\min\z  And  pz<= *ab\max\z)
        ProcedureReturn 1
      EndIf
    EndIf
  EndIf
  ProcedureReturn 0
EndProcedure

Procedure.l intersectWithLine( *ab.AABBOX, x1.f, y1.f, z1.f, x2.f, y2.f, z2.f)
  ; prend le milieu de la ligne
  Protected middle.VECTOR3
  Protected line_vect.VECTOR3
  Protected halflength.f
  Protected e.VECTOR3
  Protected t.VECTOR3
  
  ; point milieu
  middle\x = (x1 + x2)/2.0
  middle\y = (y1 + y2)/2.0
  middle\z = (z1 + z2)/2.0
  
  ; vecteur
  line_vect\x = x2-x1
  line_vect\y = y2-y1
  line_vect\z = z2-z1
  ; normalize
  length.f = (line_vect\x * line_vect\x) + (line_vect\y * line_vect\y) + (line_vect\z * line_vect\z)
    If length=0 : ProcedureReturn 0 : EndIf
    length = 1.0 / Sqr( length )
    line_vect\x = line_vect\x * length
    line_vect\y = line_vect\y * length
    line_vect\z = line_vect\z * length
    
  ; calcul de halflength
  halflength = Sqr( ((x1-x2)*(x1-x2)) + ((y1-y2)*(y1-y2)) + ((z1-z2)*(z1-z2)) ) / 2.0
  
  ; nous avons: middle/ line_vect / halflength
  e\x = (*ab\max\x - *ab\min\x)*0.5
  e\y = (*ab\max\y - *ab\min\y)*0.5
  e\z = (*ab\max\z - *ab\min\z)*0.5
  
  t\x = ((*ab\max\x + *ab\min\x)*0.5)-middle\x
  t\y = ((*ab\max\y + *ab\min\y)*0.5)-middle\y
  t\z = ((*ab\max\z + *ab\min\z)*0.5)-middle\z
  
    If  Abs(t\x) > e\x + halflength * Abs(line_vect\x)
      ProcedureReturn 0
    EndIf
    If  Abs(t\y) > e\y + halflength * Abs(line_vect\y)
      ProcedureReturn 0
    EndIf
    If  Abs(t\z) > e\z + halflength * Abs(line_vect\z)
      ProcedureReturn 0
    EndIf
 
  r.f = e\y * Abs(line_vect\z) + e\z * Abs(line_vect\y)
  If Abs( t\y * line_vect\z - t\z*line_vect\y) > r
    ProcedureReturn 0
  EndIf

  r.f = e\x * Abs(line_vect\z) + e\z * Abs(line_vect\x)
  If Abs( t\z * line_vect\x - t\x*line_vect\z) > r
    ProcedureReturn 0
  EndIf

  r.f = e\x * Abs(line_vect\y) + e\y * Abs(line_vect\x)
  If Abs( t\x * line_vect\y - t\y*line_vect\x) > r
    ProcedureReturn 0
  EndIf
 
 ProcedureReturn 1
 
EndProcedure


;===========================
; tests:
;===========================
Global box.AABBOX

; test pour la fonction isPointInside
AABBOX_(box, -2,-2,-2, 2,3,4)
Debug isPointInside( @box, 0,0,0)
Debug isPointInside( @box, 2,3,5)
Debug isPointInside( @box, -2.5,0,0)

; test pour la fonction intersectWithLine
AABBOX_(box, -2,-2,-2, 2,2,2)
Debug intersectWithLine( @box, -4,2,0,4,0,0)
Debug intersectWithLine( @box, 0,5,3, 0,-5,2)

A tester, j'ai pas vraiment poussé les essais du code ci-dessus ;)
(PS: ce tuto t'aurais-t-il inspiré ? ray tracer interactif)

Publié : ven. 22/mai/2009 21:51
par Anonyme
Merci Tmyke , j'vais voir tout ca.
merci aussi pour le lien , je ne connaissais pas du tout malgrès les recherches.

Au sujet de la 3D , ayant fait du polygonale en software , je trouve que la methode de raytracing est plus "naturelle" à codé.

Publié : ven. 22/mai/2009 23:29
par Ollivier
T'utilise les suites de Fourrier?

Publié : sam. 23/mai/2009 0:08
par Anonyme
Pas à ma connaissance. :D
pour moi , un fourrier , c'est quelqu'un qui te permet de percevoir ton couchage et tes chaussettes :D

Publié : sam. 23/mai/2009 8:56
par tmyke
Cpl.Bator a écrit :Au sujet de la 3D , ayant fait du polygonale en software , je trouve que la methode de raytracing est plus "naturelle" à codé.
je fais partie de ces gens qui pensent que c'est l'avenir de la 3D temps réél, même si
pour l'instant, les outils, qu'ils soient software ou hardware, restent encore timides et pas mature. :roll: