我正在尝试制作 3D 游戏,但我在碰撞方面遇到了困难。我曾经开发过一个系统,但它并不是很好。我已经有一个与地形碰撞的系统,但它不能用于与实体碰撞(因为地形只有高度可以碰撞)。我正在使用 blender 模型,它们由三角形组成。 100% 准确的碰撞将是对每个三角形使用某种形式的碰撞检测,但由于三角形数量太多,因此游戏将失去其性能。大部分代码都基于 YouTube 上的 ThinMatrix 教程,除了我自己创建的一些代码。以下是我用于当前碰撞的一些代码:
public boolean collision(Entity e1, Entity e2){
if(e1.getPosition().x >= e2.getPosition().x && e1.getPosition().x < e2.getPosition().x + e2.getWidth()){
if(e1.getPosition().z >= e2.getPosition().z && e1.getPosition().z < e2.getPosition().z + e2.getWidth()){
System.out.println("XXX||&&&||ZZZ");
return true;
}
}
return false;
}
这个方法就是碰撞方法。它基于 X 和 Z 位置,因此非常不准确。在玩家级,我称之为:
public void tick(){
for(Entity e : entities){
if(super.collsion(this, e)){
I haven't gotten to this
}
}
}
这个系统可以工作,但它有很多问题,其中之一就是它不准确。
编辑: 我一直在研究使用一个新的 vector (我制作的),我称之为 Vector6f。使用多个值,应该更容易存储和获取值。它采用参数 x、y、z、xwidth、zwidth、height。 有了这些,我创建了一个名为 getBounds 的新方法,它返回实体边界。如果实体没有边界,则不会发生碰撞
最佳答案
您可以轻松地将 Y 值带入检查中,以使其更加精确。尽管如此,这只是在对象周围创建了一个 3D 边界框,而不是可能应该使用的 3D 凸包。这是一些接近java的伪代码,其中lX
- X轴长度
,hlX
- X轴一半长度
,考虑到我们使用实体的中心点来定义它们的位置。
boolean isColliding(Entity other) {
if (center.y + hlY < other.center.y - other.hlY ||
center.y - hlY > other.center.y + other.hlY)
return false;
Rectangle r1 = { center.x - hlX, center.z - hlZ, lX, lZ };
Rectangle r2 = { other.center.x - other.hlX, other.center.z - other.hlZ, other.lX, other.lZ };
return r1.intersects(r2);
}
至于关于碰撞的更新标记:
for (int i = 0; i < collidables.size(); i++) {
Entity e1 = collidables.get(i);
for (int j = i + 1; j < collidables.size(); j++) {
Entity e2 = collidables.get(j);
if (e1.isColliding(e2)) {
CollisionHandler handler = ... // get handler if registered for type of e1 vs type of e2
if (handler != null)
handler.onCollision(e1, e2);
}
}
}
这为您提供了 n * (n - 1)/2 个循环周期,其中 n - 可碰撞实体的数量
关于java - LWJGL Java 碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31500625/