我试图检测我的第三人称头像与特定对象类型之间的碰撞。在这种情况下,它是一个PointSound。我尝试使用推荐的方式,使用如下代码中所示的行为。 只有在每个对象的边界之间没有拦截时,这才有效。
你能解释为什么会出现这种奇怪的行为,如果我真的需要自己进行碰撞检测并且可能使用更多的资源吗?
所以这里有两个例子,希望将问题缩小到可以理解的水平。
示例1:
结果:
示例2:
结果:
现在,球体1和2之间的碰撞将在启动时触发,但就是这样。没有检测到碰撞。
CollisionBehavior:
import java.util.Enumeration;
import javax.media.j3d.Behavior;
import javax.media.j3d.Bounds;
import javax.media.j3d.Shape3D;
import javax.media.j3d.WakeupCriterion;
import javax.media.j3d.WakeupOnCollisionEntry;
import javax.media.j3d.WakeupOnCollisionExit;
import javax.media.j3d.WakeupOnCollisionMovement;
import javax.media.j3d.WakeupOr;
public class CollisionDetector extends Behavior {
WakeupOr orCriteria;
Bounds bounds1;
Bounds bounds2;
CollusionAction action;
public static final int COLLISION_START = 0;
public static final int COLLISION_DURING = 1;
public static final int COLLISION_STOP = 2;
public CollisionDetector(Bounds bounds1 , Bounds bounds2, CollusionAction action) {
System.out.println("Bounds1: "+bounds1);
System.out.println("Bounds2: "+bounds2);
this.bounds1 = bounds1;
this.bounds2 = bounds2;
this.action = action;
setSchedulingBounds(bounds1);
}
@Override
public void initialize() {
WakeupCriterion[] wakeup = new WakeupCriterion[3];
wakeup[0] = new WakeupOnCollisionEntry(bounds2);
wakeup[1] = new WakeupOnCollisionExit(bounds2);
wakeup[2] = new WakeupOnCollisionMovement(bounds2);
orCriteria = new WakeupOr(wakeup);
wakeupOn(orCriteria);
}
@Override
public void processStimulus(@SuppressWarnings("rawtypes") Enumeration criterion) {
if (!criterion.hasMoreElements()) return;
WakeupCriterion nextCriterion = (WakeupCriterion)criterion.nextElement();
if (nextCriterion instanceof WakeupOnCollisionEntry)
action.onCollisionStart(new CollisionEvent(bounds1, bounds2));
else if (nextCriterion instanceof WakeupOnCollisionExit)
action.onCollisionStop(new CollisionEvent(bounds1, bounds2));
else {
action.onCollision(new CollisionEvent(bounds1, bounds2));
}
wakeupOn(orCriteria);
}
}
CollisionAction:
public interface CollisionAction {
public void onCollision(CollisionEvent e);
public void onCollisionStart(CollisionEvent e);
public void onCollisionStop(CollisionEvent e);
}