Java3D碰撞

时间:2014-10-09 16:42:28

标签: java collision-detection collision java-3d

我试图检测我的第三人称头像与特定对象类型之间的碰撞。在这种情况下,它是一个PointSound。我尝试使用推荐的方式,使用如下代码中所示的行为。 只有在每个对象的边界之间没有拦截时,这才有效。

你能解释为什么会出现这种奇怪的行为,如果我真的需要自己进行碰撞检测并且可能使用更多的资源吗?

所以这里有两个例子,希望将问题缩小到可以理解的水平。

示例1:

  • 在位置0,0,0
  • 添加Sphere 1 size 10units
  • 添加相同大小相同位置的球体
  • 向上移动球体

结果:

  • 正在触发onCollisionStart
  • 球体1向上移动
  • onCollision正在被重复触发
  • 球体1离开球体2
  • onCollisionStop会被触发有时

示例2:

  • 在位置0,0,0
  • 处添加1个尺寸10个单位的球体
  • 在位置0,0,0
  • 处添加2个尺寸为10个单位的球体
  • 在位置0,0,0
  • 处添加3个尺寸100个单位的球体
  • 向上移动球体

结果:

  • 正在触发onCollisionStart
  • 球体1向上移动
  • onCollision仅触发
  • 球体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);
}

0 个答案:

没有答案