Box2Dポリゴンの「Set()」関数を使用していますか?


11

Box2D物理エンジンを使用しています。そして、b2PolygonShapeと呼ばれる、box2Dのタイプの形状があります。

このクラスでは、ポリゴンを作成できます。ポイントの配列と頂点数を取得するSet()関数もあります。

Box2Dには次のような例があります。

// This defines a triangle in CCW order.

b2Vec2 vertices[3];

vertices[0].Set(0.0f, 0.0f);

vertices[1].Set(1.0f, 0.0f);

vertices[2].Set(0.0f, 1.0f);

int32 count = 3;



b2PolygonShape polygon;

polygon.Set(vertices, count);

これは機能します。それでも、この機能を練習して混乱させようとしたとき、私はこれを行いました:

  b2Vec2 vertices[4];

  vertices[0].Set(0, 0);
  vertices[1].Set(0,10);
  vertices[2].Set(10,10);
  vertices[3].Set(10,0);

  int32 count = 4;

  b2PolygonShape polygon;

  polygon.Set(vertices, count);

これをコンパイルして実行すると、Set()関数の後でクラッシュしました。これは正方形を作成しませんか?

また、コンソールでこれを得ました:

Assertion failed: s > 0.0f

私は何を間違えましたか?

回答:


10

これは、最初の例のように、指定した4つの頂点が時計回りであり、Box2Dがそれらが反時計回りであると想定しているためです。したがって、次のように変更すると問題なく動作します。

  b2Vec2 vertices[4];

  vertices[0].Set(0, 0);
  vertices[1].Set(10,0);
  vertices[2].Set(10,10);
  vertices[3].Set(0,10);

  int32 count = 4;

  b2PolygonShape polygon;

  polygon.Set(vertices, count);

ちなみに、箱形のポリゴンを作成するだけなら、便利な関数を使うことができます

void b2PolygonShape::SetAsBox(float32 hx, float32 hy, const b2Vec2& center, float32 angle)

それを想定しないようにする方法はありますか?私がやろうとしていることは、PHUNのような形を描くことができるプログラムを作成することです。そして、それが私がこれらのエラーに遭遇した場所なので、長方形でそれを試すことにしました。
xAustechx 2010

1
あんまり。ポリゴンは凸状である必要があるため、それを確認するには巻き順を想定する必要があります。多角形をその場で描画して作成する場合は、それらを前処理して、頂点数の制限(6か8頂点であると思う)を下回っていることを確認します。その時点で、 Box2Dに渡す前に正しく巻き付けてください。
Noel Llopis、2010

0

ポリゴンのワインディングを決定し、反時計回りの場合は逆にすることができます。

一般的な方法の1つは、以下のアルゴリズムを使用してポリゴンの面積を計算することです。時計回りの場合は+ ve、反時計回りの場合は-veを返します。

Pythonの例を次に示します。

def poly_area(verts):
    """
    Return area of a simple (ie. non-self-intersecting) polygon.
    Will be negative for counterclockwise winding.
    """
    accum = 0.0
    for i in range(len(verts)):
        j = (i + 1) % len(verts)
        accum += verts[j][0] * verts[i][1] - verts[i][0] * verts[j][1]
    return accum / 2
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.