Обработка коллизий в Bullet через файлы .g3db

Я разрабатываю простое приложение, используя libgdx и Bullet API. Я завершил базовый прототип этого приложения, используя формы, но теперь я хочу загрузить в приложение реальные модели. Я использовал файл .g3db для загрузки моделей через AssetManager.

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);
    }

Скажите, пожалуйста, как я могу использовать пользовательские модели для обнаружения столкновений.


person Akshay Mukadam    schedule 07.07.2014    source источник


Ответы (2)


В ConvexHullTest вы можете увидеть, как можно создать Shape для вашего CollisionObject из Mesh.

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;
}
person noone    schedule 07.07.2014
comment
если мне нужно использовать твердое тело, возможно ли это с ConvexHullTest - person Akshay Mukadam; 07.07.2014
comment
Твердому телу также нужна форма, если вы используете данный код, он создаст форму, которая соответствует вашей заданной сетке модели. Вы можете использовать это с твердыми телами. - person noone; 07.07.2014
comment
обнаружит ли он столкновение - person Akshay Mukadam; 07.07.2014
comment
он не обнаруживает столкновение - person Akshay Mukadam; 07.07.2014
comment
У этого может быть много причин. Различные флаги/фильтры/группы столкновений, возможно, переопределенный пользовательский CollisionDispatcher... Использовали ли вы механизм отладки отрисовки, чтобы увидеть, как выглядят ваши объекты столкновений? - person noone; 07.07.2014
comment
У меня точно такая же проблема. У меня есть один блок, созданный с помощью btBoxShape для формы столкновения, и один с помощью btConvexHullShape. btBoxShape работает так, как мне нужно. Они добавляются с одинаковыми флагами. Когда я смотрю на btConvexHullShape в debugDrawer, я вижу именно ту форму, которую хочу видеть, но столкновение работает только в центре, где это немасштабированный куб. Может быть, это связано с масштабированием? - person Mouscellaneous; 06.10.2014

Мне помогло "запечь" чешуйки в блендере по этому посту

Масштабирование ModelInstance в libgdx 3D и движке Bullet

После этого у меня с этим методом заработали формы столкновений.

person Mouscellaneous    schedule 06.10.2014