在Box2D Web中将圆形定位在主体内

时间:2012-11-14 13:31:56

标签: c++ html5 box2d

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

我正在尝试学习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);

请注意,我正在使用带有HTML5画布的Box2D Web(http://code.google.com/p/box2dweb/)。

1 个答案:

答案 0 :(得分:1)

看起来你根本就没有使用标准的调试绘图,而是你自己编写的一个函数 - 这解释了缺少关于它的在线模式(pastebin for posterity)。

查看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)