Некоторые функции не работают в ammo.js, несмотря на то, что документация BulletPhysics показывает, что они должны

Для пояснения - ammo.js - это порт Bullet Physics, использующий emscripten.

Итак, я только что сделал этот быстрый и грязный скрипт для перемещения блока с нажатиями клавиш, это нормально и работает. Однако, когда я хочу повернуть блок, Chrome постоянно говорит мне, что

Ошибка типа: quat1.setEulerZYX не является функцией

на розыгрыше

несмотря на то, что в Bullet Documentation четко указано, что setEulerZYX является функцией

try {
    var px = parseFloat(tempCamz); // Turns strings into integers
    var py = parseFloat((tempCamy * -1));
    var pz = parseFloat(tempCamx);
    var quat1 = new Ammo.btQuaternion();
    quat1.setEulerZYX(0.5,0,0);
    var blockShape = new Ammo.btBoxShape(new Ammo.btVector3(1/4, 1, 1/2));
    var mass = 1;
    var blockTransform = new Ammo.btTransform();
    blockTransform.setIdentity();
    blockTransform.setRotation(quat1);
    blockTransform.setOrigin(new Ammo.btVector3(px, py, pz));
    var localInertia = new Ammo.btVector3(0, 0, 0);
    var myMotionState = new Ammo.btDefaultMotionState(blockTransform);
    blockShape.calculateLocalInertia(mass,localInertia);
    var rbInfo = new Ammo.btRigidBodyConstructionInfo(mass, myMotionState, blockShape, localInertia);
    var body = new Ammo.btRigidBody(rbInfo);
    body.setLinearVelocity(origvel);

    instances[i].physObj = body;
    dynamicsWorld.addRigidBody(instances[i].physObj);

    } catch(err) {
    console.log(err);
}

1 ответ

Решение

ammo.js не предоставляет полный API всех сущностей Bullet:

Не все классы доступны, так как упаковано только то, что описано в ammo.idl.

- от README

Смотрите ammo.idl для списка доступных методов.

Вы можете обновить ammo.idl и добавьте определения методов, которые вам нужны, а затем используйте пользовательскую сборку или попробуйте внести свои изменения в upstreem, ознакомьтесь с этой проблемой, чтобы получить некоторые инструкции.

Я не был достаточно терпелив, чтобы построить эту штуку сам (в основном из-за проблем с пакетом emscripten по умолчанию из репозитория Debian), но при работающем emscripten должно быть достаточно легко включить объявление для setEulerZYX() в btQuaternion определение, которое после обновления может выглядеть следующим образом (но я не пробовал, поэтому оно может или не может работать):

interface btQuaternion {
  void btQuaternion(float x, float y, float z, float w);
  void setValue(float x, float y, float z, float w);
  void setEulerZYX(float yaw, float pitch, float roll);
};
btQuaternion implements btQuadWord;
Другие вопросы по тегам