Преобразование луча в пространство объекта для размытия движения


12

Мой raytracer поддерживает самые разные объекты. Чтобы пересечь их, я использую стандартную технику преобразования лучей в объект-пространство. Это работает фантастически, пока я не добавлю размытие в движении.

Я моделирую размытие движения как последовательность преобразований (чтобы упростить обсуждение, скажем, ровно два) вместо одного. Мой подход заключается в том, чтобы взять обратное преобразование луча в обоих ключевых кадрах и зафиксировать позиции / направления.

Это, кажется, работает хорошо для переводов, но это не работает для вращений. Например, здесь два треугольника подвергаются поворотам на 30 и 90 градусов:

rotation1
(4 образца, реконструкция MN, красные образцы получены около двух ключевых кадров)

В углах, я ожидал бы, что образцы lerped будут лежать на прямой линии между двумя вершинами. Вместо этого они выпирают наружу. Это не правильно. В более интересных сценах с более интересными трансформациями это вызывает множество режимов отказа. Например, вот пропеллер, вращающийся на 45 градусов:

вращение 2
(100 образцов, нормали визуализированы)

Некоторые проблемы возникают из-за взлома BVH (он предполагает, что экстремумы объектов лежат на ключевых кадрах), но даже грубый рендеринг некорректен.

Я могу исправить все это, выполнив только прямое преобразование (преобразование объекта, а не луча), но это работает только для объектов, где это возможно (на самом деле только треугольники).


Как я могу заставить мой raytracer производить линейные приближения к преобразованию (особенно вращению) путем преобразования лучей, а не объектов?

Ответы:


7

Изменение положения / направления луча между ключевыми кадрами должно быть эквивалентно переносу обратных матриц между ключевыми кадрами и преобразованию с помощью lerped матрицы. Проблема в том, что, если ключевые кадры имеют разные повороты, эта матрица с lerped будет в общем случае чем-то «странным» со сдвигом, неравномерным масштабом и т. Д.

Я не удивлюсь, если некоторые из ваших процедур пересечения и затенения не будут работать должным образом в такой искаженной системе координат, если вы специально не протестировали и не закалили их в таких случаях. (Например, взятие точечного произведения двух единичных векторов не дает такого же ответа в сдвинутой системе координат, как в ортонормированной.)

Это всего лишь предположение, но оно может сработать лучше, если вы выберете метод интерполяции, в котором перемещение, поворот и масштаб (если применимо) переносятся отдельно (с использованием кватернионов для вращающейся части) и объединяются.


Вы уверены, что перетягивание трансформированного вперед объекта - это то же самое, что и трансформирование обратного трансформированного луча? Например, я могу перенормировать луч после скачка (и соответственно масштабировать расстояние попадания). Это не меняет результат.
Ималлетт

@imallett Леппинг луча должен быть эквивалентен прочесыванию обратных матриц, но не обязательно прокалыванию прямых матриц или прокалыванию объекта (поскольку инверсия не является линейной операцией). И я не думаю, что перенормировка луча после того, как lerp полностью исправит ситуацию - вы все еще можете быть в срезанной, неравномерно масштабированной системе координат, которая может испортить математику в ваших процедурах пересечения и тому подобное.
Натан Рид

[См. Редактировать; лучшая картина] По крайней мере, я думаю, что перенормировка должна исключить проблемы с пересечением - но я так и думал; Леппинг луча не лерпирует объект. В своем ответе вы предложили lerping [inverse?] TRS и затем рекомбинировать. Так ли это делают рендеры?
Ималлетт

3

Я не думаю, что у вас получится ужасно далеко, с AFAICS, одним линейным приближением к довольно нелинейной интерполяции, но, возможно, эта статья / презентация Грибеля и др. О размытости при растеризации может помочь.


Я делю это на линейное приближение, что довольно типично. Можно обрабатывать более сложные преобразования с помощью нескольких таких шагов. Моя проблема не в том, чтобы сделать преобразование нелинейным, а в том, чтобы сделать линейное приближение к нему правильным.
Ималлетт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.