Author Topic: Picking: Normale der Boundingbox ermitteln  (Read 1901 times)

Offline arucro

  • byte
  • *
  • Posts: 6
    • View Profile
Picking: Normale der Boundingbox ermitteln
« on: February 11, 2013, 11:14:28 pm »
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ß

Offline EgonOlsen

  • Administrator
  • quad
  • *****
  • Posts: 11771
    • View Profile
    • http://www.jpct.net
Re: Picking: Normale der Boundingbox ermitteln
« Reply #1 on: February 11, 2013, 11:20:00 pm »
Nein, so ohne weiteres nicht. Man könnte die sich selber ausrechnen, aber was will man eigentlich damit... ???

Offline arucro

  • byte
  • *
  • Posts: 6
    • View Profile
Re: Picking: Normale der Boundingbox ermitteln
« Reply #2 on: February 11, 2013, 11:32:04 pm »
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?

Offline EgonOlsen

  • Administrator
  • quad
  • *****
  • Posts: 11771
    • View Profile
    • http://www.jpct.net
Re: Picking: Normale der Boundingbox ermitteln
« Reply #3 on: February 13, 2013, 08:19:04 am »
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.

Offline arucro

  • byte
  • *
  • Posts: 6
    • View Profile
Re: Picking: Normale der Boundingbox ermitteln
« Reply #4 on: February 17, 2013, 02:10:14 am »
Hi,

...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?

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ß
« Last Edit: February 17, 2013, 02:11:47 am by arucro »

Offline EgonOlsen

  • Administrator
  • quad
  • *****
  • Posts: 11771
    • View Profile
    • http://www.jpct.net
Re: Picking: Normale der Boundingbox ermitteln
« Reply #5 on: February 18, 2013, 10:55:29 pm »
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.