Vorerst, nachfolgend werde ich in den Formeln der Einfachheit halber Punkte so behandeln, als wären sie Vektoren. Ich habe gerade Ungleichungen wieder für mich entdeckt, und wie praktisch diese sind um Objekte mit beliebig vielen Dimensionen zu beschreiben. Als ein Beispiel, eine n-sphere um den 0 Punkt mit Radius 1 kann man so beschreiben:
Für 3 Dimensionen (Kugel) wäre das also ausgeschrieben bei kartesischem Koordinatensystem:
Ich habe mir mal folgende Ungleichung ausgedacht, die ein Fellartiges endloses Objekt beschreibt (nur für z>0) (vereinfachte Version wo alle Parameter schon eingesetzt sind) (ich hoffe ich habe mich nirgends vertippt):
Ich habe mir dann mal zum Spass mal schnell eine art Ray tracer gebaut, der (unter anderem) für jeden Strahl tausende Punkte mit der Ungleichung testet, und in mehr oder weniger Echtzeit darstellt. Hier der Code: https://gist.github.com/Daniel-Abrecht/873253bdedb0a9fbcb91c6744a96c623#file-faster-webgl-rendering-rotate-camera-with-arrow-keys-move-with-xy Und eine Online demo, Kamerarotation mit Pfeiltasten, Vorwärts Rückwärts mit XY: https://gistpreview.github.io/?873253bdedb0a9fbcb91c6744a96c623/faster%20webgl%20rendering,%20rotate%20camera%20with%20arrow%20keys,%20move%20with%20xy%2E Der rendering Algorithmus ist aber leider extrem langsam und ungenau. Diese, und die meisten anderen Ungleichungen, haben einige interessante Eigenschaften: 1) Man kann sie in die Form f(P)<0 bringen, um den gesamten Körper (bzw. alle Punkte darin) zu beschreiben, und kann dann dadurch automatisch mit f(P)=0 die Oberfläche (bzw. alle Punkte auf dieser) beschreiben. 2) Betrachtet man eine Linie der Form:
wobei O der Anfangspunkt, v die Richtung und Entfernung ist, und P der Endpunkt, so kann man diese Einsetzen:
Beim Ray tracing gibt es normalerweise einen Anfangspunkt O und eine normalisierte Richtung ^v, mit der Eigenschaften |^v|=1. Diese hat folgende Relation zur oberen Gleichung für die Linie:
Damit hätte man also:
Wobei f, O und ^v gegeben sind, und man das ganze dann nach d auflösen kann. Nehmen wir nun an, wir hätten eine Funktion g_f(O,^v)=d. Wenn f(O)<0, dann sind wir im Objekt, und wir müssen d=0 annehmen. Sonst bräuchte man die Funktion g_f. Diese würde die Eigenschaft aufweisen, dass Werte, die ausserhalb dessen Definitionsbereichs sind, kein Resultat haben, und der Strahl nie trifft. Andernfalls gäbe es ein oder mehrere Resultate, welche die Distanz zu allen Schnittpunkten darstellen, wobei fürs Ray tracing nur die kleinste Distanz grösser null relevant ist. Für eine simple Kugel ist es ja noch einigermassen machbar, sich die g Funktion dafür herzuleiten. Aber für die Fell Gleichung von oben ist das einfach zu kompliziert und aufwändig. Mit einer solchen Gleichung wäre der Rechenaufwand fürs Raytracing einige tausend mal kleiner, genauer und ohne Artefakte wäre es dann auch noch. Deshalb nun zur eigentlichen Frage: Gibt es einen Algorithmus, mit dem ich: a) Die Gleichung für die Funktion g_f berechnen kann, so dass ich von dieser zumindest das kleinste d grösser 0 bekomme b) Eine Ungleichung berechnen kann, die mir sagt, ob die Werte O und ^v im Definitionsbereich der Funktion g_f liegen Mit einem derartigen Algorithmus könnte ich eine 3D Engine erstellen, die beliebige Ungleichungen darstellt. Damit könnte man hoch komplexe Strukturen darstellen, bei denen man mit den üblichen Tessellations- Rasterisierungs-Verfahren an grenzen stossen würde. Kennt jemand einen derartigen Algorithmus, oder einen den man womöglich für diesen Zweck anpassen könnte?
