在Box2D Web中定位实体内的圆形

Positioning Circle Shapes within a Body in Box2D Web

本文关键字:实体 定位 Box2D Web      更新时间:2023-10-16

我不得不彻底修改这个问题,因为我认为我对自己的问题不够明确。

我正在尝试学习Box2DWeb的诀窍。当我想学习如何在一个刚体中放置多个形状(以形成反应灵敏的凹体)时,我开始遇到问题。我做的一个假设是,只有当我可以改变形状的位置时,这种功能才会真正有用(这样我就可以控制整个刚体的样子)。一个例子是创建一个有两个矩形的"L"体,其中一个位于第一个形状的下方和右侧。

到目前为止,我已经找到了SetAsOrientedBox方法,在该方法中,您可以将框的位置传递给第三个参数(中心)。

一切都很好。但当我试图在一个刚体中创建两个圆形时,我发现了不可取的行为。我的直觉是使用SetLocalPosition方法(在b2CircleShape类中找到)。这似乎在一定程度上起了作用。在调试绘制中,身体会像它应该做的那样做出物理响应,但在视觉上(在调试中)它似乎并没有在它们的位置绘制形状。它只是在中心位置绘制圆形。我知道这可能是Box2D的调试绘制逻辑的问题,但我觉得奇怪的是,没有关于这个问题的在线模式。有人会认为,在身体坐标空间的不同位置创建两个圆形将是一种流行且有充分记录的现象。显然不是。

下面是我用来创建实体的代码。假设世界已经有效地转移到这个范围:

// first circle shape and def
var fix_def1 = new b2FixtureDef;
fix_def1.density = 1.0;
fix_def1.friction = 0.5;
fix_def1.restitution = .65;
fix_def1.bullet = false;
var shape1 = new b2CircleShape();
fix_def1.shape = shape1;
fix_def1.shape.SetLocalPosition(new b2Vec2(-.5, -.5));
fix_def1.shape.SetRadius(.3);
// second circle def and shape
var fix_def2 = new b2FixtureDef;
fix_def2.density = 1.0;
fix_def2.friction = 0.5;
fix_def2.restitution = .65;
fix_def2.bullet = false;
var shape2 = new b2CircleShape();
fix_def2.shape = shape2;
fix_def2.shape.SetLocalPosition(new b2Vec2(.5, .5));
fix_def2.shape.SetRadius(.3);
// creating the body
var body_def = new b2BodyDef();
body_def.type = b2Body.b2_dynamicBody;
body_def.position.Set(5, 1);
var b = world.CreateBody( body_def );
b.CreateFixture(fix_def1);
b.CreateFixture(fix_def2);

请注意,我使用的是Box2DWeb(http://code.google.com/p/box2dweb/)与HTML5画布。

看起来你实际上根本没有使用标准的调试绘图,而是使用了一个你自己编写的函数——这解释了它缺乏在线模式的原因(为子孙后代使用pastebin)。

查看box2dweb源代码,并查看这些函数以获得工作参考: nbsp b2World.protype.DrawDebugData nbsp;b2World.protype.DrawShape
 nbsp b2调试Draw.prototype.DrawSolidCircle

您可以使用画布上下文"arc"函数来避免使用sin/cos计算点,然后绘制单独的线来形成圆。它还允许浏览器使用它所知道的最有效的方式来渲染曲线,例如某些浏览器上的硬件支持。

由于您似乎想要进行自定义渲染,另一个需要注意的陷阱是DrawCircle和DrawSolidCircle的不同调用签名。第二个参数是轴方向的参数,因此,如果您错误地使用三参数版本的Javascript,则会默默地使用轴的颜色参数,留下一个未定义的颜色参数。几个小时的乐趣!

DrawCircle(center, radius, color)
DrawSolidCircle(center, radius, axis, color)