Transformação de Raios em Espaço de Objeto para Desfoque de Movimento

12

Meu raytracer suporta uma ampla variedade de objetos. Para interceptá-los, eu uso a técnica padrão de transformar raios em espaço-objeto. Isso funciona de maneira fantástica até eu adicionar motion blur.

Eu modelo motion blur como uma sequência de transformações (para simplificar a discussão, digamos exatamente duas) em vez de uma. Minha abordagem é pegar a transformação inversa do raio nos dois quadros-chave e ler as posições / direções.

Isso parece funcionar bem para traduções, mas é interrompido por rotações. Por exemplo, aqui estão dois triângulos submetidos a rotações de 30 e 90 graus:

rotação1
(4 amostras, reconstrução MN, as amostras vermelhas vieram perto dos dois quadros-chave)

Nos cantos, eu esperaria que as amostras cortadas se encontrassem em uma linha reta entre os dois vértices. Em vez disso, eles incham para fora. Isto está errado. Em cenas mais interessantes com transformações mais interessantes, causa uma variedade de modos de falha. Por exemplo, aqui está uma hélice em rotação de 45:

rotação 2
(100 amostras, normais visualizadas)

Alguns problemas são causados ​​pela quebra do BVH (assume que os extremos dos objetos estão nos quadros-chave), mas mesmo uma renderização de força bruta está incorreta.

Eu posso consertar tudo isso apenas transformando para frente (transformar objeto, não o raio), mas isso só funciona para objetos onde isso é possível (apenas triângulos, na verdade).


Como posso fazer meu raytracer produzir aproximações lineares à transformação (especialmente rotação) transformando raios, não objetos?

imallett
fonte

Respostas:

7

Ler as posições / direções dos raios entre os quadros-chave deve ser equivalente a ler as matrizes inversas entre os quadros-chave e transformar pela matriz lida. O problema é que, se os quadros-chave tiverem rotações diferentes, essa matriz em geral será algo "estranho", com cisalhamento, escala não uniforme, etc.

Não ficaria surpreso se algumas de suas rotinas de interseção e sombreamento não funcionarem corretamente em um sistema de coordenadas distorcidas, a menos que você as tenha testado e reforçado especificamente nesses casos. (Por exemplo, pegar o produto escalar de dois vetores unitários não dá a mesma resposta em um sistema de coordenadas cortadas que em um sistema ortonormal.)

Isso é apenas um palpite, mas pode funcionar melhor se você escolher um método de interpolação em que a translação, a rotação e a escala (se aplicável) sejam lidas separadamente (usando quaternions para a parte de rotação) e combinadas novamente.

Nathan Reed
fonte
Você tem certeza de que ler o objeto transformado para frente é o mesmo que ler o raio transformado para trás? Por exemplo, posso renormalizar o raio após o lerp (e escalar a distância do acerto de acordo). Isso não altera o resultado.
ICloud #
@imallett Ler o raio deve ser equivalente a ler as matrizes inversas, mas não necessariamente ler as matrizes avançadas ou ler o objeto (como a inversão não é uma operação linear). E eu não acho que a renormalização do raio após o lerp conserte as coisas completamente - você ainda pode estar em um sistema de coordenadas distorcidas e não uniformes que pode estragar a matemática em suas rotinas de interseção.
Re
[Veja editar; melhor imagem] Pelo menos, acho que a renormalização deve descartar problemas com a interseção - mas foi o que pensei; Ler o raio não é ler o objeto. Na sua resposta, você sugeriu ler TRS [inverso?] E depois recombinar. É assim que os renderizadores de produção fazem isso?
ICloud #
3

Não acho que você vá muito longe com o AFAICS, uma única aproximação linear a uma interpolação bastante não-linear, mas talvez este artigo / apresentação de Gribel et al. Sobre motion blur na rasterização possa ajudar.

Simon F
fonte
Eu a divido em uma aproximação linear, o que é bastante típico. É possível lidar com transformações mais complexas com várias etapas desse tipo. Is Meu problema não é tornar a transformação não-linear, mas tornar correta a aproximação linear a ela.
ICloud #