碰撞检测算法主要采用检测接触点的方式,给模型的边界添加不同的触点。通过触点的接触位置来检测物体是否发生碰撞。
std::shared_ptr<SceneGraph> scn = std::make_shared<SceneGraph>();
auto rigid = scn->addNode(std::make_shared<RigidBodySystem<DataType3f>>());
RigidBodyInfo rigidBody;
rigidBody.linearVelocity = Vec3f(0.0, 0, 0);
BoxInfo box;
box.center = Vec3f(0.5, 0.1, 0.5);
box.halfLength = Vec3f(0.1, 0.1, 0.1);
rigid->addBox(box, rigidBody);
box.center = Vec3f(0.5, 0.3, 0.59);
box.halfLength = Vec3f(0.1, 0.1, 0.1);
rigid->addBox(box, rigidBody);
auto mapper = std::make_shared<DiscreteElementsToTriangleSet<DataType3f>>();
rigid->currentTopology()->connect(mapper->inDiscreteElements());
rigid->graphicsPipeline()->pushModule(mapper);
auto sRender = std::make_shared<GLSurfaceVisualModule>();
sRender->setColor(Vec3f(1, 1, 0));
mapper->outTriangleSet()->connect(sRender->inTriangleSet());
rigid->graphicsPipeline()->pushModule(sRender);
//TODO: to enable using internal modules inside a node
auto elementQuery = std::make_shared<NeighborElementQuery<DataType3f>>();
rigid->currentTopology()->connect(elementQuery->inDiscreteElements());
rigid->stateCollisionMask()->connect(elementQuery->inCollisionMask());
rigid->graphicsPipeline()->pushModule(elementQuery);
auto contactMapper = std::make_shared<ContactsToEdgeSet<DataType3f>>();
elementQuery->outContacts()->connect(contactMapper->inContacts());
contactMapper->varScale()->setValue(0.02);
rigid->graphicsPipeline()->pushModule(contactMapper);
auto wireRender = std::make_shared<GLWireframeVisualModule>();
wireRender->setColor(Vec3f(0, 1, 0));
contactMapper->outEdgeSet()->connect(wireRender->inEdgeSet());
rigid->graphicsPipeline()->pushModule(wireRender);
代码参考example/RigidBody/GL_TwoTets/main.h: