Box2d:精确地放置另一个对象?

时间:2017-02-05 10:59:56

标签: box2d

我想知道如何将灯具放在另一个灯具旁边。顺便说一句。我可能很困惑自己。 所以这就是我想要做的: LIKE THIS ILLUSTRATION

我可以通过将leftWall + sizeX / 2的leftWall + sizeX / 2的positionX的总和应用到爬墙的方框来实现这一目的吗?或者是否有一些box2d函数可以自动计算位置? 完成此操作后,我将为盒子添加一个恒定的速度,因此我需要它是精确的加上它看起来更好的事实。我太困惑了自己,我不知道怎么会有人告诉我他们会做什么? 谢谢!非常感谢!

2 个答案:

答案 0 :(得分:1)

选择“总和” 我不认为这是一个问题 如果你真的不喜欢它,那就写下你自己的功能吧 如你所知,这并不难。

详细

Box2D不是建筑图书馆 据我所知,没有这样的功能 在3D物理和图形学中,我也遇到了这样的不便。
我有两种选择: -

  • 硬编码“某事的总和”(我开始喜欢这句话。)
  • 封装此类库(例如Box2D)/代码实用程序函数

我通常选择其中一个选择,取决于具体情况 因为这只是一点点不便,我相信第一个适合你的情况。

顺便说一句,there are reserved margin between colliding fixtures,所以我认为你无法确定准确的位置。

  

默认情况下,夹具周围总是有一小块空间。

答案 1 :(得分:1)

对正在发生的事情的解释......

对于静态和运动物体,放置它们的地方就是它们所在的位置。换句话说,如果您使用b2Body::SetTransform的位置拨打pos,然后拨打b2Body::GetPosition,则返回的值应该等于pos。即使这些物体彼此重叠,这也应该成立。除非你告诉他们,否则他们不会动。

然而,动态物体的行为却不同。它们的行为更像我们期望固体在现实世界中表现。但是我们仍然可以对他们做些事情,但实际上对于真正的固体物体却无法实现。例如,我们可以在一个动态主体上调用b2Body::SetTransform将其(或部分)放在另一个主体中。现在,物理引擎可以找出移动动态物体的位置,使其不再位于其他物体内(并且考虑到初始重叠可能看起来似乎足够合理)。

更准确地说,2.3.2 Box2D库将解决两个实体(其中一个或两个是动态的)的重叠,以及b2_maxLinearCorrection每个位置迭代的重叠,直到minSeparation >= -3.0f * b2_linearSlop minSeparation分隔平面中最接近顶点(两个形状)的距离减去两个顶点半径的总和(两个形状)。 “顺序求解器”通过脉冲实现这一点,但不会影响体速值,因此两个身体都不会像任何额外的动量那样起作用。

您可以查看b2ContactSolver.cpp文件的b2ContactSolver::SolvePositionConstraints方法中涉及的代码。

所以从某种意义上说,Box2D世界步骤“为您计算位置”。但请注意以下警告:

  1. 此位置分辨率并非总是一步完成。即用户可能会看到盒子从墙上移出,直到它完全出现。
  2. 如果您将盒子放入墙壁太远,它将出现在墙壁的另一侧。
  3. 您可能想要考虑您的期望顶点半径的总和 - 即将形状'm_radius值的值相加。这被称为保留的空间边界。对于两个多边形,这将是4.0f * b2_linearSlop0.02f(2厘米)。
  4. 如果将对象精确地放在另一个旁边,那么:

    • 您可以将非动态实体放在彼此旁边,就像浮点值允许的那样。
    • 您可以将动态主体放置在另一个主体旁边,只要位置分辨率允许(并且只能像浮点值一样精确)。任何更接近的,“顺序解算器”都会将其移回。