0

私は自分の問題について十分に明確ではなかったと思うので、この質問を完全に修正しなければなりませんでした。

Box2D Web のコツを学ぼうとしています。複数のシェイプを 1 つのリジッド ボディに配置する方法を学びたいと思ったとき (応答性の高い凹型ボディを形成するため)、問題が発生し始めました。私が行った仮定の 1 つは、この種の機能は、形状の位置を変更できる場合にのみ実際に役立つというものでした (これにより、剛体全体がどのように見えるかを制御できます)。例として、2 つの長方形の形状を持つ「L」ボディを作成し、そのうちの 1 つを最初の形状の右下に配置します。

これまでのところ、3 番目の引数 (中央) でボックスの位置を渡すことができる SetAsOrientedBox メソッドを見つけました。

すべて順調です。しかし、1 つの剛体で 2 つの円形状を作成しようとすると、望ましくない動作が見つかりました。私の本能は SetLocalPosition メソッド (b2CircleShape クラスにあります) を使用することでした。これはある程度機能するようです。デバッグ描画では、ボディは物理的には本来の反応を示しますが、視覚的に (デバッグ内で) 形状をその位置に描画していないように見えます。中心位置に円を描くだけです。これはおそらく Box2D のデバッグ ドロー ロジックの問題であることは承知していますが、この問題に関するオンライン パターンがないのは奇妙に思えます。体の座標空間の異なる位置に 2 つの円形状を作成することは、よく知られており、十分に文書化された現象であると考える人もいるでしょう。明らかに違います。

以下は、ボディを作成するために使用しているコードです。ワールドがこのスコープに効果的に渡されたと仮定します。

// 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/ ) を使用していることに注意してください。

4

1 に答える 1

1

実際には標準のデバッグ描画をまったく使用していないようですが、自分で作成した関数を使用しているようです-これは、それに関するオンラインパターンの欠如を説明しています(後世のペーストビン)。

box2dweb のソースを見て、次の関数を参考にしてください。 b2World.prototype.DrawDebugData
   b2World.prototype.DrawShape
   b2DebugDraw.prototype.DrawSolidCircle

キャンバス コンテキストの 'arc' 関数を使用すると、sin/cos を使用して点を計算し、個々の線を描画して円を作成する必要がなくなります。また、ブラウザが知っている最も効率的な方法を使用して曲線をレンダリングできるようにもします。一部のブラウザでのハードウェア サポート。

カスタム レンダリングを行いたいように見えるので、注意すべきもう 1 つの落とし穴は、DrawCircle と DrawSolidCircle の呼び出しシグネチャが異なることです。これらの 2 番目は軸方向のパラメーターを取るため、誤って 3 つのパラメーター バージョンを使用すると、Javascript は暗黙のうちに軸の色パラメーターを使用し、未定義の色パラメーターが残ります。楽しい時間!

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