直接上代码:
osg::ref_ptr<osg::Geode> createBox() {
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
osg::ref_ptr<osg::TessellationHints> hits = new osg::TessellationHints;
hits->setDetailRatio(0.5);
osg::ref_ptr<osg::Box> box = new osg::Box(osg::Vec3(0.0, 0.0, 0.0), 1.0, 1.0, 1.0);
osg::ref_ptr<osg::ShapeDrawable> shape = new osg::ShapeDrawable(box, hits);
//设置精度
shape->setTessellationHints(hits.get());
//设置颜色
shape->setColor(osg::Vec4(1.0, 1.0, 0.5, 0.5));
//设置材质
osg::ref_ptr<osg::Material> material = new osg::Material();
material->setAmbient(osg::Material::FRONT_AND_BACK, osg::Vec4(1.0, 1.0, 1.0, 0.5));//设置光照
material->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4(1.0, 1.0, 1.0, 0.5));//设置融合
material->setSpecular(osg::Material::FRONT_AND_BACK, osg::Vec4(1.0, 1.0, 1.0, 0.5));//设置镜面反射
material->setShininess(osg::Material::FRONT_AND_BACK, 20.0);
geode->getOrCreateStateSet()->setAttributeAndModes(material.get(), osg::StateAttribute::ON);
geode->getOrCreateStateSet()->setMode(GL_BLEND, osg::StateAttribute::ON);//设置透明度
//设置纹理
osg::ref_ptr<osg::Image> image = new osg::Image;
osg::ref_ptr<osg::Texture2D> texture2D = new osg::Texture2D;
image = osgDB::readImageFile("Images/skymap.jpg");
if (image.valid()){
texture2D->setImage(image);
}
geode->getOrCreateStateSet()->setTextureAttributeAndModes(0, texture2D.get(), osg::StateAttribute::ON);
//geode->getOrCreateStateSet()->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON);//打开深度测试
geode->addDrawable(shape.get());
return geode;
}
int main(int argc, char** argv) {
for (int i = 0; i < argc; i++) {
printf(argv[i]);
printf("\n");
}
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
viewer->addEventHandler(new osgViewer::WindowSizeHandler);
viewer->addEventHandler(new osgViewer::StatsHandler);
osg::ref_ptr<osg::Group> root = new osg::Group;
root->addChild(osgDB::readNodeFile("xyz.osgt"));
root->addChild(createBox());
viewer->setSceneData(root);
viewer->realize();
viewer->run();
return 0;
}
运行结果: