Пересечение Луч-Сфера: дискриминант НЕПРАВ - PullRequest
1 голос
/ 25 декабря 2011

Хорошо, я работаю над трассировщиком лучей, используя затенение по Фонгу.Пока все хорошо.Я использовал лучи, которые попали в сферы в моей сцене, применил к ним затенение фонгом, и это выглядит нормально.

Теперь я вычисляю теневые лучи, которые излучают луч из точки пересечения.от первичного луча до источника света, и видеть, попадает ли он на какие-либо объекты на пути.Если это так, то он находится в тени.

Однако при вычислении попадания теневого луча в какие-либо сферы возникает ошибка с вычисляемым моим дискриминантом, что странно, поскольку до сих пор оно было правильнымдля первичных лучей.

Вот установка:

// 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), что указывает на то, что луч падает на сферу.И этот код прекрасно работает для первичных лучей, поскольку их дискриминанты должны быть правильными, но не для этих вторичных теневых лучей.

Я что-то здесь упускаю?

Ответы [ 3 ]

3 голосов
/ 30 декабря 2011

Итак, краткий ответ на мою проблему, на случай, если кто-то обнаружит это и столкнется с такой же проблемой:

Дискриминант сообщает вам, существует ли попадание для строки не для луча , как я думал). Если он положительный, то он обнаружил попадание где-то на линии.

Итак, при расчете значения t для луча, проверьте, не отрицательные ли они. Если они есть, то это удар ЗА ТОЧКОЙ начала координат луча (то есть противоположного направления луча), поэтому откажитесь от него. Сохраняйте только положительные значения, поскольку они попадают в направлении луча.

Еще более короткий ответ : отбросить отрицательные t-значения.

Благодарность идет щепам за то, что я понял это.

0 голосов
/ 25 декабря 2011

Проблема в том, что для нахождения пересечения прямой и сферы требуется решение квадратного уравнения. Такое уравнение имеет одну из трех возможностей в качестве решения - существует 0, 1 или 2 реальных решения этого уравнения. Знак дискриминанта говорит нам, сколько существует реальных решений (а также помогает нам найти решение для этих решений).

Если существует уникальное решение, то линия просто целует поверхность сферы. Это происходит, когда дискриминант равен нулю.

Если существуют два решения, то линия проходит через сферу, ударяясь о поверхность в ДВУХ различных точках.

Если реального решения не существует (случай, когда дискриминант отрицателен), то линия находится слишком далеко от сферы, чтобы вообще ее коснуться.

Обнаружив, проходит ли когда-либо линия около сферы или нет, только тогда мы будем беспокоиться, попадет ли луч на нее. Для этого мы можем посмотреть, как мы определяем луч. Луч - это половина линии, простирающаяся до бесконечности только в одном направлении. Итак, мы смотрим, где на линии происходят точки пересечения. Только если пересечение происходит на половине линии, о которой мы заботимся, существует пересечение RAY-сферы.

Дело в том, что вычисление дискриминанта (и просто проверка его знака) говорит ТОЛЬКО о том, что делает линия, а не о том, где происходит пересечение вдоль этой линии.

Конечно, внимательное прочтение ссылки, которую вы сами предоставили, могло бы рассказать вам обо всем этом.

0 голосов
/ 25 декабря 2011

Уверен, что "oc" должно быть "co"

Вы стреляете лучом в неправильном направлении и находите пересечение на другой стороне сферы.

...