Помогите мне решить эту ошибку с моей трассировкой лучей - PullRequest
3 голосов
/ 13 апреля 2011

Я не собираюсь публиковать какой-либо код для этого вопроса, потому что для этого потребуется слишком много контекста, но я объясню концептуально, что я делаю.

Я создаю простой трассировщик лучей, который использует аффинные преобразования. Я имею в виду, что я пересекаю все лучи из координат камеры с общими формами. Все формы имеют связанные аффинные преобразования, и лучи сначала умножаются на обратные значения этих преобразований, прежде чем пересекаются с объектами сцены.

Так, например, скажем, я хотел сферу радиуса 3, расположенную в (10,10,10). Я создаю сферу и даю ей матрицу преобразования, представляющую это преобразование.

Я создаю луч в координатах камеры. Я умножаю луч на обратную матрицу преобразования сферы и пересекаю его с общей сферой (r = 1 в (0,0,0)). Я беру расстояние вдоль этого общего луча в точке пересечения и, используя его, нахожу общий нормаль и точку вдоль исходного луча и сохраняю их в объект Преобразования (вместе с расстоянием (t) и фактическое преобразование).

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

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

Я, честно говоря, не могу понять, что я делаю здесь неправильно, но я вырываю волосы. Я не могу придумать какой-либо веской причины, чтобы это произошло. Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 18 апреля 2011

Вы приняли решение делать пересечения в координатах объекта, а не в мировых координатах. ИМХО, это ошибка (если вы не делаете много инстансинга). Однако, учитывая это, вы должны вычислить точку пересечения в пространстве объектов, а также нормаль в пространстве объектов. Их необходимо преобразовать обратно в мировые координаты, используя преобразование объектов, а НЕ его обратное. Вот как объект попадает в мировое пространство и как все в пространстве объекта попадает в мировое пространство. Я не уверен, как преобразовать параметр t, поэтому сначала я начну с преобразования точки пересечения, пока вы не получите правильные результаты.

1 голос
/ 14 апреля 2011

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не специалист по трассировке лучей, и я также неправильно понял транспонирование для транспонирования в описании проблемы.

Когда вы вычисляете нормаль в точке пересечения, вы, в частности, находитесь в «преобразованном координатном пространстве», верно? Так что нормаль будет и в этом координатном пространстве. Позже вы перемещаете этот вектор только в реальную точку пересечения, но нормаль все еще вращается.

Предполагается, что у вас есть общая сфера, которая красного цвета на положительном х и синего цвета на отрицательном х. Давайте рассмотрим, что камера находится на 20,0,0, а у вас 1-сфера только на 180 градусов вокруг оси Y (без транспонирования). Тогда луч (1,0,0) будет преобразованным лучом -1,0,0 и попадет в сферу с отрицательным x при (-1,0,0) и t = 9. Нормаль должна быть (-1 , 0,0). Когда вы перемещаете эту нормаль в реальную точку пересечения, нормаль все равно будет (-1,0,0). Таким образом, следуя этой норме, вы должны получить правильный цвет, но также и свет с «обратной стороны» сферы.

...