Comment lancer un lancer de rayons sur des surfaces de Bézier?


18

J'ai essayé cette question sur math.SE et étonnamment, la réponse était "les équations sont trop méchantes, il suffit de transmettre la fonction à un root-finder numérique". Mais si vous vous considérez comme un "graphiste" comme moi et que vous avez beaucoup joué avec les courbes de Bézier pour le travail de conception, je dois croire que mieux peut être fait. Il y a un algorithme publié par Kajiya que je n'ai pas de base pour comprendre (Sylvester Matrices), mais le conseil connexe en mathématiques.SE était que le résultat est un polynôme de degré 18 en t, et vous devez toujours le résoudre numériquement. J'ai eu une autre idée avec un résultat similaire .

Alors, est-ce un rêve de pipe total d'espérer résoudre algébriquement l'intersection Ray / Bézier-surface, permettant ainsi de coder explicitement et d'avoir une super-fluidité ultra-rapide?

À part cela, quelle est la méthode la plus rapide pour effectuer ce calcul? Pouvez-vous «trouver les mouvements» pour obtenir une limite (et une cible) strictes pour la subdivision récursive? Si vous devez utiliser un root-finder numérique (soupir), de quelles propriétés a-t-il besoin et existe-t-il un meilleur choix pour la vitesse?

Ma pensée originale était de préparer une surface spécifique, similaire à l'expansion de Laplace, comme décrit dans la réponse à mon autre question mathématique sur les triangles . Mais je serais également intéressé par les méthodes générales. Je pense juste à un ensemble fixe de formes, comme la théière Utah . Mais je serais très intéressé par les moyens d'optimiser la cohérence temporelle entre les images animées.


Cherchez-vous une méthode générale que vous pouvez appliquer à une surface de Bézier arbitraire, ou un moyen de préparer une méthode rapide pour une surface spécifique? La forme de votre surface sera-t-elle fixée avant l'exécution?
trichoplax

1
Notez que vous pouvez raymarch des surfaces bezier beaucoup plus facile que le raytracing. Vous pouvez également lancer des surfaces univariées raytrace ou raymarch beaucoup plus facilement que d'autres types! blog.demofox.org/2015/07/28/rectangular-bezier-patches
Alan Wolfe

Réponses:


14

Tout d'abord, voici la méthode Kajiya à laquelle je pense que vous pensez: Kajiya, Ray Tracing Parametric Patches , SIGGRAPH 82. La version du rapport technique pourrait être plus informative.

Ce que j'espère que vous en tirez, c'est que ce n'est pas impossible et ce n'est pas conceptuellement difficile si cela ne vous dérange pas de vous salir les mains avec une géométrie algébrique et des nombres complexes. Cependant, le faire directement coûte absurdement cher.

Les "vrais" traceurs de rayons ont tendance à faire une combinaison de deux choses:

  • Placer une hiérarchie de délimitation (par exemple AABB) sur le patch pour obtenir une bonne "valeur initiale" pour un chercheur de racine numérique. Si vous le faites bien, vous pouvez éviter le problème de "rides".
  • Transférer le patch dans des coques DDG et les lancer de rayons comme des maillages polygonaux.

Ce dernier point semble supprimer l'exigence de «super-douceur», mais ce n'est pas aussi mauvais que si vous utilisez des différentiels de rayons . Faire correspondre le niveau de pavage à la "taille" du rayon limite bien l'erreur. En outre, vous avez probablement besoin de différentiels pour les coordonnées de texture de toute façon, vous pouvez donc aussi l'utiliser pour contrôler la précision du test d'intersection.

Exploiter la cohérence temporelle n'est pas une mauvaise idée, mais exactement comment vous le feriez dépend beaucoup de la représentation graphique de votre scène. Vous voudrez peut-être examiner la cohérence des rayons. Renseignez-vous auprès de votre moteur de recherche préféré sur le traçage des paquets de rayons et la réorganisation des rayons .


9

est-ce un rêve de pipe total d'espérer résoudre algébriquement l'intersection Ray / Bézier-surface

Oui, c'est un rêve de pipe. Un patch de Bézier bicubique est une surface algébrique de degré 18. Pour croiser un rayon avec cette surface, vous devez trouver les racines d'un polynôme de degré 18. Il n'y a pas de formule pour ces racines - vous devez les trouver par des méthodes numériques . En fait, il y a des résultats mathématiques ( le théorème d'Abel-Ruffini ) nous disant qu'il ne peut jamais y avoir de formules pour des racines d'équations au-delà du degré 4. Le calcul ne dit pas simplement que les formules n'ont pas encore été trouvées; il dit qu'ils ne seront jamais trouvés, car ils ne peuvent pas exister.

