Transformacja promienia do przestrzeni obiektów dla rozmycia w ruchu

12

Mój raytracer obsługuje wiele różnych obiektów. Aby je przeciąć, używam standardowej techniki przekształcania promieni w przestrzeń przedmiotową. Działa to fantastycznie, dopóki nie dodam rozmycia ruchu.

Modeluję rozmycie ruchu jako sekwencję transformacji (aby uprościć dyskusję, powiedzmy dokładnie dwie) zamiast jednej. Moje podejście polega na pobraniu odwrotnej transformacji promienia w obu klatkach kluczowych i określeniu pozycji / kierunków.

Wydaje się, że działa to dobrze w przypadku tłumaczeń, ale rozkłada się w przypadku rotacji. Np. Tutaj są dwa trójkąty przechodzące obroty o 30 i 90 stopni:

obrót 1
(4 próbki, rekonstrukcja MN, próbki czerwone pochodziły z dwóch klatek kluczowych)

W rogach spodziewałbym się, że zaszyte próbki będą leżeć na linii prostej między dwoma wierzchołkami. Zamiast tego wybrzuszają się na zewnątrz. To jest źle. W ciekawszych scenach z ciekawszymi transformacjami powoduje to różne tryby awarii. Np. Oto śmigło przechodzące o 45 obrotów:

obrót 2
(100 próbek, wizualizowane normalne)

Niektóre problemy wynikają z pęknięcia BVH (zakłada, że ​​ekstrema obiektów leży w klatkach kluczowych), ale nawet renderowanie z użyciem siły jest niepoprawne.

Mogę to wszystko naprawić, wykonując tylko transformacje do przodu (transformuj obiekt, a nie promień), ale działa to tylko w przypadku obiektów, w których jest to możliwe (tak naprawdę tylko trójkąty).


Jak sprawić, by mój raytracer generował liniowe aproksymacje do transformacji (zwłaszcza rotacji) poprzez transformację promieni, a nie obiektów?

imallett
źródło

Odpowiedzi:

7

Przeszukiwanie pozycji / kierunków promienia między klatkami kluczowymi powinno być równoważne przeszukiwaniu macierzy odwrotnych między klatkami kluczowymi i przekształcaniu za pomocą macierzy wypróbowanej. Problem polega na tym, że jeśli klatki kluczowe mają różne obroty, to macierzowa matryca będzie na ogół czymś „dziwnym”, ze ścinaniem, nierównomierną skalą itp.

Nie zdziwiłbym się, gdyby niektóre z twoich procedur przecinania i cieniowania nie działały poprawnie w tak zniekształconym układzie współrzędnych, chyba że specjalnie je przetestowałeś i wzmocniłeś na takie przypadki. (Na przykład pobranie iloczynu dwóch wektorów jednostkowych nie daje takiej samej odpowiedzi w ścinanym układzie współrzędnych jak w układzie ortonormalnym.)

To tylko przypuszczenie, ale może działać lepiej, jeśli wybierzesz metodę interpolacji, w której tłumaczenie, obrót i skala (jeśli dotyczy) są oddzielane oddzielnie (przy użyciu czwartorzędów dla części obrotu) i łączone ponownie.

Nathan Reed
źródło
Czy na pewno przeniesienie przekształconego do przodu obiektu jest tym samym, co przeniesienie przekształconego do tyłu promienia? Na przykład mogę renormalizować promień po lerpie (i odpowiednio skalować odległość trafienia). To nie zmienia wyniku.
imallett
@imallett Przeszukiwanie promienia powinno być równoważne z przeszukiwaniem macierzy odwrotnych, ale niekoniecznie z przeszukiwaniem macierzy do przodu lub przeszukiwaniem obiektu (ponieważ inwersja nie jest operacją liniową). I nie sądzę, aby renormalizacja promienia po tym, jak Lerp całkowicie naprawia wszystko - wciąż możesz być w ścinanym, nierównomiernie skalowanym układzie współrzędnych, który może popsuć matematykę w twoich skrzyżowaniach i tym podobne.
Nathan Reed
[Zobacz edycję; lepszy obraz] Przynajmniej uważam, że renormalizacja powinna wykluczyć problemy ze skrzyżowaniem - ale tak myślałem; przeciąganie promienia nie jest śledzeniem obiektu. W swojej odpowiedzi zasugerowałeś przeszukanie [odwrotna?] TRS, a następnie rekombinację. Czy w ten sposób rendererzy produkcji to robią?
imallett
3

Nie sądzę, żebyś za daleko zaszedł, AFAICS, pojedyncze liniowe przybliżenie do raczej nieliniowej interpolacji, ale być może ten artykuł / prezentacja Gribela i innych na temat rozmycia w ruchu w rasteryzacji może pomóc.

Simon F.
źródło
Rozbijam go na przybliżenie liniowe, co jest dość typowe. Bardziej złożone transformacje można obsługiwać za pomocą wielu takich kroków. Moim problemem nie jest uczynienie transformacji nieliniowej, ale poprawienie jej przybliżenia liniowego.
imallett