【问题标题】:Use of "mass" in BulletBullet 中“质量”的使用
【发布时间】:2014-02-23 22:39:02
【问题描述】:

我很抱歉提出这样一个关于子弹的基本问题。但是,我有一个问题。这是设置:

我有一个没有重力的世界。当我按下一个键时,会在世界中心创建一个 1x1x1 的框。当我右键单击时,会在相机位置创建一个大小为 0.05*0.05*0.05 的框,并朝您所看的方向“拍摄”。麻烦就从这里开始。

当一个小立方体撞到一个大立方体时,交互似乎是错误的。你会期望一个盒子的大小只有另一个盒子的 1/8000,但效果却很小。然而,大立方体飞了起来,就好像它和一个同样大小的立方体在一起一样。我认为这是因为我创建了两个质量相同的物体。

为了确认这一点,我施加了 1 牛顿的向上力(或子弹使用的任何单位)。两个物体以相同的速度加速。

我创建对象的代码如下:

btMotionState *state = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(0, 0, 0)));
btConvexHullShape* shape = new btConvexHullShape();
for(unsigned int i = 0; i < vertices.size(); ++i) {
    shape->addPoint(toBt(vertices[i]));
}
shape->setMargin(0.01f);

btScalar mass = 1.f;
btVector3 inertia;
shape->calculateLocalInertia(mass, inertia);
shape->setMargin(0.01f);
btRigidBody::btRigidBodyConstructionInfo ci(mass, state, shape, inertia);
body = new btRigidBody(ci);

我认为btScalar mass = 1.f; 行是罪魁祸首。

我需要计算我的物体的质量吗?这对于一个立方体来说已经足够简单了,但是一些奇怪的凸形呢?有什么办法可以让子弹帮我做这件事吗?

【问题讨论】:

    标签: c++ bulletphysics


    【解决方案1】:

    是的,质量是罪魁祸首。想想你的大盒子是一个空的木箱,你的小盒子是一个实心的铁块。大小差异巨大,但质量相同。现在你的物理看起来是正确的,对吧?

    是的,您应该提供质量。是你计算它还是仅仅说“这个盒子重 20 公斤”取决于你。实际上期望其他人为您计算质量只会使您的问题变得更糟,因为除了几何形状之外,您还必须指定对象的材料、材料密度和材料分布。如果您想这样做,还有很多其他工具可以帮助您进行此类计算。但我相信你同意,通过反复试验来陈述一些质量是迄今为止更容易的。

    【讨论】:

    • 那么这样你也必须自己计算质心,不是吗?所以(对于非平凡的形状)你还需要知道形状和密度,不是吗,而且反复试验还不够?
    • 感谢您的回答。我想我必须花一些时间来计算凸包体积,或者切换到triangleMesh 类型的对象。我的数据就是这样设置的,所以我实际上认为这是要走的路。
    • @BWG 知道物体的重量比知道它的体积和密度要普遍得多。你在建模什么?
    • @Rup 计算质心是 calculateLocalInertia 所做的工作之一。
    • @weston 我从一个立方体开始,然后想把它切成小块。我什至不知道从哪里开始计算切碎部分的质量。我还将(我认为)必须计算质心。我可以使用计算出的惯性矢量 (shape-&gt;calculateLocalInertia()) 来近似我的物体的质量吗?小立方体的惯性远小于大立方体。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    相关资源
    最近更新 更多