osgViewer.View
是OpenSceneGraph中的一个核心类,它允许用户创建和控制OpenGL视口,用于渲染场景图。
创建一个视口,需要指定宽度(width
)和高度(height
),还可以通过设置视口的名称(name
)来标识它。例如:
osg::ref_ptr<osgViewer::View> view = new osgViewer::View;
view->setUpViewInWindow(100, 100, 800, 600);
view->setName("My View");
设置视口的相机(camera
),通常是将场景图的根节点(root
)添加到相机的子节点中,并为相机设置透视投影(setProjectionMatrixAsPerspective
)和视点(setViewMatrix
)。例如:
osg::ref_ptr<osg::Node> root = osgDB::readNodeFile("my_scene.osg");
osg::ref_ptr<osg::Camera> camera = view->getCamera();
camera->addChild(root);
camera->setProjectionMatrixAsPerspective(60.0, 800.0/600.0, 0.1, 100.0);
camera->setViewMatrix(osg::Matrix::lookAt(osg::Vec3d(0,0,5), osg::Vec3d(0,0,0), osg::Vec3d(0,1,0)));
将视口添加到OSG Viewer中(osgViewer::Viewer::addView
),并运行主循环(osgViewer::Viewer::run
)。例如:
osgViewer::Viewer viewer;
viewer.addView(view);
return viewer.run();
视口的剪裁平面(setCullingMode
)可用于控制哪些场景元素将被渲染。有三种模式可供选择:CullingDisabled
(不剪裁)、FrustumCulling
(剪裁)和ShadowCasting
(剪裁+阴影投射)。例如:
view->setCullingMode(osg::CullingSet::FrustumCulling);
可以创建子视口(addSlave
)来实现多屏渲染、立体立体视和视锥体剖分等功能。例如,以下代码创建了一个双视口渲染窗口:
osg::ref_ptr<osgViewer::View> leftView = new osgViewer::View;
leftView->setUpViewInWindow(100, 100, 400, 600);
osg::ref_ptr<osgViewer::View> rightView = new osgViewer::View;
rightView->setUpViewInWindow(500, 100, 400, 600);
view->addSlave(leftView, osg::Matrixd(), osg::Matrixd::scale(0.5,1,1));
view->addSlave(rightView, osg::Matrixd::translate(400,0,0), osg::Matrixd::scale(0.5,1,1));
可以通过视口的状态(getState()->
)来获取和设置OpenGL状态。例如,以下代码调整了视口的深度测试函数:
view->getState()->setDepthFunction(osg::StateAttribute::LEQUAL);
可以通过addEventHandler
方法向视口添加事件处理器。例如,以下代码在视口中添加一个控制相机的事件处理器:
osg::ref_ptr<osgGA::TrackballManipulator> manipulator = new osgGA::TrackballManipulator;
view->addEventHandler(new osgGA::StateSetManipulator(view->getCamera()->getOrCreateStateSet()));
view->setCameraManipulator(manipulator);