Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество
Главная
    Документация jMonkeyEngine
        jMonkeyEngine Уроки и Документация
            Документация для продвинутых пользователей
                Физика мягкого тела(SoftBody)

Физика мягкого тела(SoftBody)

Опубликованно: 10.10.2017, 20:34
Последняя редакция, Andry: 16.10.2017 13:36

Записываем в процессе, выходите на форум за дополнительной информацией Bullet SoftBody в JME3.1

Что такое мягкое тело?

Как моделируется мягкое тело? (узел, змеевик, грань, пружина и демпфер)

Википедия: Динамика мягкого тела(en)

Начнем

Динамические библиотеки динамиков softbody (.so, .dll …) еще не перекомпилированы для вашей платформы, поэтому вам нужно проверить весь проект из GitHub, а затем собрать проект.

Как :

  1. Проверить проект с GitHub.
  2. Войдите в файл gradle.propeties и задайте строку: buildNativeProjecte = true.
  3. Выполните команду: ./gradlew build
  4. Затем соберите sdk: ant -f ./sdk/ build-zip (или соберите установщик sdk)
  5. Создайте новый проект и убедитесь, что вы используете следующие библиотеки: jme3-bullet-native и jme3-bullet (вместо jme3-jBullet)

Простой пример

public void simpleInitApp() {
    softBodyAppState = new BulletSoftBodyAppState();
    getStateManager().attach(softBodyAppState);

    SoftBodyWorldInfo sbwi = softBodyAppState.getPhysicsSoftSpace().getWorldInfo();
    sbwi.setGravity(Vector3f.UNIT_Y.mult(-0.981f));

    Geometry bunny = new Geometry("b", StandfordBunny.getMesh().deepClone());
    Material matN = new Material(assetManager, "Common/MatDefs/Misc/ShowNormals.j3md");
    bunny.setMaterial(matN);
    rootNode.attachChild(bunny);
    bunny.addControl(new SoftBodyControl(false));

    PhysicsSoftBody soft = bunny.getControl(SoftBodyControl.class);
    soft.generateClusters(8);
    soft.config().setDynamicFrictionCoef(0.8f);
    soft.config().setPoseMatchingCoef(0.2f);

    soft.config().setCollisionsFlags(PhysicsSoftBody.Config.CL_SS + PhysicsSoftBody.Config.CL_RS);

    soft.setPose(false, true);
    soft.setTotalMass(100, true);
    soft.randomizeConstraints();
    softBodyAppState.getPhysicsSoftSpace().add(soft);

    Box floorMesh = new Box(100f, 0.5f, 100f);
    Geometry floor = new Geometry("floor", floorMesh);
    floor.move(0, -5f, 0);
    floor.addControl(new RigidBodyControl(0));
    softBodyAppState.getPhysicsSpace().add(floor);
}

Документация

Мягкая сетка / поверхность(soft mesh / surface)

Кластер?

(генерировать) ограничение на изгиб?

Конфигурация столкновения флаг(config collision flag)?

Канаты(Ropes)

Канат можно создать, создав новый SoftBody на сетке с помощью Mesh.Mode.Lines. Дополнительная информация о создании пользовательских сеток.

Пример

Mesh ropeMesh = new Mesh();
Vector3f[] vertices = {
   new Vector3f(0.00f, 0, 0),
   new Vector3f(0.50f, 0, 0),
   new Vector3f(1.00f, 0, 0),
   new Vector3f(1.50f, 0, 0),
   new Vector3f(2.00f, 0, 0),
   new Vector3f(2.50f, 0, 0),
   new Vector3f(3.00f, 0, 0),
   new Vector3f(3.50f, 0, 0),
   new Vector3f(4.00f, 0, 0)};
int[] indices = {
   0, 1,
   1, 2,
   2, 3,
   3, 4,
   4, 5,
   5, 6,
   6, 7,
   7, 8};
ropeMesh.setBuffer(VertexBuffer.Type.Position, 3, BufferUtils.createFloatBuffer(vertices));
ropeMesh.setBuffer(VertexBuffer.Type.Index, 2, BufferUtils.createIntBuffer(indices));
ropeMesh.setMode(Mesh.Mode.Lines);
ropeMesh.updateBound();

После того, как у вас есть Line Mesh, вы можете сделать следующее:

