Author Topic: CollisionListener  (Read 3846 times)

Offline kekrops

  • byte
  • *
  • Posts: 12
    • View Profile
CollisionListener
« on: June 13, 2007, 10:06:18 am »
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.

Offline EgonOlsen

  • Administrator
  • quad
  • *****
  • Posts: 11775
    • View Profile
    • http://www.jpct.net
Re: CollisionListener
« Reply #1 on: June 13, 2007, 11:24:52 am »
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.

Code: [Select]
yourObj.setCollisionMode(COLLISION_CHECK_OTHERS | COLLISION_CHECK_SELF);

Offline kekrops

  • byte
  • *
  • Posts: 12
    • View Profile
Re: CollisionListener
« Reply #2 on: June 13, 2007, 01:02:47 pm »
Hallo,

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

Code: [Select]
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:
Code: [Select]
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:
Code: [Select]
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:
Code: [Select]
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.

Offline EgonOlsen

  • Administrator
  • quad
  • *****
  • Posts: 11775
    • View Profile
    • http://www.jpct.net
Re: CollisionListener
« Reply #3 on: June 13, 2007, 01:59:19 pm »
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.

Offline kekrops

  • byte
  • *
  • Posts: 12
    • View Profile
Re: CollisionListener
« Reply #4 on: June 13, 2007, 02:19:23 pm »
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.