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. Konstruktor 2. Initialize() 3. processStimulus()
Kollisionen Kollisionsregionen Kollisionslisten Nur die dunklen Regionen befinden sich 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 Sachverhalt Wie groß sollen die Bounds Sein?
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)