1
$\begingroup$

I wrote the following phong reflection model for ray tracing in Rust, but I am not sure about the calculation of a reflection vector for the specular reflection.

// Vector: from eye to sphere
let v = hit_point.normalize();
// Vector: from light to sphere
let l = (hit_point - light.pos).normalize();
// Normal vector of sphere
let n = (hit_point - self.center).normalize();
// Reflected light
let r = (l + 2.0 * dot(-l, n) * n).normalize();
let white = Vec3::new(255.0, 255.0, 255.0);
let shininess = 20.0;
let cosa = f64::max(0.0, dot(-l, n));
let cosb = f64::max(0.0, dot(-r, v));

let diffuse = kd * cosa * color;
let specular = ks * cosb.powf(shininess) * white;
let ambient = ke * color;

let color = diffuse + specular + ambient;

I wrote the following program to calculate the reflection vector of the light as shown in the next image, but it did not reflect the specular reflection as shown in the next image.

let r = (l + 2.0 * dot(-l, n) * n).normalize();

enter image description here

enter image description here

Instead, when I wrote reflected ray as following program, the specular reflection is reflected nicely as follows.

let r = (-l + 2.0 * dot(l, n) * n).normalize();

Why is my first program wrong ? Why reflected ray r = l + 2(-l・n)n is wrong ?

enter image description here

$\endgroup$
1
  • $\begingroup$ The reflection equations is:$L - 2.0 * dot(L, N) * N$ $\endgroup$
    – pmw1234
    Commented Dec 16, 2022 at 15:16

0