某些函数在ammon.js中不起作用,尽管BulletPhysics文档显示它们应该起作用

Certain functions do not work in ammo.js, despite BulletPhysics documentation showing they should

本文关键字:显示 文档 BulletPhysics 起作用 尽管 函数 ammon js 不起作用      更新时间:2023-09-26

要澄清的是,amm.js是使用emscripten 的Bullet Physics的端口

好吧,所以我只是制作了这个快速而肮脏的脚本,用按键移动一个块,这很好,也很有效。然而,当我想旋转块chrome一直告诉我

类型错误:quat1.setEulerZYX不是函数

在drawScene

尽管Bullet文档明确指出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);
}

ammon.js不公开所有子弹实体的全部API:

并不是所有的类都是公开的,因为只有ammon.idl中描述的类是封装的。

--从自述

有关可用方法的列表,请参阅ammon.idl。

您可以更新ammo.idl并为所需的方法添加定义,然后使用自定义生成或尝试将您的更改添加到upstreem中,有关一些说明,请参阅本期。

我没有足够的耐心自己构建这个东西(主要是因为Debian存储库中默认的emscripten包存在问题(,但如果emscripten能够工作,那么在btQuaternion定义中包含setEulerZYX()的声明应该足够容易,更新后可能会是这样(但我没有尝试,所以它可能工作,也可能不工作(:

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;