Signed Distance Fields mit Ray Casting anzeigen?



  • Hallo, ich arbeite seit 20 Jahren hauptberuflich als C++ Entwickler und entwickle seit ein paar Jahren an einem 3D Simulationssystem.

    Ich möchte Octree basierte Signed Distance Fields möglichst genau und schnell anzeigen. Bisher mache ich dies indirekt über Triangulierung der SDFs (schönes Ergebnis, aber leider viel zu langsam). Hat hier jemand Erfahrung mit direkten Verfahren wie z.B. Ray Casting von SDFs?

    Ich kann mir auch professionelle Unterstützung vorstellen, falls ich mit dem Thema nicht vorankomme.



  • Ich hab erfahrung, und manch anderer bestimmt auch. wie koennen wir dir helfen?



  • Vielen Dank für die Antwort.

    Ich habe bisher nur ein paar sehr einfache Versuche diesbezüglich gemacht und möchte vermeiden in die falsche Richtung zu gehen.

    Ich habe eine Bounding Box um die SDFs und kann diese in Bildschirmkoordinaten umwandeln und somit den Bildschirmbereich ermitteln der betroffen ist.
    Für diese Bildschirmpunkte kann ich Punkt und Richtung des Rays im Objektraum ermitteln und den Schnittpunkt mit den SDFs bestimmen.

    Nun Frage ich mich ob es ein mir unbekanntes Verfahren gibt welche es ermöglicht Rays adaptiv zu verteilen ohne Gefahr zu laufen wesentliche Geometrien zu verfehlen.
    Also z.B. nur die Ecken eines 8 Pixel breiten Quadrats zu ermitteln und dann Aufgrund der Normalen, der Distanz und der SDF-ID zu sehen ob der Bereich Flach genug ist oder nicht.
    Wenn Flach genug, dann ein Quad rendern und wenn nicht das Quadrat halbieren und nochmal testen.



  • du kannst der radius eines pixels in der welt ermitteln, je "tiefer" der strahl in die welt traced, desto groesser wird der radius in world space.

    Du kannst damit auch mehrere pixel zusammenfassen (z.b. 2x2 oder 4x4 oder 8x8 oder...) und somit fuer die pixelgruppe durch den raum tracen. wenn du eine collision errechnest, teilst du die gruppe und tracest fuer jede untergruppe.

    falls du absolut keine kollision ueberspringen willst, kannst du beim adaptiven steppen immer den radius des pixels abziehen, wobei das sehr viel langsammer werden keonnte und dieser fehler eher selten auftritt.



  • Sozusagen einen Konus statt eines Rays verwenden, um auch Geometrien zu erkennen, die sonst in keinem Pixel vorkommen würden.

    Das mit den Pixelgruppen scheint mir ein vielversprechender Ansatz zu sein.

    Womöglich war aber mein Begriff 3D Simulation nicht genau genug. Es handelt sich mehr um eine 3D Sculpting Simulation, bei der mit Werkzeugen Material abgetragen wird und das Ergebnis visualisiert werden soll. Was nicht sichtbar ist, weil kleiner als ein Pixel, muss nicht dargestellt werden. Was sichtbar sein kann, muss aber dargestellt werden.
    Es entstehen dann Bereiche, die sehr homogen sind und mit einer groben Darstellung gut genug aussehen. Ebenso gibt es Bereiche, in denen sich kleine Details mit scharfen Kanten wiederfinden die möglichst genau angezeigt werden sollen.