Transformación de rayos en espacio de objetos para Motion Blur

12

Mi raytracer admite una amplia variedad de objetos. Para intersecarlos, utilizo la técnica estándar de transformar rayos en espacio de objetos. Esto funciona fantásticamente hasta que agregue desenfoque de movimiento.

Modelo el desenfoque de movimiento como una secuencia de transformaciones (para simplificar la discusión, digamos exactamente dos) en lugar de uno. Mi enfoque es tomar la transformación inversa del rayo en ambos fotogramas clave y mover las posiciones / direcciones.

Esto parece funcionar bien para las traducciones, pero se descompone por rotaciones. Por ejemplo, aquí hay dos triángulos que experimentan rotaciones de 30 y 90 grados:

rotación1
(4 muestras, reconstrucción MN, las muestras rojas provenían de cerca de los dos fotogramas clave)

En las esquinas, esperaría que las muestras lerpedasen en una línea recta entre los dos vértices. En cambio, se hinchan hacia afuera. Esto está mal. En escenas más interesantes con transformaciones más interesantes, causa una variedad de modos de falla. Por ejemplo, aquí hay una hélice que experimenta una rotación de 45:

rotación 2
(100 muestras, normales visualizadas)

Algunos problemas se deben a la ruptura de BVH (se supone que los extremos de los objetos se encuentran en los fotogramas clave), pero incluso un procesamiento de fuerza bruta es incorrecto.

Puedo arreglar todo esto haciendo solo transformaciones hacia adelante (transformar objeto, no el rayo), pero esto solo funciona para objetos donde eso es posible (solo triángulos, en realidad).


¿Cómo puedo hacer que mi trazador de rayos produzca aproximaciones lineales a la transformación (especialmente la rotación) transformando rayos, no objetos?

imallett
fuente

Respuestas:

7

La inserción de las posiciones / direcciones de los rayos entre los fotogramas clave debería ser equivalente a la derivación de las matrices inversas entre los fotogramas clave y la transformación mediante la matriz lerpada. El problema es que, si los fotogramas clave tienen rotaciones diferentes, esa matriz lerped será, en general, algo "extraño", con corte, escala no uniforme, etc.

No me sorprendería si algunas de sus rutinas de intersección y sombreado no funcionan correctamente en un sistema de coordenadas tan distorsionado, a menos que las haya probado y endurecido específicamente en tales casos. (Por ejemplo, tomar el producto escalar de dos vectores unitarios no da la misma respuesta en un sistema de coordenadas cortadas que en un sistema ortonormal).

Esto es solo una suposición, pero podría funcionar mejor si elige un método de interpolación en el que la traducción, la rotación y la escala (si corresponde) se repiten por separado (utilizando cuaterniones para la parte de rotación) y se vuelven a combinar.

Nathan Reed
fuente
¿Estás seguro de que saltar el objeto transformado hacia adelante es lo mismo que mover el rayo transformado hacia atrás? Por ejemplo, puedo renormalizar el rayo después del lerp (y escalar la distancia de golpe en consecuencia). Esto no cambia el resultado.
Imallett
@imallett Lerping el rayo debe ser equivalente a mover las matrices inversas, pero no necesariamente a mover las matrices hacia adelante o al objeto (ya que la inversión no es una operación lineal). Y no creo que renormalizar el rayo después de que el lerp solucione las cosas por completo: aún puede estar en un sistema de coordenadas esquivadas, de escala no uniforme que puede arruinar las matemáticas en sus rutinas de intersección y similares.
Nathan Reed
[Ver edición; mejor imagen] Al menos, creo que la renormalización debería descartar problemas con la intersección, pero eso es lo que pensé; sacudir el rayo no está sacudiendo el objeto. En su respuesta, sugirió lerping [inversa?] TRS y luego recombinar. ¿Es así como lo hacen los productores de producción?
imallett
3

No creo que llegues terriblemente lejos con AFAICS, una aproximación lineal única a una interpolación bastante no lineal, pero quizás este documento / presentación de Gribel et al sobre el desenfoque de movimiento en la rasterización pueda ayudar.

Simon F
fuente
Lo descompongo en una aproximación lineal, que es bastante típica. Uno puede manejar transformaciones más complejas con múltiples pasos de este tipo .¶ Mi problema no es hacer que la transformación no sea lineal, sino hacer que la aproximación lineal sea correcta.
Imallett