Javascript 某些函数在ammo.js中不起作用,尽管物理文档显示它们应该起作用

Javascript 某些函数在ammo.js中不起作用,尽管物理文档显示它们应该起作用,javascript,bulletphysics,ammo.js,Javascript,Bulletphysics,Ammo.js,为了澄清这一点,ammo.js是一个使用emscripten的子弹物理端口 好的,我刚刚制作了这个快速而肮脏的脚本,用按键移动一个块,这很好,也很有效。然而,当我想旋转块时,chrome一直告诉我 TypeError:quat1.setEulerZYX不是函数 try { var px = parseFloat(tempCamz); // Turns strings into integers var py = parseFloat((tempCamy * -1)); v

为了澄清这一点,ammo.js是一个使用emscripten的子弹物理端口

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

TypeError:quat1.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);
}
现场

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

ammo.js不会公开所有项目符号实体的完整API:

并不是所有的类都公开,因为只有ammo.idl中描述的类被包装

-从

有关可用方法的列表,请参见

您可以更新ammo.idl并添加所需方法的定义,然后使用自定义生成或尝试将更改导入upstreem,有关说明,请参阅

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