Si vous voulez vraiment faire du ray tracing analytique (algébrique) de formes courbes, vous pouvez essayer d'utiliser les patchs de Steiner . Ceux-ci ont le degré 4, donc l'intersection rayon-patch peut être calculée en trouvant les racines d'une quartique (c'est-à-dire un polynôme de degré 4). Il existe des formules pour trouver les racines des quartiques, mais elles sont assez méchantes, et il est étonnamment difficile d'écrire du code qui implémente les formules de manière fiable.


5

Une autre option, que j'ai utilisée il y a quelques décennies (ouais!), Est d'utiliser le schéma de Toth de 1985 qui utilisait l'arithmétique d'intervalle pour réduire l'espace de recherche. IIRC, il finira par recourir à Newton-Rhapson mais, encore une fois IIRC, je pense qu'il a rarement fallu plus d'une ou deux étapes pour arriver à une bonne solution.

Bien que je ne l'ai pas examiné (enfin, à part un rapide coup d'œil), Mitchell a publié des travaux plus récents sur le lancer de rayons avec des mathématiques d'intervalle.

(Je dois ajouter que, si vous ne faites que des surfaces de Bézier, la méthode d'intervalle peut être un peu "excessive", car vous pouvez utiliser des astuces comme la floraison pour obtenir des limites et des dérivés. Si, toutefois, vous combinez des courbes de Bézier avec d'autres fonctions, ex: rotation autour d'un axe, alors sa généralité est plus utile.)


1

https://www.shadertoy.com/results?query=bezier trier par âge, en cas de problèmes de compatibilité:

, ... montre de nombreuses solutions de nombreux sous-ensembles de splines, soit en retournant la distance à une spline 2D, soit en traçant un patch 3D. Les splines et les patchs se présentent sous plusieurs formes. Heavensine beind plus simple, bezier étant simple, nurbs étant trop complexe. Plus vous ajoutez de contraintes à votre spline, plus c'est simple. NURBS est une extension excessive; - sa non-uniformité des poids (le «NU») diminue l'efficacité par rapport aux splines plus symétriques (résolu récursivement).

bezier-patch-tracing est la résolution des racines et avec cela vient la priorisation contextuelle sur la précision; dans quel ordre résoudre l’équation quadratique. cela devient impossible sur des exposants plus élevés que cubiques, en raison de la complexité exponentielle et de la perte de précision.

ray-marching == sphere-tracking est l'approche heuristique la plus simple de la résolution de racines, qui semble être la solution simple et la plus efficace pour rendre la plupart des patchs splines.

La représentation de Lagrange simplifie le traçage / la marche (car les points L sont sur la spline tandis que les points ControlVector (de la même spline exacte) sont rarement sur la spline)

Le cas particulier d'une spline céleste, où les premières dérivées de stat et end sont == 0. simplifie la continuité et implique moins de différentiels (moins de soustraction). Un patch céleste peut être tracé efficacement en une seule passe: https://www.shadertoy.com/view/4djfW3 tandis que d'autres splines cubiques (ou supérieures) rendent l'approche heuristique de suivi de sphère / marche de rayon plus efficace (et " assez précis ") que d’oser calculer analytiquement toutes les racines pour conserver la plus petite racine positive (avec des erreurs de précision qui s'accumulent de façon exponentielle pour chaque racine).


En infographie, les splines et les patchs ont été presque complètement remplacés par le z-brossage en 2006. Le z-brossage utilise des cartes de déplacement avec des coordonnées homogènes, ou même en utilisant un "type" qui nous utilise une union de sphère et de segments linéaires (les segments linéaires ont un rayon de 0, les sphères ont une longueur de 0, une union est simple et utile). Pour une perte de précision mineure pour un gros gain de performances à un coût mémoire relativement faible pour une table de correspondance, facilement dynamisable sur un GPU.


Ça ne fait rien. toutes les solutions de correctifs 3D sont effectuées par suivi de sphère.
ollj

il augmente simplement considérablement les performances et la précision lorsque le patch est plus simple. à un point où un patch de célestes sans couture vous emmène très loin en quelques itérations:
ollj

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.