Box2D 다각형 "Set ()"함수를 사용합니까?


11

Box2D 물리 엔진을 사용하고 있습니다. 그리고 box2D에는 b2PolygonShape이라는 모양이 있습니다.

이 클래스에서는 다각형을 만들 수 있습니다. 포인트 배열과 정점 카운트를 취하는 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

1
실제로는 아닙니다. 다각형은 볼록해야하므로이를 확인하기 위해 권선 순서를 가정해야합니다. 다각형을 즉석에서 그리거나 작성하려면 다각형을 사전 처리하여 정점 수 제한 (6 또는 8 vert라고 생각합니다)에 해당하는지 확인해야합니다. Box2D로 전달하기 전에 올바르게 감으십시오.
Noel Llopis

0

다각형의 감기를 결정한 다음 시계 반대 방향 인 경우 반전시킬 수 있습니다.

일반적인 알고리즘 중 하나는 아래 알고리즘을 사용하여 다각형의 면적을 계산하는 것입니다. 시계 방향 감기의 경우 + ve 번호를, 시계 반대 방향 감기의 경우 -ve 번호를 반환합니다.

다음은 파이썬 예제입니다.

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.