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

C++ Discussion :

Changement repère Path Tracing estimateur Monte Carlo


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 41
    Points : 14
    Points
    14
    Par défaut Changement repère Path Tracing estimateur Monte Carlo
    Bonjour,

    Je suis en train d'apprendre le Path Tracing à l'aide d'estimateurs Monte Carlo.

    A chaque point d'intersection avec une surface je dois lancer des rayons uniformément dans un hémisphère. Celui-ci est centré sur la normale à la surface.

    Dans mon code, je génère uniformément ces rayons dans un hémisphère orienté vers le haut. Cependant si une normale n'est pas orientée vers le haut, ce n'est pas bon.

    Comme le montre l'image ci-dessous tirée de http://www.scratchapixel.com/images/...alillum1a.png?

    Nom : shad2-globalillum1a.png
Affichages : 191
Taille : 45,9 Ko

    Je veux donc changer de repère. (i.e pivoter la direction générée selon la normale à la surface)

    http://www.scratchapixel.com/lessons...implementation

    Le site ci-dessus le fait mais je n'arrive pas à avoir les résultats escomptés.

    Je passe de coordonnées polaires à cartésiennes.

    Voici mon code :

    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
     
    createCoordinateSystem(n, Nt, Nb);
     
    for (int i = 0; i < samps; ++i)
    {
    	double r1 = distrib(generator);
    	double r2 = distrib(generator);
     
    	float sinTheta = sqrtf(1 - r1 * r1);
    	float phi = 2 * 3.14159265359 * r2;
    	float xTemp = sinTheta * cosf(phi);
    	float zTemp = sinTheta * sinf(phi);
     
    	Vec sample(xTemp, r1, zTemp);
     
    	Vec v;
    	v.x = sample.x * Nb.x + sample.y * n.x + sample.z * Nt.x;
    	v.y = sample.x * Nb.y + sample.y * n.y + sample.z * Nt.y;
    	v.z = sample.x * Nb.z + sample.y * n.z + sample.z * Nt.z;
     
    	Ray newR(x, v.norm());
     
    	const double f = clamp(n.dot(v.norm()));
     
    	temp = temp + (shade(newR, depth - 1).mult(obj.c / 3.14159265359) * f) / pdf;
    }
     
    return (temp) / samps;
    La focntion createCoordinateSystem est une fonction qui crée un nouveau repère avec comme axe Y la normale à la surface. Je comprends cette fonction mais je ne comprends pas pourquoi il inversent les composantes Y et Z lors de la création du vecteur sample.

    Qu'est ce qu'il ne va pas avec ce code ?

    Merci

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 186
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 186
    Points : 17 126
    Points
    17 126
    Par défaut
    Ce code m'a l'air légitime.
    Comme ta question porte sur les mathématiques, as-tu fait des vérifications manuelles des résultats de la fonction?
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Invité
    Invité(e)
    Par défaut
    Effectivement, on dirait qu'il y a une erreur dans leur explication. Ils disent calculer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                 (Tx Ty Tz)
    (Sx Sy Sz) * (Nx Ny Nz) = (SxTx+SyNx+SzBx  SxTy+SyNy+SzBy  SxTz+SyNz+SzBz)
                 (Bx By Bz)
    alors que ce serait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                 (Bx By Bz)
    (Sx Sy Sz) * (Nx Ny Nz) = (SxBx+SyNx+SzTx  SxBy+SyNy+SzTy  SxBz+SyNz+SzTz)
                 (Tx Ty Tz)
    Cela dit comme c'est de l'échantillonnage uniforme, ça ne change rien au résultat final.

    Pour ton problème, c'est difficile à imaginer à partir d'un "pas les résultats escomptés".
    Une idée cependant, quand tu crées ton rayon réfléchi avec :
    si "x" est le point d'intersection alors les approximations numériques risquent de placer l'origine du rayon à l'intérieur de l'objet 3D (et donc, au final, de donner une luminance nulle). Pour éviter ce problème, on déplace généralement l'origine du rayon d'un epsilon dans la direction du rayon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Vec v1 = v.norm();   // en supposant que norm() retourne le vecteur normalisé
    Ray newR(x + epsilon*v1, v1);
    Dernière modification par Invité ; 08/02/2016 à 23h31.

  4. #4
    Invité
    Invité(e)
    Par défaut
    mais de rien, ça m'a fait plaisir de perdre mon temps à te répondre alors que visiblement tu n'en avais rien à carrer.

Discussions similaires

  1. Simulation de Monte Carlo par Cognos v7
    Par waelT dans le forum Cognos
    Réponses: 1
    Dernier message: 17/02/2008, 13h37
  2. Voyageur de Commerce et Monte Carlo
    Par bonjour69 dans le forum Algorithmes et structures de données
    Réponses: 14
    Dernier message: 20/05/2007, 11h21
  3. [VBA-E]Pb Simulation de Monté Carlo avec stockage d'information
    Par geminium dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 19/04/2007, 16h16
  4. Monte Carlo Markov Chain
    Par Eric06 dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 27/07/2006, 12h30
  5. Simulation Monte Carlo (Analyse de risque)
    Par apoingsfermes dans le forum C++
    Réponses: 5
    Dernier message: 19/05/2006, 15h39

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