我正在努力在 LWJGL 3 中创建体素引擎,我已经掌握了所有基础知识(块、网格渲染等)。
现在我正在使用 JBullet 添加物理。这是我第一次直接使用 JBullet,但我之前在其他 3D 引擎中使用过 Bullet。
从这里我收集到,创建与我的网格形状相同的碰撞对象所需要做的就是将顶点和索引插入 aTriangleIndexVertexArray
并将其用于 a BvhTriangleMeshShape
。
这是我的代码:
float[] coords = mesh.getVertices();
int[] indices = mesh.getIndices();
if (indices.length > 0) {
IndexedMesh indexedMesh = new IndexedMesh();
indexedMesh.numTriangles = indices.length / 3;
indexedMesh.triangleIndexBase = ByteBuffer.allocateDirect(indices.length*Float.BYTES).order(ByteOrder.nativeOrder());
indexedMesh.triangleIndexBase.asIntBuffer().put(indices);
indexedMesh.triangleIndexStride = 3 * Float.BYTES;
indexedMesh.numVertices = coords.length / 3;
indexedMesh.vertexBase = ByteBuffer.allocateDirect(coords.length*Float.BYTES).order(ByteOrder.nativeOrder());
indexedMesh.vertexBase.asFloatBuffer().put(coords);
indexedMesh.vertexStride = 3 * Float.BYTES;
TriangleIndexVertexArray vertArray = new TriangleIndexVertexArray();
vertArray.addIndexedMesh(indexedMesh);
boolean useQuantizedAabbCompression = false;
BvhTriangleMeshShape meshShape = new BvhTriangleMeshShape(vertArray, useQuantizedAabbCompression);
CollisionShape collisionShape = meshShape;
CollisionObject colObject = new CollisionObject();
colObject.setCollisionShape(collisionShape);
colObject.setWorldTransform(new Transform(new Matrix4f(new Quat4f(0, 0, 0, 1), new Vector3f(position.x, position.y, position.z), 1f)));
dynamicsWorld.addCollisionObject(colObject);
} else {
System.err.println("Failed to extract geometry from model. ");
}
我知道顶点和索引是有效的,因为我在绘制网格后将它们放在这里。
这似乎有点工作,但是当我尝试将一个立方体刚体放到地形上时,它似乎在地形上方碰撞!(我知道立方体设置正确,因为如果我移除网格对撞机,它会在 处撞击基础接地平面y=0
)。
我想这可能是一个扩展问题(虽然我不明白这可能是怎么回事),所以我尝试改变:
colObject.setWorldTransform(new Transform(new Matrix4f(new Quat4f(0, 0, 0, 1), new Vector3f(position.x, position.y, position.z), 1f)));
至:
colObject.setWorldTransform(new Transform(new Matrix4f(new Quat4f(0, 0, 0, 1), new Vector3f(position.x, position.y, position.z), 0.5f)));
但是在改变比例之后,1
它就像网格对撞机不存在一样。
很难找到 JBullet 围绕网格碰撞的任何资源或代码,我已经为此工作了将近 2 天,所以我希望你们中的一些以前做过的人可以帮助我:)
更新1:
我创建了 IDebugDrawer 的实现,以便可以在场景中绘制调试信息。
为了测试它,我只用一个基本的地平面和一个下降的立方体来运行它。我注意到当立方体下落时,aabb 与立方体的大小相匹配,但是当它撞到地板时,aabb 变得比原来大得多。
我将假设这是由于碰撞弹跳导致的正常 Bullet 行为,稍后再看,因为它不会影响我当前的问题。
我重新启用了从块网格中生成对撞机,并看到了这个:
看起来块的 aabb 可视化比实际块高很多(我知道我对整个碰撞对象的 y 定位是正确的)。
我将尝试弄清楚是否可以绘制实际的碰撞网格。
更新 2:
据我看到的源,碰撞器的网格应该在调试中绘制,所以我不确定为什么它不是。
我尝试将 Box 刚体更改为球体,它实际上滚过可视化 aabb 的顶部,用于地形对撞机。它只是滚平了,并没有撞到或下到那里的山丘或地形的斜坡上,所以它显然只是在 aabb 的平坦顶部滚动。