2012-11-14 15 views
0

我不得不彻底改造这个问题,因为我不认为我对我的问题足够明确。在Box2D的身体内定位圆形状网络

我试图学习Box2D Web的绳索。当我想要学习如何在一个刚体中放置多个形状(以形成响应性凹面体)时,我开始遇到问题。我所做的一个假设是,如果我可以改变形状的位置(这样我就可以控制整个刚体的外观),这种特征只会非常有用。一个例子是创建一个具有两个矩形形状的“L”体,其中一个位于第一个形状的下方和右侧。

我已经得到了这么远 - 因为我发现了SetAsOrientedBox方法,您可以在第三个参数(中心)中将方框的位置传递给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网(http://code.google.com/p/box2dweb/)与HTML5画布。

+0

我试过这与当前svn源代码,它似乎工作正常。我只是添加了一个多边形作为地面形状来放置两个圆。您是否使用Box2DWeb的最新版本? – iforce2d

+0

感谢您成为唯一评论者我使用的版本在这里(http://www.kirven.co.uk/html5/ball/box2d/Box2dWeb-2.1.a.3.js)。这有点乱,但这里是URL(http://www.kirven.co.uk/html5/ball/test_environment.html)。主要的JS文件正在加载(bootstrap.js),我正在关注的方法是'createBall'方法。如前所述,我刚刚开始使用Box2D - 所以不要评论无组织代码!期待意见。 :-) – shennan

+0

你如何从一个非常简单的例子开始。让我们说一个显示一个简单的世界和一个正方形。我很难让他们展示我希望他们的方式。事实上,我甚至不确定世界是否被正确创造。这看起来应该很容易,但到目前为止一直是一个真正的麻烦制造者。 –

回答

1

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

拿在box2dweb源看看,看看这些功能的参考工作:       b2World.prototype.DrawDebugData
      b2World.prototype.DrawShape
      b2DebugDraw.prototype.DrawSolidCircle

您可以使用画布上下文的“弧”功能来避免需要用sin/cos计算点,然后绘制各个线条来制作圆。它还可以让浏览器使用它知道的最有效的方式来渲染曲线,例如。在某些浏览器上支持硬件。

由于您似乎想要自定义渲染,因此需要注意的另一个缺陷是DrawCircle和DrawSolidCircle的不同调用签名。其中第二个需要轴方向的参数,所以如果您错误地使用了三个参数版本,Javascript将默默使用该轴的颜色参数,给您一个未定义的颜色参数。好玩的小时!

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

我还没有时间来测试答案 - 但我99%确定你是对的。我从教程中借了很多代码,并且完全忽略了调试绘图。感谢您的建议。 – shennan