某些功能在 ammo.js 中不起作用,尽管 BulletPhysics 文档显示它们应该
Certain functions do not work in ammo.js, despite BulletPhysics documentation showing they should
澄清 - ammo.js 是使用 emscripten
的 Bullet Physics 端口
好的,所以我刚刚制作了这个快速而肮脏的脚本来使用按键移动一个块,这很好并且可以工作。但是,当我想旋转方块时 chrome 一直告诉我
TypeError: quat1.setEulerZYX is not a function
at drawScene
尽管 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);
}
ammo.js 未公开所有 Bullet 实体的完整 API:
Not all classes are exposed, as only what is described in ammo.idl is wrapped.
— 来自README
有关可用方法的列表,请参阅 ammo.idl。
您可以更新 ammo.idl
并为您需要的方法添加定义,然后使用自定义构建或尝试将您的更改应用到上游,请参阅 this issue 了解一些说明。
我没有足够的耐心自己构建这个东西(主要是因为 Debian 存储库中的默认 emscripten 包存在问题),但是让 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;
澄清 - ammo.js 是使用 emscripten
的 Bullet Physics 端口好的,所以我刚刚制作了这个快速而肮脏的脚本来使用按键移动一个块,这很好并且可以工作。但是,当我想旋转方块时 chrome 一直告诉我
TypeError: quat1.setEulerZYX is not a function
at drawScene
尽管 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);
}
ammo.js 未公开所有 Bullet 实体的完整 API:
Not all classes are exposed, as only what is described in ammo.idl is wrapped.
— 来自README
有关可用方法的列表,请参阅 ammo.idl。
您可以更新 ammo.idl
并为您需要的方法添加定义,然后使用自定义构建或尝试将您的更改应用到上游,请参阅 this issue 了解一些说明。
我没有足够的耐心自己构建这个东西(主要是因为 Debian 存储库中的默认 emscripten 包存在问题),但是让 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;