塑性材料在发生小应变时,材料性质基本为线弹性,弹性模量为常数;当应力超过屈服应力后,刚度会显著下降。
std::shared_ptr<SceneGraph> scn = std::make_shared<SceneGraph>();
//Create a particle emitter
auto boundary = scn->addNode(std::make_shared<StaticBoundary<DataType3f>>());
boundary->loadCube(Vec3f(0), Vec3f(1), 0.005, true);
auto elastoplasticBody = scn->addNode(std::make_shared<ElastoplasticBody<DataType3f>>());
elastoplasticBody->connect(boundary->importParticleSystems());
elastoplasticBody->setVisible(false);
elastoplasticBody->loadParticles(Vec3f(-1.1), Vec3f(1.15), 0.1);
elastoplasticBody->loadSurface("../../data/standard/standard_cube20.obj");
elastoplasticBody->scale(0.05);
elastoplasticBody->translate(Vec3f(0.3, 0.2, 0.5));
elastoplasticBody->getSurfaceNode()->setVisible(true);
auto elasticBody = scn->addNode(std::make_shared<ElasticBody<DataType3f>>());
boundary->addParticleSystem(elasticBody);
elasticBody->setVisible(false);
elasticBody->loadParticles(Vec3f(-1.1), Vec3f(1.15), 0.1);
elasticBody->loadSurface("../../data/standard/standard_cube20.obj");
elasticBody->scale(0.05);
elasticBody->translate(Vec3f(0.5, 0.2, 0.5));
auto ptRender = std::make_shared<GLSurfaceVisualModule>();
ptRender->setColor(Vec3f(0, 1, 1));
elastoplasticBody->getSurfaceNode()->currentTopology()->connect(ptRender->inTriangleSet());
elastoplasticBody->getSurfaceNode()->graphicsPipeline()->pushModule(ptRender);
auto sRender = std::make_shared<GLSurfaceVisualModule>();
sRender->setColor(Vec3f(1, 1, 1));
elasticBody->getSurfaceNode()->currentTopology()->connect(sRender->inTriangleSet());
elasticBody->getSurfaceNode()->graphicsPipeline()->pushModule(sRender);
如下图所示,当塑性材料从空中坠落到地面之后,发生塑性形变。代码参考example/GL_Plasticity/main.h: