0

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

我正在尝试学习 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 画布一起使用。

4

1 回答 1

1

看起来您实际上根本没有使用标准的调试绘图,而是您自己编写的一个函数 - 这解释了缺乏关于它的在线模式(后世的pastebin)。

查看 box2dweb 源代码并查看这些函数以获取工作参考: b2World.prototype.DrawDebugData
   b2World.prototype.DrawShape
   b2DebugDraw.prototype.DrawSolidCircle

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

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

DrawCircle(center, radius, color)
DrawSolidCircle(center, radius, axis, color)
于 2012-11-17T03:25:48.100 回答