Kollisionstest SDF / Ellipsoid
Verfasst: 08.06.2023, 15:46
Wir hatten ja neulich eine ganz ähnliche Diskussion hier, deswegen hat bestimmt jemand cleveren Input zu meinem Problem:
Ich habe eine Szene mit verschiedenen Objekten wie Kugeln, Zylindern, und Meshs repräsentiert als SDF (via Discregrid). Kugel / SDF Test ist super bequem, Zylinder / SDF wir aktuell durch Sampling von Punkten entlang der Zylinderachse inklusive einiger sinnvoller Annahmen (wie detailliert die Strukturen in der SDF sein können, etc.) implementiert und funktioniert robust. Für SDF / SDF sehe ich noch keine bequeme Möglichkeit, der Fall ist aber auch erstmal nicht so wichtig.
Wir wollen aber jetzt Ellipsoide einbauen. Ellipsoid / Zylinder sollte funktionieren wie Kugel / Zylinder mit einem transformierten Zylinder (vielleicht muss man mit dem Radius noch aufpassen), aber worüber ich gerade nachdenke ist SDF / Ellipsoid. Was mir Discregrig gibt ist der Abstand und der Gradient, zum nächsten Punkt auf der Oberfläche. Ich hab mir ein paar Testfälle aufgemalt und es scheint mir nicht so, als ob man da einen ähnlichen Trick wie bei Zylindern anwenden kann. Letztendlich "überdeckt" die kürzeste Verbindung die zweitkürzeste, die aber in Wahrheit näher an der Ellipsoidoberfläche liegen kann, als die kürzeste (wenn man vom Mittelpunkt aus sucht, wie man es bei der Kugel tut). Die SDF kann man auch nicht entlang einer Achse skalieren, weil sie dadurch die Richtung des Gradienten mehr oder weniger beliebig ändern könnte.
Ich überlege jetzt, ob man einfach ein paar Punkte auf der Ellipsoidenoberfläche clever samplen kann und dann mit ein paar wahrscheinlichen Annahmen (SDF hat keine Strukturen kleiner als Radius durch x oder so) dann einen halbwegs robusten Test bekommen kann. Er muss nicht super exakt sein, sollte aber, von den meisten Richtungen aus betrachtet, sinnvoll aussehen und stabil sein (es ist ok, wenn Objekte sich ein wenig intersektieren, aber sie sollten nicht wild hin und herspringen, wenn sie aneinander vorbei gleiten). Alternativ könnte man die "Mesh als SDF" Darstellung wieder vergessen (die wurde im Wesentlichen eingeführt, weil sie recht leicht einzubauen war) und Dreiecke in einem Octree oder so benutzen. Was meint ihr? Wie würde man das am besten einbauen?
Ich habe eine Szene mit verschiedenen Objekten wie Kugeln, Zylindern, und Meshs repräsentiert als SDF (via Discregrid). Kugel / SDF Test ist super bequem, Zylinder / SDF wir aktuell durch Sampling von Punkten entlang der Zylinderachse inklusive einiger sinnvoller Annahmen (wie detailliert die Strukturen in der SDF sein können, etc.) implementiert und funktioniert robust. Für SDF / SDF sehe ich noch keine bequeme Möglichkeit, der Fall ist aber auch erstmal nicht so wichtig.
Wir wollen aber jetzt Ellipsoide einbauen. Ellipsoid / Zylinder sollte funktionieren wie Kugel / Zylinder mit einem transformierten Zylinder (vielleicht muss man mit dem Radius noch aufpassen), aber worüber ich gerade nachdenke ist SDF / Ellipsoid. Was mir Discregrig gibt ist der Abstand und der Gradient, zum nächsten Punkt auf der Oberfläche. Ich hab mir ein paar Testfälle aufgemalt und es scheint mir nicht so, als ob man da einen ähnlichen Trick wie bei Zylindern anwenden kann. Letztendlich "überdeckt" die kürzeste Verbindung die zweitkürzeste, die aber in Wahrheit näher an der Ellipsoidoberfläche liegen kann, als die kürzeste (wenn man vom Mittelpunkt aus sucht, wie man es bei der Kugel tut). Die SDF kann man auch nicht entlang einer Achse skalieren, weil sie dadurch die Richtung des Gradienten mehr oder weniger beliebig ändern könnte.
Ich überlege jetzt, ob man einfach ein paar Punkte auf der Ellipsoidenoberfläche clever samplen kann und dann mit ein paar wahrscheinlichen Annahmen (SDF hat keine Strukturen kleiner als Radius durch x oder so) dann einen halbwegs robusten Test bekommen kann. Er muss nicht super exakt sein, sollte aber, von den meisten Richtungen aus betrachtet, sinnvoll aussehen und stabil sein (es ist ok, wenn Objekte sich ein wenig intersektieren, aber sie sollten nicht wild hin und herspringen, wenn sie aneinander vorbei gleiten). Alternativ könnte man die "Mesh als SDF" Darstellung wieder vergessen (die wurde im Wesentlichen eingeführt, weil sie recht leicht einzubauen war) und Dreiecke in einem Octree oder so benutzen. Was meint ihr? Wie würde man das am besten einbauen?