osgUtil.SceneView
是OpenSceneGraph
中的一个非常重要的类。它实现了一个可视化场景视图,并用于渲染和交互。本文档介绍了osgUtil.SceneView
的使用方法。
osgUtil.SceneView
是一个osgViewer.Viewer
的子类。我们可以创建一个新的SceneView
实例,并将其与我们的场景数据结构一起使用。
#include<osgUtil/SceneView>
#include<osgDB/ReadFile>
#include<osgViewer/Viewer>
int main(int argc, char** argv)
{
osgViewer::Viewer viewer;
osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("cow.osg");
osg::ref_ptr<osgUtil::SceneView> sceneView = new osgUtil::SceneView();
sceneView->setSceneData(model);
viewer.setSceneData(sceneView);
viewer.realize();
return viewer.run();
}
osgUtil.SceneView
负责渲染视图,其中最重要的是render
方法。render
方法必须在主线程中调用。以下是一个简单的例子:
// create SceneView object ...
osgUtil::SceneView sceneView;
// ... Configured sceneView
// render sceneView
if(sceneView.getCamera())
{
sceneView.getCamera()->setAllowEventFocus(true); // Optionally add interactivity to the scene
sceneView.getCamera()->setGraphicsContext(viewer->getCamera()->getGraphicsContext());
sceneView.render();
}
我们可以在执行渲染操作之前对osgUtil.SceneView
进行一些基础设置。
osg::ref_ptr<osgUtil::SceneView> sceneView = new osgUtil::SceneView();
sceneView->setSceneData(model);
sceneView->setUpViewInWindow(0, 0, 800, 600);
// Set the projection matrix and view matrix of the SceneView Camera
sceneView->getCamera()->setProjectionMatrixAsPerspective(30.0f, 1.0f, 1.0f, 1000.0f);
sceneView->getCamera()->setViewMatrix(osg::Matrix::lookAt(osg::Vec3(0, 0, 10), osg::Vec3(0, 0, 0), osg::Vec3(0, 1, 0)));
osgUtil.SceneView
可以通过osgViewer.Viewer
的setUpViewer()
方法附加到一个显示窗口。以下是一个简单的示例:
#include <osgViewer/Viewer>
#include <osgUtil/SceneView>
int main(int argc, char** argv)
{
osg::ArgumentParser arguments(&argc, argv);
osg::ref_ptr<osg::Node> model = osgDB::readNodeFiles(arguments);
// ** CREATE SCENE VIEW **
osg::ref_ptr<osgUtil::SceneView> sceneView = new osgUtil::SceneView();
// ** SET SCENE DATA **
sceneView->setSceneData(model.get());
// ** CONFIGURE SCENE VIEW DETAIL **
sceneView->setUpViewInWindow(0, 0, 640, 480);
sceneView->getCamera()->setProjectionMatrixAsPerspective(30.0f, 1.0f, 1.0f, 1000.0f);
sceneView->getCamera()->setViewMatrix(osg::Matrix::lookAt(osg::Vec3(0, 0, 10), osg::Vec3(0, 0, 0), osg::Vec3(0, 1, 0)));
// ** ADD SCENE VIEW TO VIEWER **
osgViewer::Viewer viewer;
viewer.setSceneData(sceneView);
viewer.run();
return 0;
}
osgUtil.SceneView
为我们提供了一个实现场景渲染操作的便捷接口。我们可以使用osgUtil.SceneView
渲染任意的OpenSceneGraph
场景,并可以应用一系列的效果。此文档仅仅是一个简要介绍,更多高级的场景操作可以参考OpenSceneGraph
官方文档。