Collision Detection in Java3D
Hristo Matev WS 02/03
Übersicht
Java3D Application Architecture Behavior System Kollisionen Kollisionstypen Collision Avoidance Terrain Following
Java3D Applikation Architecture Eigene Threads Nachrichtenaustausch Java3D Thread Scheduler Behavior Thread Scheduler Kein Collision Thread (interne Baumstruktur)
Das Behavior System Abstrakte Klasse Behavior
Reagieren auf Kollisionen:Position, Aussehen,
Hinzufügen/Entfernen, Kameratransformationen
Das Behavior System
Aufbau einer Klasse
1. Konstruktor2. Initialize()3. processStimulus()
Kollisionen
KollisionsregionenKollisionslisten
Nur die dunklen Regionen befindensich in der beobachteten Liste
Kollisionen
Kamera Bounds (1)
Kollisionen
Kamera Bounds (2)
Kollisionen
Kamera Bounds (3)
Kollisionen
Kamera Bounds
Wenn man die Kollision nicht sehen kann, dann kollidieren die Objekte nicht.
Kollisionen
Die Behaviors werden asynchron mit dem Renderer aufgerufen
Wenn diese aufgefufen werden, dann wird es nicht garantiert, dass diese etwas verändern werden
Feststellen von Kollisionen – nicht immer
(leichte Kollisionen)
Abfangen von Kollisionen
WakeupOnCollisionEntry WakeupOnCollisionMovement WakeupOnCollisionExit WakeupOnViewPlatformEntry WakeupOnViewPlatformExit
Abfangen von Kollisionen
Klassenhierarchie
Konstruktoren
WakeupOnCollisionEntry (Bounds armingBounds)
WakeupOnCollisionEntry (Node armingNode)
WakeupOnCollisionEntry (Node armingNode, int speedHint)
Objektgrenzen
Eine große BoundingBox – schnelleres Rendern
Komplexe Geometrie – langsames Rendern
Objekt-Objekt-Kollisionen WakeupOnCollisionEntry
public void initialize (){this.wakeupOn (new WakeupOnCollisionEntry (t));} public void processStimulus (Enumeration criteria){
System.out.println(„Kollision“);this.wakeupOn (new WakeupOnCollisionEntry (t)); }}
Mehrere Kriterien
WakeupCriterion [] conditions = new WakeupCriterion [3];
public void ObjektObjektCollision (){conditions [0] = new WakeupOnCollisionEntry(t);conditions [1] = new WakeupOnCollisionMovement(t);conditions [2] = new WakeupOnCollisionExit(t);}
Kamera-Objekt-Kollisionen
public void initialize (){this.wakeupOn (new WakeupOnViewPlatformEntry(b));}public void processStimulus (Enumeration criteria){System.out.println(„Kollision“);this.wakeupOn (new WakeupOnViewPlatformEntry (b));}
Collision Avoidance
Collision Avoidance ist ein Mechanismus bei dem man die zukünftige Position basierend auf der momentanen Bewegung des Benutzers ermittelt und vermeidet das der Benutzer zufällig z.B. durch die Wand geht. Java3D stellt aber lediglich ein Collision Detection System zur Verfügung, alles anderes muss vom Programmierer übernommen werden.
Collision Avoidance
SachverhaltWie groß sollen die BoundsSein?
Collision Avoidance (Implementierung)
else if (critter instanceof WakeupOnViewPlatformEntry) { System.out.println ("collision entry"); collision = true; gesperrterButton = lastPressedButton; vptg.getTransform (aktuell);
} .....
if (collision && (gesperrterButton == lastPressedButton)) vptg.setTransform (aktuell);
Terrain Following
Das „Terrain Following“ beinhaltet die Bewegung von einem Objekt (oder der Kamera) auf einer bestimmten Höhe über die Grundfläche.
Terrain Following
Terrain Eigenschaften
Terrain Following
Unerwartete Terrainänderung
Terrain Following
Scenegraph
Terrain Following (Implementierung)
PickTool picktool = new PickTool (bg); picktool.setShapeRay (loc, DOWN); picktool.setMode (PickTool.GEOMETRY_INTERSECT_INFO);
pr = picktool.pickClosest (); if (pr != null){ PickIntersection pi = pr.getIntersection (0); Point3d intPt = pi.getPointCoordinatesVW (); py = intPt.y; return py;}
Picking
Terrain Following
terrainAenderung = criticalPoint -
gespeicherteHoehe; criticalVector.set (0.0,terrainAenderung, 0.0); criticalTransform.set(criticalVector); currentTransform.mul(criticalTransform); vptg.setTransform(currentTransform);
Quellen
Sun Java3D Api Tutorial j3d.org
die java3d Liste: java3d-interest
(alle Nachrichten sind unter: mail-archive.com erreichbar)
Top Related