Cocos2d + Box2d で iOS ゲームを開発しようとしています。Box2D で楕円形フィクスチャを使用したいと考えています。b2Capsule 形状を使用してみましたが、衝突が適切ではないため、正確には必要ありません。誰もこれを以前にやったことがありますか?
2 に答える
0
Box2D の特定の形状については、元のポリゴン (あなたの場合、特定の数の頂点を保持する楕円) を三角測量する必要があります。
これには、 http: //code.google.com/p/poly2tri/ で poly2tri の優れた制約付き Delaunay 三角形分割を使用できます 。これは非常に簡単です。三角形を取得する方法は次のとおりです。
- (NSArray*) triangulate:(NSArray*)verticesArray
{
NSMutableArray* outputTriangles = [[[NSMutableArray alloc] init] autorelease];
p2t::CDT* triangulationContainer;
vector<p2t::Triangle*> p2tTriangles;
vector< vector<p2t::Point*> > polylines;
vector<p2t::Point*> polyline;
for (hOzPoint2D *point in verticesArray) {
polyline.push_back(new p2t::Point([point x], [point y]));
}
polylines.push_back(polyline);
triangulationContainer = new p2t::CDT(polyline);
triangulationContainer->Triangulate();
p2tTriangles = triangulationContainer->GetTriangles();
for (int i = 0; i < p2tTriangles.size(); i++) {
p2t::Triangle& t = *p2tTriangles[i];
p2t::Point& a = *t.GetPoint(0);
p2t::Point& b = *t.GetPoint(1);
p2t::Point& c = *t.GetPoint(2);
[outputTriangles addObject:[NSArray arrayWithObjects:
[hOzPoint2D point2DWithDoubleX:a.x doubleY:a.y],
[hOzPoint2D point2DWithDoubleX:b.x doubleY:b.y],
[hOzPoint2D point2DWithDoubleX:c.x doubleY:c.y], nil]];
}
delete triangulationContainer;
for(int i = 0; i < polylines.size(); i++) {
vector<p2t::Point*> poly = polylines[i];
FreeClear(poly);
}
return [outputTriangles copy];
}
hOzPoint2D は私のカスタム ポイント クラスですが、任意の座標を渡すことができます。NSArray を出力する必要さえありません。このメソッドをボディ作成メソッドに挿入できます。poly2tri にはいくつかの制限があることに注意してください。
- ポリゴンに同じポイントを 2 回含めることはできません。
- ポリゴンは自己交差してはなりません。
- ...
詳細については、poly2tri のページをご覧ください。
結果の配列には、フィクスチャとして同じボディにアタッチする三角形が含まれます。
于 2013-03-30T10:05:58.567 に答える