Хорошо, я работаю над трассировщиком лучей, используя затенение по Фонгу.Пока все хорошо.Я использовал лучи, которые попали в сферы в моей сцене, применил к ним затенение фонгом, и это выглядит нормально.
Теперь я вычисляю теневые лучи, которые излучают луч из точки пересечения.от первичного луча до источника света, и видеть, попадает ли он на какие-либо объекты на пути.Если это так, то он находится в тени.
Однако при вычислении попадания теневого луча в какие-либо сферы возникает ошибка с вычисляемым моим дискриминантом, что странно, поскольку до сих пор оно было правильнымдля первичных лучей.
Вот установка:
// 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
, и вот код для нахождения дискриминанта:
// 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;
Очевидно, луч направлен отсфера, но дискриминант здесь положительный (2,88), что указывает на то, что луч падает на сферу.И этот код прекрасно работает для первичных лучей, поскольку их дискриминанты должны быть правильными, но не для этих вторичных теневых лучей.
Я что-то здесь упускаю?