Baiklah, jadi saya sedang mengerjakan ray tracer menggunakan phong shading. Sejauh ini, semuanya baik-baik saja. Saya telah melemparkan sinar yang mengenai bola dalam pemandangan saya, menerapkan bayangan phong pada bola tersebut, dan itu terlihat normal.
Sekarang, saya menghitung sinar bayangan, yaitu menembakkan sinar dari titik perpotongan sinar utama ke sumber cahaya, dan melihat apakah sinar tersebut mengenai objek apa pun yang menghalanginya. Jika ya, berarti ia berada dalam bayangan.
Namun, saat menghitung apakah sinar bayangan mengenai bola mana pun, tampaknya ada kesalahan pada diskriminan saya yang dihitung, yang merupakan hal yang aneh karena sejauh ini benar untuk sinar primer.
Berikut pengaturannya:
// Origin of ray (x,y,z)
origin: -1.9865333, 1.0925934, -9.8653316
// Direction of ray (x,y,z), already normalized
ray: -0.99069530, -0.13507602, -0.016648887
// Center of sphere (x,y,z)
cCenter: 1.0, 1.0, -10.0
// Radius of the sphere (x,y,z)
cRadius: 1.0
, dan berikut kode untuk mencari diskriminannya:
// A = d DOT d
float a = dotProd(ray, ray);
// B = 2 * (o - c) DOT d
Point temp (2.0*(origin.getX() - cCenter.getX()), 2.0*(origin.getY() - cCenter.getY()), 2.0*(origin.getZ() - cCenter.getZ()));
float b = dotProd(temp, ray);
// C = (o - c) DOT (o - c) - r^2
temp.setAll(origin.getX() - cCenter.getX(), origin.getY() - cCenter.getY(), origin.getZ() - cCenter.getZ());
float c = dotProd(temp, temp);
c -= (cRadius * cRadius);
// Find the discriminant (B^2 - 4AC)
float discrim = (b*b) - 4*a*c;
Yang jelas sinarnya menjauhi bola, namun diskriminannya positif (2,88) yang menandakan sinar itu mengenai bola. Dan kode ini berfungsi dengan baik untuk sinar primer karena diskriminannya harus benar, namun tidak untuk sinar bayangan sekunder ini.
Apakah saya melewatkan sesuatu di sini?