OpenSceneGraph的核心API简介如下:
osg::Node 是OpenSceneGraph中的基础节点,表示3D场景中的任何物体。
osg::ref_ptr<osg::Node> node = new osg::Node();
osg::Group 继承自 osg::Node,可以包含其他节点,用于组织场景中的对象。
osg::ref_ptr<osg::Group> group = new osg::Group();
osg::ref_ptr<osg::Node> node1 = new osg::Node();
osg::ref_ptr<osg::Node> node2 = new osg::Node();
group->addChild(node1);
group->addChild(node2);
osg::Geode 继承自 osg::Node,可以包含几何体( osg::Geometry)和材质( osg::StateSet)等信息。
osg::ref_ptr<osg::Geode> geode = new osg::Geode();
osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry();
geode->addDrawable(geometry);
osg::Camera 继承自 osg::Group,用于表示3D场景中的相机。相机可以设置视角、投影矩阵等参数。
osg::ref_ptr<osg::Camera> camera = new osg::Camera();
camera->setViewport(new osg::Viewport(0, 0, 800, 600));
camera->setProjectionMatrixAsPerspective(30.0f, 800.0f/600.0f, 1.0f, 1000.0f);
osgViewer::Viewer 是OpenSceneGraph中的一个渲染器,用于显示场景。
osgViewer::Viewer viewer;
viewer.setSceneData(node);
viewer.run();
osgDB::readNodeFile 可以从文件中读取节点,支持多种文件格式(如 .osg, .obj, .fbx 等)。
osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("model.osg");
osg::Shape 是几何体的基类,可以创建多种几何体。
osg::ref_ptr<osg::Sphere> sphere = new osg::Sphere(osg::Vec3(0.0f, 0.0f, 0.0f), 1.0f);
osg::ref_ptr<osg::ShapeDrawable> drawable = new osg::ShapeDrawable(sphere);
osg::ref_ptr<osg::Geode> geode = new osg::Geode();
geode->addDrawable(drawable);
osg::StateSet 是材质和渲染状态的集合,可以为节点设置颜色、纹理、光照等属性。
osg::ref_ptr<osg::Material> material = new osg::Material();
material->setDiffuse(osg::Material::FRONT, osg::Vec4(1.0f, 0.0f, 0.0f,1.0f));
osg::ref_ptrosg::StateSet stateset = new osg::StateSet();
stateset->setAttribute(material);
geode->setStateSet(stateset);
osg::Texture2D
可以加载2D纹理图像,并为节点设置纹理。
osg::ref_ptr<osg::Image> image = osgDB::readImageFile("texture.png");
osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D(image);
osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet();
stateset->setTextureAttributeAndModes(0, texture);
geode->setStateSet(stateset);
osg::PositionAttitudeTransform 可以设置节点的位置和旋转角度。
osg::ref_ptr<osg::PositionAttitudeTransform> transform = new osg::PositionAttitudeTransform();
transform->setPosition(osg::Vec3(0.0f, 0.0f, -10.0f));
transform->setAttitude(osg::Quat(osg::DegreesToRadians(30.0f), osg::Vec3(1.0f, 0.0f, 0.0f)));
transform->addChild(node);
osg::AnimationPath 可以创建节点的运动路径,用于实现动画效果。
osg::ref_ptr<osg::AnimationPath> path = new osg::AnimationPath();
path->insert(0.0f, osg::AnimationPath::ControlPoint(osg::Vec3(0.0f, 0.0f, 0.0f)));
path->insert(1.0f, osg::AnimationPath::ControlPoint(osg::Vec3(0.0f, 0.0f, -10.0f)));
osg::ref_ptr<osg::AnimationPathCallback> callback = new osg::AnimationPathCallback(path);
transform->setUpdateCallback(callback);
以下是一个简单的示例代码,展示如何创建一个场景,包含一个球体、一个材质和一个相机:
#include <osgViewer/Viewer>
#include <osg/ShapeDrawable>
#include <osg/Material>
#include <osgDB/ReadFile>
int main(int argc, char** argv)
{
// 创建球体
osg::ref_ptr<osg::Sphere> sphere = new osg::Sphere(osg::Vec3(0.0f, 0.0f, 0.0f), 1.0f);
osg::ref_ptr<osg::ShapeDrawable> drawable = new osg::ShapeDrawable(sphere);
osg::ref_ptr<osg::Geode> geode = new osg::Geode();
geode->addDrawable(drawable);
// 创建材质
osg::ref_ptr<osg::Material> material = new osg::Material();
material->setDiffuse(osg::Material::FRONT, osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f));
osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet();
stateset->setAttribute(material);
geode->setStateSet(stateset);
// 创建相机
osg::ref_ptr<osg::Camera> camera = new osg::Camera();
camera->setViewport(new osg::osg::Viewport(0, 0, 640, 480));
camera->setClearColor(osg::Vec4(0.2f, 0.2f, 0.2f, 1.0f));
camera->setProjectionMatrixAsPerspective(45.0f, 640.0f / 480.0f, 0.1f, 1000.0f);
camera->setViewMatrix(osg::Matrix::lookAt(osg::Vec3(0.0f, 0.0f, 10.0f), osg::Vec3(0.0f, 0.0f, 0.0f), osg::Vec3(0.0f, 1.0f, 0.0f)));
camera->addChild(geode);
rust
Copy code
// 创建场景图
osg::ref_ptr<osg::Group> root = new osg::Group();
root->addChild(camera);
// 创建视图器
osgViewer::Viewer viewer;
viewer.setSceneData(root);
viewer.run();
return 0;
}
该示例代码创建了一个场景,包含一个球体、一个材质和一个相机。该场景被渲染到屏幕上,并且可以用鼠标和键