Box2d:准确地将对象放在另一个对象旁边?
Box2d: Place object besides another one precisely?
我想知道如何将固定装置放在另一个固定装置旁边。顺便提一句。我可能把自己弄糊涂了。
所以这就是我想做的:
LIKE THIS ILLUSTRATION
我是否可以通过将 leftWall 的 positionX + leftWall 的 sizeX/2 + box 的 sizeX/2 之类的东西的总和应用于爬墙的盒子来完成此操作?或者是否有一些自动计算位置的 box2d 函数?
完成此操作后,我将向盒子添加一个恒定速度,因此我需要它是精确的,而且它看起来更好。我只是把自己搞糊涂了,我不知道该怎么做,但有人能告诉我他们会怎么做吗?
谢谢!非常感谢!
选择 "the sum of something"。
我不认为这是一个问题。
实在不喜欢就自己写个函数来做吧
如您所知,这并不难。
详情
Box2D 不是建筑库。
据我所知,没有这个功能。
在 3D Physics and Graphics 中,我也遇到了这样的小不便。
我有 2 个选择 :-
- 硬编码"the sum of something"(我开始爱上这句话了。)
- 封装此类库(例如 Box2D)/编写实用函数
我通常会选择其中一种,视情况而定。
因为只是有点不方便,相信第一种适合你的情况。
顺便说一下,there are reserved margin between colliding fixtures,所以我认为你不能设置准确的位置。
there is always a small margin of space added around the fixture by default.
对正在发生的事情的解释...
对于静态和运动物体,您放置它们的位置就是它们所在的位置。换句话说,如果你用 pos
的位置调用 b2Body::SetTransform
,然后调用 b2Body::GetPosition
,返回值应该等于 pos
。即使这些物体彼此重叠,这也应该成立。除非你告诉他们,否则他们不会移动。
然而,动态物体的行为不同。它们的行为更像是我们期望实体在现实世界中的行为。但是我们仍然可以对它们做一些实际上无法对真正的实体 object 做的事情。例如,我们可以在一个动态 body 上调用 b2Body::SetTransform
以将它(或它的一部分)放在另一个 body 中。现在,物理引擎会找出将动态 body 移动到哪里,以便它不再在另一个 body 内(并且在考虑到初始重叠的情况下,以一种看起来足够合理的方式).
更准确地说,对于每个位置迭代,2.3.2 Box2D 库将解决两个物体(其中一个或两个都是动态的)重叠 b2_maxLinearCorrection
直到 minSeparation >= -3.0f * b2_linearSlop
其中 minSeparation
是分离平面中(两种形状的)最近顶点之间的距离减去(两种形状的)顶点半径之和。 "sequential solver" 通过脉冲执行此操作,但不会影响 body 速度值,因此 body 的行为就好像它有任何额外的动量一样。
你可以看看b2ContactSolver.cpp
文件的b2ContactSolver::SolvePositionConstraints
方法涉及的代码
所以从某种意义上说,Box2D 世界为您迈出了 "calculates the position"。但请注意以下注意事项:
- 此位置解析并不总是一步完成。 IE。用户可能会看到盒子从墙上移开,直到完全消失。
- 如果你把盒子放在离墙太远的地方,它会出现在墙的另一边。
- 您可能希望将顶点半径的总和考虑到您的期望中 - 即对形状的
m_radius
值求和。这被称为 space 的预留余量。对于两个多边形,这将是 4.0f * b2_linearSlop
或 0.02f
(2 厘米)。
只要将 object 准确地放在另一个旁边,那么:
- 您可以在 floating-point 值允许的范围内将 non-dynamic 个物体并排放置。
- 您可以将动态 body 放置在另一个 body 旁边,但只能在位置分辨率允许的范围内尽可能接近(并且只能在 floating-point 值允许的范围内精确)。再靠近一点,"sequential solver" 会将其移回。
我想知道如何将固定装置放在另一个固定装置旁边。顺便提一句。我可能把自己弄糊涂了。 所以这就是我想做的: LIKE THIS ILLUSTRATION
我是否可以通过将 leftWall 的 positionX + leftWall 的 sizeX/2 + box 的 sizeX/2 之类的东西的总和应用于爬墙的盒子来完成此操作?或者是否有一些自动计算位置的 box2d 函数? 完成此操作后,我将向盒子添加一个恒定速度,因此我需要它是精确的,而且它看起来更好。我只是把自己搞糊涂了,我不知道该怎么做,但有人能告诉我他们会怎么做吗? 谢谢!非常感谢!
选择 "the sum of something"。
我不认为这是一个问题。
实在不喜欢就自己写个函数来做吧
如您所知,这并不难。
详情
Box2D 不是建筑库。
据我所知,没有这个功能。
在 3D Physics and Graphics 中,我也遇到了这样的小不便。
我有 2 个选择 :-
- 硬编码"the sum of something"(我开始爱上这句话了。)
- 封装此类库(例如 Box2D)/编写实用函数
我通常会选择其中一种,视情况而定。
因为只是有点不方便,相信第一种适合你的情况。
顺便说一下,there are reserved margin between colliding fixtures,所以我认为你不能设置准确的位置。
there is always a small margin of space added around the fixture by default.
对正在发生的事情的解释...
对于静态和运动物体,您放置它们的位置就是它们所在的位置。换句话说,如果你用 pos
的位置调用 b2Body::SetTransform
,然后调用 b2Body::GetPosition
,返回值应该等于 pos
。即使这些物体彼此重叠,这也应该成立。除非你告诉他们,否则他们不会移动。
然而,动态物体的行为不同。它们的行为更像是我们期望实体在现实世界中的行为。但是我们仍然可以对它们做一些实际上无法对真正的实体 object 做的事情。例如,我们可以在一个动态 body 上调用 b2Body::SetTransform
以将它(或它的一部分)放在另一个 body 中。现在,物理引擎会找出将动态 body 移动到哪里,以便它不再在另一个 body 内(并且在考虑到初始重叠的情况下,以一种看起来足够合理的方式).
更准确地说,对于每个位置迭代,2.3.2 Box2D 库将解决两个物体(其中一个或两个都是动态的)重叠 b2_maxLinearCorrection
直到 minSeparation >= -3.0f * b2_linearSlop
其中 minSeparation
是分离平面中(两种形状的)最近顶点之间的距离减去(两种形状的)顶点半径之和。 "sequential solver" 通过脉冲执行此操作,但不会影响 body 速度值,因此 body 的行为就好像它有任何额外的动量一样。
你可以看看b2ContactSolver.cpp
文件的b2ContactSolver::SolvePositionConstraints
方法涉及的代码
所以从某种意义上说,Box2D 世界为您迈出了 "calculates the position"。但请注意以下注意事项:
- 此位置解析并不总是一步完成。 IE。用户可能会看到盒子从墙上移开,直到完全消失。
- 如果你把盒子放在离墙太远的地方,它会出现在墙的另一边。
- 您可能希望将顶点半径的总和考虑到您的期望中 - 即对形状的
m_radius
值求和。这被称为 space 的预留余量。对于两个多边形,这将是4.0f * b2_linearSlop
或0.02f
(2 厘米)。
只要将 object 准确地放在另一个旁边,那么:
- 您可以在 floating-point 值允许的范围内将 non-dynamic 个物体并排放置。
- 您可以将动态 body 放置在另一个 body 旁边,但只能在位置分辨率允许的范围内尽可能接近(并且只能在 floating-point 值允许的范围内精确)。再靠近一点,"sequential solver" 会将其移回。