Я пишу проект трассировки лучей с C++ и OpenGL и сталкиваюсь с некоторыми препятствиями с помощью функции пересечения сферы: я проверил несколько источников и математика выглядит правильно, но почему-то для каждого луча метод пересечения возвращает true. Вот код функции пересечения сферы, а также какой-либо другой код для осветления:Ray Tracing - пересечение геометрической сферы - функция пересечения возвращает true для всех лучей, несмотря на отсутствие пересечения
bool intersect(Vertex & origin, Vertex & rayDirection, float intersection)
{
bool insideSphere = false;
Vertex oc = position - origin;
float tca = 0.0;
float thcSquared = 0.0;
if (oc.length() < radius)
insideSphere = true;
tca = oc.dot(rayDirection);
if (tca < 0 && !insideSphere)
return false;
thcSquared = pow(radius, 2) - pow(oc.length(), 2) + pow(tca, 2);
if (thcSquared < 0)
return false;
insideSphere ? intersection = tca + sqrt(thcSquared) : intersection = tca - sqrt(thcSquared);
return true;
}
Вот некоторые из контекста функции трассировки лучей, которая вызывает функцию пересечения. FYI моя камера в (0, 0, 0), и что это то, что в моей переменной «происхождения» в трассировки лучей функция:
#define WINDOW_WIDTH 640
#define WINDOW_HEIGHT 480
#define WINDOW_METERS_WIDTH 30
#define WINDOW_METERS_HEIGHT 20
#define FOCAL_LENGTH 25
rayDirection.z = FOCAL_LENGTH * -1;
for (int r = 0; r < WINDOW_HEIGHT; r++)
{
rayDirection.y = (WINDOW_METERS_HEIGHT/2 * -1) + (r * ((float)WINDOW_METERS_HEIGHT/(float)WINDOW_HEIGHT));
for (int c = 0; c < WINDOW_WIDTH; c++)
{
intersection = false;
t = 0.0;
rayDirection.x = (WINDOW_METERS_WIDTH/2 * -1) + (c * ((float)WINDOW_METERS_WIDTH/(float)WINDOW_WIDTH));
rayDirection = rayDirection - origin;
for (int i = 0; i < NUM_SPHERES; i++)
{
if (spheres[i].intersect(CAM_POS, rayDirection, t))
{
intersection = true;
}
}
Спасибо за взглянуть и дайте мне знать, если есть какие-либо другие код, который может помочь!
Ну, 'intersect()' имеет два 'return true' в нем, который говорит ваш отладчик, продолжает получать удар? – genpfault
Должно быть только одно утверждение «return true»; другой просто присваивает значение «insideSphere» истинное значение. – jdark135
Извините, понимание чтения не выполнено. – genpfault