我不得不彻底修改这个问题,因为我认为我对我的问题不够明确。
我正在尝试学习 Box2D Web 的诀窍。当我想学习如何将多个形状放在一个刚体中(以形成响应性凹形体)时,我开始遇到问题。我做出的一个假设是,这种特征只有在我可以改变形状的位置时才会真正有用(这样我就可以控制整个刚体的样子)。一个例子是创建一个具有两个矩形形状的“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);
请注意,我将 Box2D Web ( http://code.google.com/p/box2dweb/ ) 与 HTML5 画布一起使用。