通过.g3db文件在Bullet中处理碰撞

4

我正在使用libgdx和Bullet API开发一个简单的应用程序。 我已经使用形状完成了该应用程序的基本原型,但现在我想在应用程序中加载真正的模型。 我已经通过AssetManager使用.g3db文件来加载模型。

private void doneLoading() {
        // TODO Auto-generated method stub
        Model model = manager.get("ping1.g3db", Model.class);
        int index = 0;
        for (int i = 0; i < model.nodes.size; i++) {
            String id = model.nodes.get(i).id;
            ModelInstance instance = new ModelInstance(model, id);
            Node node = instance.getNode(id);
            instance.transform.set(node.globalTransform);
            //node.translation.set(0, 0, 0);
            //node.scale.set(1, 1, 1);
            //node.rotation.idt();
            instance.calculateTransforms();

            if (id.equals("ball4") || id.equals("bat")) {
                instance_array.add(instance);
                index += 1;
            }

            if (id.equals("ball4")) {
                ball = instance;
                Gdx.app.log("Ball Index", " " + index);
                instance_map.put("ball", new GameObject.Constructor(model, id, new btSphereShape(0.165f), 1.0f));
                createBall();
                //ball.transform.setToTranslation(0f, 10f, 0f);
            } else if (id.equals("bat")) {
                Gdx.app.log("Bat Index", " " + index);
                bat = instance;
                instance_map.put("bat",new GameObject.Constructor(model, id, new btSphereShape(1.897f), 0.0f));
                createBat();        
            }
        }
        loading = false;
    }


private void createBat() {
        // TODO Auto-generated method stub
        GameObject object=instance_map.get("bat").construct();
        object.body.setCollisionFlags(object.body.getCollisionFlags()|btCollisionObject.CollisionFlags.CF_CUSTOM_MATERIAL_CALLBACK);
        instances_gameobject.add(object);
        dynamicWorld.addCollisionObject(object.body);
    }


    private void createBall() {
        // TODO Auto-generated method stub
        GameObject object=instance_map.get("ball").construct();
        Gdx.app.log("Ball", "Ball created");
        object.moving=true;
        object.body.setWorldTransform(object.transform);
        object.body.setCollisionFlags(object.body.getCollisionFlags()|btCollisionObject.CollisionFlags.CF_CUSTOM_MATERIAL_CALLBACK);
        instances_gameobject.add(object);
        dynamicWorld.addCollisionObject(object.body);
    }

请告诉我如何使用自定义模型进行碰撞检测。
2个回答

3
凸包测试中,您可以看到如何从 Mesh 创建 CollisionObject Shape
public static btConvexHullShape createConvexHullShape (final Model model, boolean optimize) {
    final Mesh mesh = model.meshes.get(0);
    final btConvexHullShape shape = new btConvexHullShape(mesh.getVerticesBuffer(), mesh.getNumVertices(), mesh.getVertexSize());
    if (!optimize) return shape;
    // now optimize the shape
    final btShapeHull hull = new btShapeHull(shape);
    hull.buildHull(shape.getMargin());
    final btConvexHullShape result = new btConvexHullShape(hull);
    // delete the temporary shape
    shape.dispose();
    hull.dispose();
    return result;
}

如果我必须使用刚体,是否可以与ConvexHullTest一起使用? - Akshay Mukadam
一个刚体也需要一个形状,如果你使用给定的代码,它将创建一个符合你给定的模型网格的形状。你可以将它与刚体一起使用。 - noone
它会检测到碰撞吗? - Akshay Mukadam
它没有检测到碰撞。 - Akshay Mukadam
可能有很多原因。不同的碰撞标志/过滤器/组,也许是覆盖的自定义CollisionDispatcher...您是否使用调试绘图机制来查看碰撞对象的外观? - noone
我有完全相同的问题。我使用btBoxShape创建了一个碰撞形状的盒子,还有一个使用btConvexHullShape创建的盒子。btBoxShape按照我的需求工作得很好。它们都使用相同的标志被添加。当我在debugDrawer中查看btConvexHullShape时,我看到了我想要看到的确切形状,但碰撞只在中心部分有效,因为那里是一个未缩放的立方体。也许这与缩放有关? - Mouscellaneous

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接