Я уже писал об этом раньше, но безрезультатно. Извините за легкое повторение, но я пытался понять это, но я не смог. Я, вероятно, не понимаю что-то в box2d. Поэтому я написал очень упрощенный пример, чтобы выделить проблему.
В моем коде я просто создаю прямоугольник. Я триангулирую его, а затем добавляю в мир box2d. Если я определяю объект как динамический объект (плотность> 0), он реагирует на стены и объекты в сцене см. изображения здесь.
Если я объявлю это как статическое (плотность = 0), то триангуляция испортится, как вы можете видеть в ссылке выше.
По сути, это линия setPhysics, которая делает все различия между двумя сценариями.
#include "ofApp.h"
//--------------------------------------------------------------
void ofApp::setup()
{
// Box2d
box2d.init();
box2d.createGround();
box2d.setFPS(30.0);
}
//--------------------------------------------------------------
void ofApp::update()
{
shape.clear();
//A rectangle with a chunk taken out, making a concave shape
shape.addVertex(ofPoint(mouseX, mouseY));
shape.addVertex(ofPoint(mouseX+0, mouseY+200));
shape.addVertex(ofPoint(mouseX+200, mouseY+200));
shape.addVertex(ofPoint(mouseX+200, mouseY));
shape.simplify();
ofPolyline outline = shape;
ofPolyline resampled = shape.getResampledBySpacing(45);
vector <TriangleShape> tris;
tris = triangulatePolygonWithOutline(resampled, outline);
polyShapes.clear();
// now loop through all the triangles and make a box2d triangle
for (int i=0; i<tris.size(); i++)
{
ofPtr<ofxBox2dPolygon> triangle = ofPtr<ofxBox2dPolygon>(new ofxBox2dPolygon);
triangle.get()->addTriangle(tris[i].a, tris[i].b, tris[i].c);
triangle.get()->setPhysics(1, 0, 0); //density, bounce, friction
triangle.get()->create(box2d.getWorld());
//triangle.get()->body->SetType(b2_staticBody);
polyShapes.push_back(triangle);
}
box2d.update();
}
//--------------------------------------------------------------
void ofApp::draw()
{
ofBackground(125);
ofSetColor(255);
ofNoFill();
for (int i=0; i<polyShapes.size(); i++)
{
polyShapes[i].get()->draw();
ofCircle(polyShapes[i].get()->getPosition(), 3);
}
}
Код для вышеуказанной программы можно скачать Вот (для openFrameworks). Любая помощь очень ценится. Я должен что-то доставить клиенту и этим ударом головой об стену.
Задача ещё не решена.