Picking: Normale der Boundingbox ermitteln

Started by arucro, February 11, 2013, 11:14:28 PM

Previous topic - Next topic

arucro

Hi,

soweit ich bisher gesehen habe, ist es nur möglich die Normale des angeklickten Polygons zu ermitteln.
(mit PolygonManager.getTransformedNormal())

Ist es auch möglich die Normale der BoundingBox des angeklickten Objekts zu ermitteln ?

Gruß

EgonOlsen

Nein, so ohne weiteres nicht. Man könnte die sich selber ausrechnen, aber was will man eigentlich damit... ???

arucro

Es geht in meiner Anwendung darum sich seine Welt zur Laufzeit selbst "zusammenzuklicken".
Dabei soll man Objekte an andere Objekte "andocken" können.
Da die Objekte mitunter sehr komplex ausfallen, jedoch vermutlich durch eine einfachere Boundingbox umhüllt werden, bietet es sich gerade fürs Picking in diesem Fall an mit der Boundingbox zu arbeiten, statt mit dem komplexen Objekt selbst.

Deswegen fragte ich mich ob es nicht auch möglich sei statt von dem Objektpunkt die Normale , die Normale der Boundingbox zu ermitteln.
Denn anhand dieser kann ich klare einheitliche Regeln aufstellen wie Objekte positioniert werden können.

Oder gibts bessere Ideen das zu machen?

EgonOlsen

Diese Normale müsste man händisch ausrechnen, dass ist aber kein großes Problem. Die Koordinaten der BB im Objectspace bekommt du vom Mesh. Dann musst du die Seite bestimmen, von der du die Normale haben willst, nimmst dir drei Punkte in dieser Fläche (das sind einfach drei Eckpunkte der BB), multiplizierst sie mit der Matrix aus getWorldTransformation() vom Objekt selber, berechnest die Richtungsvektoren zwischen den Punkten und davon das Kreuzprodukt ist die Normale. Ob das die beste Lösung ist, um das Andocken zu realisieren, weiß ich nicht. Statt der Normalen könnte man auch (viel einfacher) mit den Resultaten von get?Axis() des Objekts versuchen.

arucro

#4
Hi,

Quote from: EgonOlsen on February 13, 2013, 08:19:04 AM
...Dann musst du die Seite bestimmen, von der du die Normale haben willst, nimmst dir drei Punkte in dieser Fläche (das sind einfach drei Eckpunkte der BB), multiplizierst sie mit der Matrix aus getWorldTransformation() vom Objekt selber, berechnest die Richtungsvektoren zwischen den Punkten und davon das Kreuzprodukt ist die Normale.

Dazu müsst ich allerdings aber zunächst herausfinden von welcher Fläche der Boundingbox (also welches Face) ich die Normale berechnen möchte, wenn ich ein Polygon innerhalb der BB per Picking-Ray treffe.
Das gepickte Polygon erhalte ich ja bereits über den PolygonManager und ebenso deren transformierte Normale.
Kann ich anhand dieser Informationen irgendwie herausfinden welche Seite bzw. welche Fläche der BB beim Picking getroffen wurde? Oder mit anderen Worten: Durch welche Seite der BB das "Picking-Ray durchgeschossen" ist?

Quote from: EgonOlsen on February 13, 2013, 08:19:04 AM
Ob das die beste Lösung ist, um das Andocken zu realisieren, weiß ich nicht. Statt der Normalen könnte man auch (viel einfacher) mit den Resultaten von get?Axis() des Objekts versuchen.

Beim Picking nützt mir diese Funktion auch nicht, da ich, wie oben beschrieben, vorher wissen muss, von welcher Seite das gepickte Objekt getroffen wurde. Habe ich die Seite herausgefunden, könnte man auch bequem mit den get?Axis()-Funktionen arbeiten, statt die Normale zu berechnen - Das gebe ich zu.

Eine Lösung des Problems wäre vielleicht die Kombination von 2x Object3Ds.
Eines stellt dabei das visuelle Mesh dar, das andere die "virtuelle BB" (ist zwar redundant, diese doppelt intern zu definieren, aber dadurch, dass ich ein Object3D als BB um das andere ummantele, könnte ich auf dieses Element die Picking-Tests durchführen). Leider finde ich hierbei aber nicht heraus, wie man das "virtuelle BB" unsichtbar schalten kann, aber dennoch von Picking-Tests erfasst wird.

Soviel zu meinen Gedanken. Hast du noch eine Idee bezüglich auch meines Problems oben und meines Lösungsvorschlags?

Gruß

EgonOlsen

Quote from: arucro on February 17, 2013, 02:10:14 AM
Eine Lösung des Problems wäre vielleicht die Kombination von 2x Object3Ds.
Eines stellt dabei das visuelle Mesh dar, das andere die "virtuelle BB" (ist zwar redundant, diese doppelt intern zu definieren, aber dadurch, dass ich ein Object3D als BB um das andere ummantele, könnte ich auf dieses Element die Picking-Tests durchführen). Leider finde ich hierbei aber nicht heraus, wie man das "virtuelle BB" unsichtbar schalten kann, aber dennoch von Picking-Tests erfasst wird.
Ja, das könntest du machen. Mache ich bei Kollisionsberechnung mit komplexen Objekten auch oft so, damit das Kollisionsverhalten eindeutiger ist. Du kannst dieses zusätzliche Objekte einfach sichtbar schalten, den Test durchführen und es dann wieder unsichtbar machen.