Geometry t = new Geometry("softRope", ropeMesh);
t.move(0, 5, 0);
t.addControl(new SoftBodyControl(false));

Якоря(Anchors)

Якоря(Anchors) действуют как сварка между SoftBody и RigidBody. Добавление якорей к мягкому телу требует указать узел SoftBody и RigidBody для сварки.

soft.appendAnchor(nodeId, rigid);
Якорь(Anchor) привязывает узел SoftBody (или Vertex(Вершину)) к RigidBody, узел будет прикреплен к RigidBody, даже если между ними есть пространство.
Якоря еще не сериализованы

Пример

Geometry t = new Geometry("softRope", ropeMesh);
Box box = new Box(1f, 1f, 1f);
Geometry b = new Geometry("rigidBox", box);
t.move(0, 5, 0);
b.move(3f, 5, 0);

t.addControl(new SoftBodyControl(false));
soft = t.getControl(SoftBodyControl.class);
soft.setMass(0, 0); // сделать первый узел статичным

b.addControl(new RigidBodyControl(1));
rigid = b.getControl(RigidBodyControl.class);

softBodyAppState.getPhysicsSpace().add(rigid);
softBodyAppState.getPhysicsSoftSpace().add(soft);

soft.appendAnchor(8, rigid); //где 8 последний узлов канаты

Якоря(Anchors) можно удалить, как показано ниже. Обратите внимание, что вы должны поддерживать привязку узла и RigidBody.

soft.removeAnchor(8,rigid);

Суставы(Joints)

Суставы требуют SoftBodies с Кластерами(Clusters) (см. generateClusters(int k)).

Суставы не используют значения pivotA & pivotB (пока)

LinearJoint

public SoftLinearJoint(Vector3f position, PhysicsSoftBody nodeA, PhysicsRigidBody nodeB, Vector3f pivotA, Vector3f pivotB);
public SoftLinearJoint(Vector3f position, PhysicsSoftBody nodeA, PhysicsSoftBody nodeB, Vector3f pivotA, Vector3f pivotB);

AngularJoint

public SoftAngularJoint(Vector3f axis, PhysicsSoftBody nodeA, PhysicsRigidBody nodeB, Vector3f pivotA, Vector3f pivotB);
public SoftAngularJoint(Vector3f axis, PhysicsSoftBody nodeA, PhysicsSoftBody nodeB, Vector3f pivotA, Vector3f pivotB);

Примеры

LinearJoint

Box box = new Box(3f, 1f, 3f);
Geometry b = new Geometry("rigidBox", box);
b.move(0, 5f, 0);
b.addControl(new RigidBodyControl(1));
rigid = b.getControl(RigidBodyControl.class);

Torus torus = new Torus(20, 10, 1f, 1.5f);
Geometry t = new Geometry("softTorus", torus);
t.addControl(new SoftBodyControl(true, false));
soft = t.getControl(SoftBodyControl.class);
soft.generateBendingConstraints(4, soft.material());
soft.generateClusters(4);

softBodyAppState.getPhysicsSpace().add(rigid);
softBodyAppState.getPhysicsSoftSpace().add(soft);

joint = new SoftLinearJoint(Vector3f.UNIT_X, soft, rigid, new Vector3f(0f,2,0f), new Vector3f(0f,-2,0f));
softBodyAppState.getPhysicsSoftSpace().add(joint);

AngularJoint

Box box = new Box(1f, 1f, 1f);
Geometry b = new Geometry("rigidBox", box);
b.move(0, 5f, 0);
b.addControl(new RigidBodyControl(1));
rigid = b.getControl(RigidBodyControl.class);

 Torus torus = new Torus(20, 10, 1f, 1.5f);
Geometry t = new Geometry("softTorus", torus);
t.addControl(new SoftBodyControl(true, false));
soft = t.getControl(SoftBodyControl.class);
soft.generateBendingConstraints(4, soft.material());
soft.generateClusters(4);

softBodyAppState.getPhysicsSpace().add(rigid);
softBodyAppState.getPhysicsSoftSpace().add(soft);

joint = new SoftAngularJoint(Vector3f.UNIT_X, soft, rigid, new Vector3f(0,0,2), new Vector3f(0, 0, 2));
softBodyAppState.getPhysicsSoftSpace().add(joint);

Переведено для jmonkeyengine.ru, оригинал
Автор перевода: Andry

jMonkeyEngine.ru © 2017. Все права сохранены.