#graphics #geometry #raytracing #matrix-multiplication
#графика #геометрия #трассировка лучей #умножение матрицы
Вопрос:
Я не собираюсь публиковать какой-либо код для этого вопроса, потому что это потребовало бы слишком большого контекста, но я объясню концептуально, что я делаю.
Я создаю простой трассировщик лучей, который использует аффинные преобразования. Я имею в виду, что я пересекаю все лучи из координат камеры с общими формами. Все фигуры имеют связанные аффинные преобразования, и лучи сначала умножаются на обратные значения этих преобразований, прежде чем пересекаться с объектами сцены.
Итак, допустим, я хотел, чтобы сфера радиусом 3 располагалась в (10,10,10). Я создаю сферу и даю ей матрицу преобразования, представляющую это преобразование.
Я создаю луч в координатах камеры. Я умножаю луч на обратную матрицу преобразования сферы и пересекаю его с общей сферой (r = 1 при (0,0,0)). Я беру расстояние вдоль этого общего луча в точке пересечения и, используя его, нахожу общую нормаль и точку вдоль исходного луча и сохраняю их в объекте преобразования (вместе с расстоянием (t) и фактическим преобразованием).
Когда приходит время определить цвет этой точки пересечения, я беру обратную транспонировку преобразования и умножаю ее на общую нормаль, чтобы найти нормаль. Точка пересечения — это просто точка вдоль исходного нетрансформированного луча, если я использую значение t из пересечения обратного преобразованного луча.
Проблема в том, что когда я делаю что-то таким образом, преобразования имеют странные эффекты. Основной эффект заключается в том, что преобразования, похоже, уводят источники света со сцены вместе с ними. Если я создаю кучу изображений и применяю к сфере немного больший поворот с каждым кадром, кажется, что это перемещает источники света в сцене вместе с ними. Вот пример
Честно говоря, я не могу понять, что я здесь делаю не так, но я рву на себе волосы. Я не могу придумать ни одной веской причины для того, чтобы это происходило. Я был бы очень признателен за любую помощь.
Комментарии:
1. Поскольку вы определяете точку пересечения, подключая значение t к исходному лучу, вы пробовали вычислять нормаль из этой точки пересечения вместо преобразования общей нормали?
2. Я предполагаю, что либо ваше вычисление пересечения идет неправильно, либо вычисление нормального. Трудно сказать, какая именно, потому что сферы вращательно симметричны. Можете ли вы изменить свою трансформацию, чтобы выровнять сферу вдоль горизонтальной оси? Единственное, что я могу предложить, это центрировать сферу так, чтобы середина находилась в середине экрана, а затем просто отобразить этот пиксель. Затем выполните вычисления, так как цифры должны быть простыми.
3. Просто мысль. Что вы повернули, чтобы получить эти 3 изображения? и вы уверены, что это то, что вы на самом деле сделали? Похоже, что камера движется вокруг сферы.
4. Похоже, вы могли забыть применить к источникам света ту же матрицу преобразования, что и к камере?
Ответ №1:
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я не эксперт в трассировке лучей, и я также неправильно понял транспонирование для транспозиции в описании проблемы.
В частности, когда вы вычисляете нормаль в точке пересечения, вы находитесь в «преобразованном координатном пространстве», верно? Таким образом, нормальное значение также будет в этом координатном пространстве. Позже вы только переносите этот вектор в реальную точку пересечения, но нормаль все равно поворачивается.
Предположим, у вас есть общая сфера, которая является красной при положительном x и синей при отрицательном x. Давайте рассмотрим, что камера установлена на 20,0,0, а ваша 1-сфера расположена всего на 180 градусов вокруг оси y (без переноса). Тогда луч (1,0,0) будет преобразованным лучом -1,0,0 и попадет в сферу из отрицательного x при (-1,0,0) и t = 9. Нормальным должно быть (-1,0,0). Когда вы перенесете эту нормаль в реальную точку пересечения, нормаль все равно будет (-1,0,0). Итак, следуя этому правилу, вы должны получить правильный цвет, а также свет с «обратной стороны» сферы.
Комментарии:
1. Мартин говорит, что он умножает обратную транспонировку преобразования на общую нормаль — это должно преобразовать нормаль обратно в глобальные координаты.
2. Кстати, не уверен, что вы подразумеваете под «только транспонировать этот вектор».
3. @jon-hanson: для нахождения точки пересечения он умножает на «обратную матрице преобразования сферы» (которая, я полагаю, включает любое вращение), в то время как позже он пишет, что использует «обратную транспонировку преобразования», то есть без вращения, вот почему я написал «только транспонировать».
4. @subsub: почему транспонирование матрицы исключает поворот?
5. @jon-hanson: верно, я глупый. Я читаю транспонирование как перевод … то есть только перемещение.
Ответ №2:
Вы приняли решение выполнять пересечения в координатах объекта, а не в мировых координатах. ИМХО, это ошибка (если только вы не создаете много экземпляров). Однако, учитывая это, вы должны вычислить точку пересечения в пространстве объектов, а также нормаль в пространстве объектов. Их необходимо преобразовать обратно в мировые координаты, используя преобразование объектов, а не обратное ему. Вот как объект попадает в мировое пространство, и как все в пространстве объектов попадает в мировое пространство. С другой стороны, я не уверен, как преобразовать параметр t, поэтому я бы сначала преобразовал точку пересечения, пока вы не получите правильные результаты.
Комментарии:
1. Мартин использует обратное преобразование, поскольку это часть стандартной формулы для преобразования нормалей — умножьте на транспонирование обратной матрицы преобразования .
2. Я исправлен. Скоро полностью удалю ее. Никогда не сталкивался с этим, потому что я делаю все свои вычисления в мировом пространстве
![]()