Ich muss zugeben, Du hast hier mit Deinem Thread wirklich eine spannende Kopfnuss in den Ring geworfen
Ich denke, die Funktionalität soll auch dann gegeben sein, wenn die Kiste nicht orthogonal zum Boden steht, sondern auch dann, wenn z.B. gekippt ist.
Der Schlüssel ist die an den Collision Detector übergebene TransformGroup. Sie enthält alle Informationen über Lage, Rotation usw. der Kiste bezogen auf die ursprünglichen Koordinaten. Diese Informationen sind dort allerdings in Matrix Form abgelegt, die Nutzung erfordert also ein bisschen Mathe.
Wie man die Lage eines Punkte berechnet, nachdem eine Transformation (z.B. Verschieben und Rotieren) ausrechnet, findest Du dort:
Transform3D (Java 3D API)
Nun aber zu der Umsetzung:
Nachdem ich die Kiste erstellt habe, habe ich die Eckpunkte der Kiste berechnet und über setUserData() gespiechert. Diese Eckpunkte kann ich dann später bei der Kollisionserkennung verwenden.
Nach der Kollision läuft folgender Algo ab:
1. Die jetzigen Eckpunkte der Kiste berechnen, bezogen auf das ursprüngliche Koordinatensystem. Hierzu hole ich mir aus der übergebenen TransformGroup die Transformationsmatrix und berechne die jetzigen Eckpunkte wie in dem o.a. Link beschrieben
2. Dann prüfe ich, welche Ecke am weitesten "unter" dem Boden liegt. Um diese Distanz muss die Kiste zurück verschoben werden
3. Dann wird es noch mal tricky - den eigentlich einfachen Verschiebungvektor (0, y, 0) muss man noch mal in das neue Koordinatensystem umrechnem denn der Würfel kann ja gekippt sein. Hierzu muss der Vektor (0, y, 0) mit der inversen Transformationsmatrix multipliziert werden.
4. Dann wird die Kiste zurückgesetzt.
Das Problem, was jetzt noch besteht, ist das der Würfel in den Boden etwas eintaucht. Um das zu verhindern wäre meine Idee, den y - Faktor des MouseTranslate bei Kollision auf 0 zu setzen. Da muss ich mir aber noch ein paar Gedanken zu machen (z.B. was tun, wenn der Boden nicht senkrecht zur y - Achse steht). Mal sehen.
Angehängt ist jedenfalls der geänderte Code, ein paar Kommentare habe ich auch da eingefügt.