2016-11-16 2 views
2

Ich habe Probleme mit Raytracing Reflexionen. HierKorrekte Raytracing reflektierende Oberflächen

ist das, was ich erwarte, um zu sehen:
Expected

Aber das ist, was ich wirklich bin zu sehen: Actual

Nun, mein grundlegendes Verständnis davon, wie die neue Richtung der zu erhalten Reflexionsstrahl ist wie folgt:
Reflection direction equation

Hier ist mein Code, dass emuliert:

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); 
    } 
} 

Aber die Kugel scheint nie richtig zu reflektieren. Ist etwas falsch mit der Art, wie ich die Reflexionsstrahlen berechne?

Hinweis:scene.getRayColor(reflectionRay); ist die Ray-Tracing-Komponente, um die Farbe zu bestimmen, auf die der Strahl trifft. Ich glaube, es ist nicht das Problem, aber wenn Sie denken, dass es notwendig ist, dieses Stück zu zeigen, lassen Sie es mich wissen.

+0

Sind Sie sicher, dass normale und ursprüngliche Richtung Einheitslänge sind? –

+0

@JasonC Ja. Sie sind beide normalisiert. –

+0

Sind Sie sicher, dass die Normalen vom Objekt nach außen und nicht nach innen zeigen? –

Antwort

1

Ihre Reflexionsmathematik scheint korrekt zu sein. Das Bild erscheint mit einer Menge Schattenfarbe gefüllt. Überprüfe, was passiert, wenn du isInShadow fälschst, das sollte helfen, es einzugrenzen.

Achten Sie auch darauf, dass Ihre Normalen in die richtige Richtung zeigen und dass Ihre Richtungsvektoren normalisiert sind (Sie sagten, sie sind es, aber wenn jemand ein ähnliches Problem hat, ist es eine doppelte Überprüfung wert).