Sử dụng hàm Box2D Polygon Bộ Set ()?


11

Tôi đang sử dụng công cụ vật lý Box2D. Và có một loại hình dạng cho box2D được gọi là b2PolygonShape.

Trong lớp này, bạn có thể tạo đa giác. Ngoài ra còn có hàm Set () lấy một mảng các điểm và số đỉnh.

Box2D có một ví dụ như thế này:

// 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);

Những công việc này. Tuy nhiên, khi tôi cố gắng thực hành và gây rối với chức năng này, tôi đã làm điều này:

  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);

Khi tôi biên dịch và chạy nó, nó bị lỗi sau hàm Set (). Điều này sẽ không tạo ra một hình vuông?

Ngoài ra trong giao diện điều khiển tôi đã nhận được điều này:

Assertion failed: s > 0.0f

Tôi đã làm gì sai?

Câu trả lời:


10

Đó là bởi vì bốn đỉnh bạn cung cấp theo thứ tự theo chiều kim đồng hồ và Box2D giả định rằng chúng theo chiều ngược chiều kim đồng hồ, như trong ví dụ đầu tiên của bạn. Vì vậy, nó sẽ hoạt động tốt nếu bạn thay đổi nó thành:

  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);

Và nhân tiện, nếu bạn chỉ đang tạo một đa giác hình hộp, bạn có thể sử dụng chức năng tiện lợi

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

Có cách nào để làm cho nó không giả định? Những gì tôi đang cố gắng làm là tạo ra một chương trình nơi bạn có thể vẽ các hình dạng, giống như PHUN. Và đó là nơi tôi gặp phải những lỗi này nên tôi quyết định dùng thử với hình chữ nhật.
xAustechx

1
Không hẳn vậy. Đa giác cần phải lồi và do đó, nó cần phải giả định thứ tự quanh co để xác minh điều đó. Nếu bạn định vẽ và tạo đa giác một cách nhanh chóng, bạn cần xử lý trước chúng để đảm bảo chúng nằm dưới giới hạn số đỉnh (tôi nghĩ đó là 6 hoặc 8 câu) và tại thời điểm đó bạn cũng có thể cuộn chúng một cách chính xác trước khi bạn đưa chúng cho Box2D.
Noel Llopis

0

Bạn có thể xác định cuộn dây của đa giác, và sau đó đảo ngược nó nếu nó ngược chiều kim đồng hồ.

Một phương pháp phổ biến là tính diện tích của đa giác bằng thuật toán bên dưới. Nó sẽ trả về số + ve cho cuộn dây theo chiều kim đồng hồ và số -ve cho cuộn ngược chiều kim đồng hồ.

Đây là một ví dụ về 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.