Main Menu

CollisionListener

Started by kekrops, June 13, 2007, 10:06:18 AM

Previous topic - Next topic

kekrops

Hallo,

ich benutze für die Kollisionserkennung zwischen den Objekten so wie im Car-Beispiel einen eigenen CollisionListener. Leider wird keine Kollision erkannt. ich hab es auch schon mit den Methoden checkCollision etc. probiert. Kein Erfolg. Hat vielleicht jmd. eine Idee woran es liegen kann bzw. was ich falsch machen könnte?
Ich benutze eigentlich fast das selbe Schema wie das Car-Beispiel, nur das ich keinen Boden habe und sich meine Objekte sozusagen frei im Raum bewegen können.

EgonOlsen

Die jeweiligen Kollisionspartner müssen die entsprechenden Modi gesetzt haben. Also wenn jedes Object3D mit jedem anderen kollidieren können soll, dann wäre das z.B.


yourObj.setCollisionMode(COLLISION_CHECK_OTHERS | COLLISION_CHECK_SELF);

kekrops

Hallo,

das habe ich auch schon gemacht. Hier die Klasse der Objekte:

package de.fhb.arlearning.core;

import com.threed.jpct.*;
import java.io.*;
import java.awt.*;

public class T1 extends AbstractEntity {

private final static Object3D OBJ;

static {
OBJ= Primitives.getSphere(10, 100);
OBJ.build();
}

public T1() {
super(OBJ);
addCollisionListener(new ObjectCollisionListener());

setCollisionMode(COLLISION_CHECK_OTHERS | COLLISION_CHECK_SELF);
setCollisionOptimization(Object3D.COLLISION_DETECTION_OPTIMIZED);
}
}


Dann füge ich sie der Welt hinzu:

p = new T1();
p.setOrigin(new SimpleVector(122, -164, 1435));
world.addObject(p);

m = new T2();
m.setOrigin(new SimpleVector(500, -164, 1435));
world.addObject(m);


Und in einer Schleife lass ich dann m in richtung p wandern:

while (true) {
buffer.clear();

SimpleVector a = m.getXAxis();
a.scalarMul(5);
m.translate(a);

System.out.println();
System.out.print("(" + Math.round(p.getTransformedCenter().x)
+ ", " + Math.round(p.getTransformedCenter().y) + ", "
+ Math.round(p.getTransformedCenter().z) + ") - ");

System.out.print("(" + Math.round(m.getTransformedCenter().x)
+ ", " + Math.round(m.getTransformedCenter().y) + ", "
+ Math.round(m.getTransformedCenter().z) + ") - ");

world.renderScene(buffer);

world.drawWireframe(buffer, Color.red);
buffer.update();
display();
Thread.yield();
}


Aber nix passiert...er sollte bei einer Kollision eigentlich was ausgaben:

public void collision(CollisionEvent ce) {
System.out.println("Source:" + ce.getSource());
System.out.println("Object:" + ce.getObject());
}


So wie ich mich kenne ist das ein kleiner simpler Fehler...aber ich finde Ihn nicht.

EgonOlsen

CollisionEvents werden nur geworfen, wenn eine "collision"-Methode benutzt wird. Normale Transformationen erkennen keinen Kollisionen. Also d.h. mit einem (oder beiden) Object3Ds ein checkForCollisionEllipsoid(...) vor der Bewegung ausführen und es sollte was passieren.

kekrops

Ahja, genau das war es...danke. Hatte das vorher zwar schonmal damit versucht, aber entweder habe ich da was falsch gemacht, oder ich hatte andere Parameter gewählt.