2012-11-14 17 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