2016-11-16 2 views
2

J'ai des problèmes avec les réflexions de raytracing.Surfaces réfléchissantes correctement rayonnées

Voici ce que j'attends de voir:
Expected

Mais ce que je vois en fait: Actual

Maintenant, ma compréhension de base de la façon d'obtenir la nouvelle direction du ray de réflexion est comme ceci:
Reflection direction equation

Voici mon code qui émule:

public Color calculateIlluminationModel(Vector normal, boolean isInShadow, Scene scene, Ray ray, Vector intersectionPoint) 
{ 
    if (isInShadow) 
    { 
     return getColorInShadow(scene); 
    } 
    else 
    { 
     Vector originalDirection = ray.getDirection(); 

     Vector reflectionVector = originalDirection 
       .subtract(normal 
         .multiply(2) 
         .multiply(originalDirection.dotProduct(normal) 
         ) 
       ) 
       .normalize(); 
     Ray reflectionRay = Ray.translateRayByEpsilon(new Ray(intersectionPoint, reflectionVector)); 
     return scene.getRayColor(reflectionRay); 
    } 
} 

Mais la sphère ne semble jamais refléter correctement quoi que ce soit. Y a-t-il quelque chose qui ne va pas dans la façon dont je calcule les rayons de réflexion?

Remarque:scene.getRayColor(reflectionRay); est le composant de traçage de rayon pour déterminer la couleur que le rayon frappe. Je crois que ce n'est pas le problème, mais si vous pensez qu'il est nécessaire de montrer cette pièce, faites le moi savoir.

+0

Etes-vous sûr que la direction normale et originale est la longueur de l'unité? –

+0

@JasonC Oui. Ils sont tous les deux normalisés. –

+0

Êtes-vous sûr que les normales pointent vers l'extérieur de l'objet et non vers l'intérieur? –

Répondre

1

Votre mathématique de réflexion semble correcte. L'image apparaît remplie de beaucoup de couleur d'ombre. Vérifiez pour voir ce qui se passe si vous fudgez isInShadow pour être faux, cela devrait aider à le réduire. Assurez-vous également que vos normales pointent dans la bonne direction et que vos vecteurs de direction sont tous normalisés (vous avez dit qu'ils le sont, mais si quelqu'un d'autre a un problème similaire, cela vaut la peine d'effectuer une double vérification).