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

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

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.

pour moi , un fourrier , c'est quelqu'un qui te permet de percevoir ton couchage et tes chaussettes

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.
