IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Caml Discussion :

Lancer de rayon - que fait cette fonction ? Comment faire un effet ?


Sujet :

Caml

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Décembre 2007
    Messages : 31
    Points : 10
    Points
    10
    Par défaut Lancer de rayon - que fait cette fonction ? Comment faire un effet ?
    Bonjour,
    J'ai un code de lancer de rayon sur des sphères opaques, en CAMl, et j'ai un problème pour déterminer ce que fait une des fonction. On a, au préalable, définit quelques types :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    type point == float * float * float;;
    type vector == float * float * float;;
    type rayon == point * vector;;
    type couleur == int * int * int;;
    type sphere == point * float * couleur;;
    Et la fonction qui me pose problème est celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    let Sphere_GetCoord i1 i2 w1 w2 p =
    	((p -. i1) /. (i2 -. i1)) *. (w2 -. w1) +. w1;;
    qui se retrouve un peu après dans la fonction de rendu (sur un pixel - sachant qu'après on boucle sur tous les pixels) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    let rendu_pixel rect_Left rect_Top rect_Right rect_Bottom i j eye lp lv objects =
      	let zoom = 200.0 in
        let x = Sphere_GetCoord rect_Left rect_Right (0. -. zoom) zoom (float_of_int i) in
      	let y = Sphere_GetCoord rect_Top rect_Bottom zoom (0. -. zoom) (float_of_int j)
    in
      	let t = ref 1.0E10 in
     
      	let (px,py,pz) = eye in
    	let vx = ref (x -. px) in
    	let vy = ref (y -. py) in
    	let vz = ref (0. -. pz) in
    	let mod_v = modv (!vx,!vy,!vz) in
    	vx := !vx /. mod_v;
    	vy := !vy /. mod_v;
    	vz := !vz /. mod_v;
    	let bShadow = ref false in
    	let spherehit = ref ((0.,0.,0.),0.,(0,0,0)) in
    	let ref_objects = ref objects in
    	while !ref_objects <> [] do
    		let a = (hd !ref_objects) in
    		ref_objects := tl !ref_objects;
     
    		let taux = GetSphereIntersec a (eye,(!vx,!vy,!vz)) in
    		if (taux > 0.) && (taux < !t) then begin
    			t := taux;
    			spherehit := a;
    		end;
    	done;
    (c'est le début du code de la fonction de rendu)

    J'avais pensé que pour chaque ligne et colonne de l'image finale la fonction Sphere_GetCoord permettait d'obtenir l'abscisse ou l'ordonnée d'un point de la sphère. Mais bon j'ai vraiment du mal à voir ce que la fonction fait.

    Par ailleurs, je savoir comment insérer d'autres effets, par exemple des effets miroir et/ou transparence. Je pense qu'il faudrait insérer dans le type "sphere", des coefficients de transparence et de réflexion compris entre 0 et 1. Puis le principe resterait le même jusqu'au calcul de l'intersection du rayon avec la sphère, mais que pour le rendu on prendrait en compte ces coefficients pour donner la couleur finale au pixel. Enfin, je n'ai qu'une vague idée de ce qu'il faudrait faire, et j'aimerais un peu d'aide.

    Merci d'avance

  2. #2
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    À première vue je dirais que Sphere_GetCoord transforme les coordonnées écran/entières en coordonnées réelles à l'intérieur d'un rectangle.

    Tu ne peux pas remplacer la boucle while par List.iter (ou list_iter si c'est du Caml-Light)
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Décembre 2007
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    Si Sphere_GetCoord transforme les coordonnées écran/entières en coordonnées réelles à l'intérieur d'un rectangle, pourquoi c'est ce calcul là qui est utilisé ? Il n'y a pas d'autres moyens d'y parvenir ?

    Et pour list_iter, je ne connaissais pas cette fonction, donc je préfère ne pas y toucher...

    Mais autre chose, dans la fonction de rendu_pixel, lorsqu'on utilise Sphere_GetCoord pour le x et le y, le zoom qu'est ce que c'est ?

  4. #4
    alex_pi
    Invité(e)
    Par défaut
    Citation Envoyé par m0a-Stelle Voir le message
    Et pour list_iter, je ne connaissais pas cette fonction, donc je préfère ne pas y toucher...
    C'est pourtant comme ça qu'on apprend... En touchant à des trucs qu'on ne connait pas. Et je vois assez mal l'intérêt de faire du fonctionnel si tu ne te sers pas de ce que ça t'apporte, dont les itérateurs..

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Décembre 2007
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    Oui mais quitte à y toucher, ça changera quoi de remplacer le while par list_iter ? En quoi ça intervient sur la fonction Sphere_GetCoord ?

  6. #6
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Salut !

    Citation Envoyé par m0a-Stelle
    Oui mais quitte à y toucher, ça changera quoi de remplacer le while par list_iter ?
    Ça aura au moins le mérite de transformer ce code rocambolesque en quelque chose de plus idiomatique. Caml permet certes de programmer en impératif, mais il ne faut pas en abuser. Or ce code en abuse et offre une bonne occasion de voir qu'on peut arriver au même résultat d'une autre manière (et de façon plus élégante). D'où la suggestion de chercher à remplacer les boucles par des itérateurs, et ainsi de suite...

    Cordialement,
    Cacophrène

  7. #7
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Décembre 2007
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    Ok ok... Et pour revenir à mon problème ?

  8. #8
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par m0a-Stelle Voir le message
    Ok ok... Et pour revenir à mon problème ?
    Et bien pour en revenir à ton problème c'est fatiguant d'essayer de lire quelquechose de mal écrit. Ce qui fait que — malheureusement — beaucoup de personnes risquent de ne pas vouloir perdre leur temps. De plus tu ne sembles pas prêt à mettre les mains dans le cambouis. Pourquoi le ferions-nous à ta place ?

  9. #9
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Décembre 2007
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    Mon but n'est pas que vous le fassiez à ma place, je demande simplement de l'aide (je crois que c'est le but d'un forum d'entraide...), sachant que j'avais déjà donné mon point de vue ouvrant la discussion :

    Citation Envoyé par m0a-Stelle Voir le message
    J'avais pensé que pour chaque ligne et colonne de l'image finale la fonction Sphere_GetCoord permettait d'obtenir l'abscisse ou l'ordonnée d'un point de la sphère.
    Je pense que c'est une espèce de projection... Enfin je ne vois pas bien.

    Ce n'est pas de ma faute s'il est "mal écrit" le code. Donc tant pis, et merci quand même pour votre aide.

  10. #10
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par m0a-Stelle Voir le message
    [...]
    Je pense que c'est une espèce de projection... Enfin je ne vois pas bien.[...]
    Mais essayes de le réécrire ! Tu verras que ça t'aidera à comprendre.

Discussions similaires

  1. que fait cette fonction(5 lignes)
    Par router_ dans le forum Débuter
    Réponses: 4
    Dernier message: 14/06/2010, 08h52
  2. Que fait cette fonction ?
    Par Invité(e) dans le forum C++Builder
    Réponses: 5
    Dernier message: 05/05/2008, 20h40
  3. que fait cette fonction ?
    Par nitteo dans le forum C#
    Réponses: 21
    Dernier message: 31/01/2008, 17h30
  4. Que fait cette fonction ?
    Par masterix59 dans le forum Débuter
    Réponses: 2
    Dernier message: 16/11/2007, 21h13
  5. que fait cette fonction ?
    Par salseropom dans le forum C
    Réponses: 21
    Dernier message: 12/10/2006, 18h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo