Forum: Offtopic Formel für distanz zu schnittpunkt eines Strahl auf durch ungleichung beschribenes Objekt finden


von Daniel A. (daniel-a)


Lesenswert?

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?

von Michael S. (bitpulse)


Angehängte Dateien:

Lesenswert?

Hallo,  natürlich kenne ich ´einen derartigen Algorithmus, oder einen 
den man womöglich für diesen Zweck anpassen könnte?´

aber: verrate ich nicht ;-)

jeden früh, kurz nach dem aufstehen rechne ich kurz einige solche 
Algoritmen durch, auf meinem guten alten Casio fx-100...


Mein Tip:   pi  spielt eine wichtige Rolle !

Aber wenn ich dann fertig bin (auf dem Klo)  lösche ich wieder alles und 
erledige andere Aufgaben um die Welt zu retten...

Mein Tip für dich:  geh´mal richtig eine trinken und suche dir ne 
Freundin, bist ja schon völlig kirre in der Birne...


Schönes WE noch !

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.