Mon raytracer prend en charge une grande variété d'objets. Pour les recouper, j'utilise la technique standard de transformation des rayons en espace objet. Cela fonctionne à merveille jusqu'à ce que j'ajoute du flou de mouvement.
Je modélise le flou de mouvement comme une séquence de transformations (pour simplifier la discussion, disons exactement deux) au lieu d'une. Mon approche consiste à prendre la transformée inverse du rayon aux deux images clés et à lire les positions / directions.
Cela semble bien fonctionner pour les traductions, mais il se décompose pour les rotations. Par exemple, voici deux triangles subissant des rotations de 30 et 90 degrés:
(4 échantillons, reconstruction MN, les échantillons rouges provenaient de près des deux images clés)
Aux coins, je m'attendrais à ce que les échantillons lerpés se trouvent sur une ligne droite entre les deux sommets. Au lieu de cela, ils se gonflent vers l'extérieur. C'est faux. Dans des scènes plus intéressantes avec des transformations plus intéressantes, cela provoque une variété de modes de défaillance. Par exemple, voici une hélice subissant une rotation de 45:
(100 échantillons, normales visualisées)
Certains problèmes sont dus à la rupture BVH (cela suppose que les extrema des objets se trouvent au niveau des images clés), mais même un rendu en force brute est incorrect.
Je peux résoudre tout cela en faisant des transformations directes uniquement (objet de transformation, pas le rayon), mais cela ne fonctionne que pour les objets où cela est possible (uniquement les triangles, vraiment).
Comment puis-je faire en sorte que mon raytracer produise des approximations linéaires de la transformation (en particulier la rotation) en transformant les rayons, pas les objets?
la source
AFAICS, je ne pense pas que vous irez vraiment loin, une simple approximation linéaire d'une interpolation plutôt non linéaire, mais peut-être cet article / présentation de Gribel et al sur le flou de mouvement dans la rastérisation peut aider.
la source