Ich habe diese Frage auf math.SE ausprobiert und überraschenderweise lautete die Antwort: "Die Gleichungen sind zu böse, füttere die Funktion einfach einem numerischen Root-Finder". Aber wenn Sie sich als "ein Grafiker" wie ich betrachten und ausgiebig mit Bezier-Kurven für die Entwurfsarbeit gespielt haben, muss ich glauben, dass es besser geht. Es gibt einen veröffentlichten Algorithmus von Kajiya, den ich nicht verstehen kann (Sylvester Matrices), aber der zugehörige Hinweis zu Mathe.SE lautete, dass das Ergebnis ein Polynom des Grades 18 in t ist, und das müssen Sie noch lösen numerisch. Ich hatte eine andere Idee mit ähnlichem Ergebnis .
Ist es also ein absoluter Wunsch, die Überschneidung von Ray und Bezier-Oberfläche algebraisch lösen zu können, um explizites Codieren und superschnelle Superglattheit zu ermöglichen?
Abgesehen davon, was ist die schnellste Methode, um diese Berechnung durchzuführen? Können Sie "die Wackelbewegungen finden", um eine feste Grenze (und ein Ziel) für die rekursive Unterteilung zu erhalten? Wenn Sie einen numerischen Root-Finder (Seufzer) verwenden müssen, welche Eigenschaften benötigt er und gibt es die beste Wahl für die Geschwindigkeit?
Mein ursprünglicher Gedanke war die Vorbereitung einer bestimmten Oberfläche, ähnlich der Laplace-Erweiterung, wie in der Antwort auf meine andere mathematische Frage zu Dreiecken beschrieben . Aber ich würde mich auch für allgemeine Methoden interessieren. Ich denke nur an feste Formen wie die Teekanne in Utah . Ich wäre jedoch sehr an Optimierungsmöglichkeiten für die zeitliche Kohärenz in animierten Bildern interessiert.
quelle
Antworten:
Zunächst die Kajiya-Methode, an die Sie denken: Kajiya, Ray Tracing Parametric Patches , SIGGRAPH 82. Die Version des technischen Berichts ist möglicherweise informativer.
Was ich hoffe, ist, dass es nicht unmöglich und konzeptionell nicht schwierig ist, wenn es Ihnen nichts ausmacht, sich mit algebraischer Geometrie und komplexen Zahlen die Hände schmutzig zu machen. Es ist jedoch absurd teuer, es direkt zu tun.
"Echte" Ray Tracer neigen dazu, zwei Dinge zu kombinieren:
Dieser letzte Punkt hört sich so an, als würde er die "Super-Smoothness" -Anforderung erfüllen, ist aber bei weitem nicht so schlimm, wenn Sie Strahlendifferentiale verwenden . Das Anpassen der Tessellationsstufe an die "Größe" des Strahls begrenzt den Fehler gut. Außerdem benötigen Sie wahrscheinlich ohnehin Differentiale für Texturkoordinaten, sodass Sie diese auch verwenden können, um die Genauigkeit des Schnittpunkttests zu steuern.
Das Ausnutzen der zeitlichen Kohärenz ist keine schlechte Idee, aber wie Sie dies tun, hängt stark von Ihrer Szenendiagrammdarstellung ab. Vielleicht möchten Sie die Strahlenkohärenz untersuchen. Fragen Sie Ihre Lieblingssuchmaschine nach Ray Packet Tracing und Ray Reordering .
quelle
Ja, es ist ein Wunschtraum. Ein bikubisches Bezier-Feld ist eine algebraische Fläche des Grades 18. Um einen Strahl mit dieser Fläche zu schneiden, müssen Sie die Wurzeln eines Polynoms des Grades 18 finden. Für diese Wurzeln gibt es keine Formel - Sie müssen sie mit numerischen Methoden finden . Tatsächlich gibt es mathematische Ergebnisse ( das Abel-Ruffini-Theorem ), die uns sagen, dass es niemals Formeln für Wurzeln von Gleichungen jenseits von Grad 4 geben kann. Die Mathematik sagt nicht nur, dass die Formeln noch nicht gefunden wurden; es heißt, dass sie niemals gefunden werden, weil sie nicht existieren können.
Wenn Sie wirklich eine analytische (algebraische) Raytracing-Funktion für kurvenreiche Formen verwenden möchten, können Sie Steiner-Patches verwenden . Diese haben Grad 4, so dass der Schnittpunkt der Strahlenfelder berechnet werden kann, indem die Wurzeln eines Quarzes (dh eines Polynoms vom Grad 4) gefunden werden. Es gibt Formeln zum Finden von Quartikwurzeln, aber sie sind ziemlich unangenehm, und es ist überraschend schwierig, Code zu schreiben, der die Formeln zuverlässig implementiert.
quelle
Eine andere Option, die ich vor ein paar Jahrzehnten verwendet habe (Huch!), Ist die Verwendung des Toth-Schemas aus dem Jahr 1985 , das Intervallarithmetik verwendete, um den Suchraum einzugrenzen. IIRC, irgendwann wird es auf Newton-Rhapson zurückgreifen, aber ich denke, es waren selten mehr als ein oder zwei Schritte erforderlich, um zu einer guten Lösung zu gelangen.
Obwohl ich es mir nicht angesehen habe (naja, abgesehen von einem kurzen Blick), hat Mitchell einige neuere Arbeiten zum Raytracing mit Intervall-Mathematik veröffentlicht.
(Ich sollte hinzufügen, dass, wenn Sie nur Bezier-Flächen bearbeiten, die Intervallmethode möglicherweise ein bisschen "Overkill" ist, da Sie Tricks wie das Blühen verwenden können, um Grenzen und Ableitungen zu erhalten. Wenn Sie jedoch Bezier-Kurven mit anderen Funktionen kombinieren, zB Rotation um eine Achse, dann ist die Allgemeinheit sinnvoller.)
quelle
https://www.shadertoy.com/results?query=bezier bei Kompatibilitätsproblemen nach Alter sortieren:
, ... zeigt viele Lösungen für viele Spline-Teilmengen, wobei entweder der Abstand zu einem 2D-Spline zurückgegeben wird oder ein 3D-Patch nachgezeichnet wird. Splines und Patches gibt es in vielen Formen. Himmel und Seele sind am einfachsten, Bézier sind einfach, Nurbs sind zu komplex. Je mehr Beschränkungen Sie Ihrem Spline hinzufügen, desto einfacher wird es. NURBS ist Extension Overkill; - Die Uneinheitlichkeit der Gewichte ("NU") verringert die Effizienz im Vergleich zu symmetrischeren Splines. - Die Verhältnismäßigkeit (R) erhöht auch die Komplexität beim Segmentieren (Rationieren) und Mischen mit benachbarten Segmenten (rekursiv gelöst).
Bezier-Patch-Tracing löst Wurzeln und damit kommt die kontextbezogene Priorisierung auf Präzision. in welcher Reihenfolge die quadratische Gleichung zu lösen. Dies wird bei höheren Exponenten als bei kubischen aufgrund der exponentiellen Komplexität und des Präzisionsverlusts unpraktisch.
ray-marching == sphere-tracking ist der einfachere heuristische Ansatz zum Auflösen von Wurzeln, der die einfache und effizienteste Lösung für das Rendern der meisten Spline-Patches zu sein scheint.
Die Lagrange-Darstellung vereinfacht das Verfolgen / Marschieren (da sich die L-Punkte auf dem Spline befinden, während sich die ControlVector-Punkte (mit genau demselben Spline) selten auf dem Spline befinden).
Der Sonderfall eines Heavensine-Spline, bei dem die ersten Ableitungen von stat und end == 0 sind. vereinfacht die Kontinuität und beinhaltet weniger Differentiale (weniger Subtraktion). Ein Heavensine-Patch kann effizient in einem einzigen Durchgang verfolgt werden: https://www.shadertoy.com/view/4djfW3, während andere kubische (oder höhere) Splines den heuristischen Sphere-Tracking / Ray-Marching-Ansatz effizienter machen (und genau genug "), als es zu wagen, alle Wurzeln analytisch zu berechnen, um die kleinste positive Wurzel zu erhalten (mit exponentiell akkumulierenden Präzisionsfehlern für jede Wurzel).
In der Computergrafik wurden Splines und Patches bis 2006 fast vollständig durch Z-Brushing ersetzt. Z-Brushing verwendet Verschiebungskarten mit homogenen Koordinaten oder verwendet sogar einen "Typ", der eine Vereinigung von Kugel und Liniensegmenten darstellt (Liniensegmente haben einen Radius von 0, Kugeln haben eine Länge von 0, eine Vereinigung ist einfach und nützlich). Für einen kleinen Präzisionsverlust bei einem großen Leistungsgewinn bei relativ geringen Speicherkosten für eine Nachschlagetabelle ist das auf einer GPU leicht dynamisch zu machen.
quelle