osg实现爆炸效果代码
时间: 2023-05-23 08:07:04 浏览: 340
A:
osg::Vec3Array* createExplosionGeometry(float size)
{
// Create an array of vertices
osg::Vec3Array* vertices = new osg::Vec3Array;
vertices->push_back(osg::Vec3(0.0f, 0.0f, 0.0f));
vertices->push_back(osg::Vec3(size, 0.0f, 0.0f));
vertices->push_back(osg::Vec3(0.0f, size, 0.0f));
vertices->push_back(osg::Vec3(0.0f, 0.0f, size));
vertices->push_back(osg::Vec3(-size, 0.0f, 0.0f));
vertices->push_back(osg::Vec3(0.0f, -size, 0.0f));
vertices->push_back(osg::Vec3(0.0f, 0.0f, -size));
// Create a geometry object from the vertices
osg::Geometry* geometry = new osg::Geometry;
geometry->setVertexArray(vertices);
// Create a color array for the vertices
osg::Vec4Array* colors = new osg::Vec4Array;
colors->push_back(osg::Vec4(1.0f, 1.0f, 0.0f, 1.0f));
colors->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f));
colors->push_back(osg::Vec4(0.0f, 1.0f, 0.0f, 1.0f));
colors->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f));
colors->push_back(osg::Vec4(1.0f, 0.0f, 1.0f, 1.0f));
colors->push_back(osg::Vec4(0.0f, 1.0f, 1.0f, 1.0f));
colors->push_back(osg::Vec4(0.5f, 0.5f, 0.5f, 1.0f));
geometry->setColorArray(colors);
geometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
// Create triangle indices for the explosion geometry
osg::DrawElementsUInt* indices = new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 12);
(*indices)[0] = 0; (*indices)[1] = 1; (*indices)[2] = 3;
(*indices)[3] = 0; (*indices)[4] = 3; (*indices)[5] = 2;
(*indices)[6] = 0; (*indices)[7] = 2; (*indices)[8] = 5;
(*indices)[9] = 0; (*indices)[10] = 5; (*indices)[11] = 4;
// Add the indices to the geometry object
geometry->addPrimitiveSet(indices);
// Set the normal array for the geometry object
osg::Vec3Array* normals = new osg::Vec3Array;
normals->push_back(osg::Vec3(0.0f, 0.0f, 1.0f));
normals->push_back(osg::Vec3(1.0f, 0.0f, 0.0f));
normals->push_back(osg::Vec3(0.0f, 1.0f, 0.0f));
normals->push_back(osg::Vec3(-1.0f, 0.0f, 0.0f));
normals->push_back(osg::Vec3(0.0f, 0.0f, -1.0f));
normals->push_back(osg::Vec3(0.0f, -1.0f, 0.0f));
normals->push_back(osg::Vec3(0.0f, 0.0f, 1.0f));
geometry->setNormalArray(normals);
geometry->setNormalBinding(osg::Geometry::BIND_PER_VERTEX);
// Return the explosion geometry
return vertices;
}
阅读全文