1.osg中设置抗锯齿的方法
osg:DisplaySettings* ds = osg:DisplaySettings::instance(); ds->setNumMultiSamples(16); mViewer->setDisplaySettings(ds);
这段代码在osgviewerMFC 下不起作用,
直接设置 traits->samples=16;
在窗口初始化时设置 traits->samples=16;
并对根节点进行了如下设置
osg::Multisample* pms=new osg::Multisample; pms->setSampleCoverage(1,true); mRoot->getOrCreateStateSet()->setAttributeAndModes(pms,osg::StateAttribute::ON);那么mRoot节点下的孩子都有抗锯齿的效果,包括导入的osg模型。
开始仿真循环之前用DisplaySettings::instance()->setNumMultiSamples()
2.裁剪面的问题
osg中默认情况下是自动计算裁剪面的,就是说setProjectionMatrixAsPerspective函数中最后设置两个参数是无效的,除非使用Camera类中的setComputeNearFarMode函数设置不自动计算
viewer.getCamera()->setComputeNearFarMode(osg::Camera:DO_NOT_COMPUTE_NEAR_FAR);使用这行代码后setProjectionMatrixAsPerspective中最后设置的两个参数才会生效
当不使用自动计算裁剪面而是自己手动设置时
setNearFarRatio()可以解决近裁剪面过远的问题
再通过设定相机的setComputeNearFarMode(COMPUTE_NEAR_FAR_USING_PRIMITIVES)解决了抖动问题(即Z-fighting)。
3.鼠标滚轮消息
case(osgGA::GUIEventAdapter::SCROLL): { switch(ea.getScrollingMotion()) { case(osgGA::GUIEventAdapter::SCROLL_UP): { return true; } case(osgGA::GUIEventAdapter::SCROLL_DOWN): { m_vDistance-=osg::Vec3(0.0f,0.0f,100.0f); return true; } default: break; } returnfalse; }
4.将自定义漫游器TravelManipulator添加到集成OSG的MFC工程时程序退出时可能会出错,但是在控制台下使用漫游器却没有问题,这是由于集成OSG的MFC工程的例子中m_viewer没有使用智能指针而是使用一般的C++指针。
在头文件中将osgViewer::Viewer*m_viewer;
改成 osg::ref_ptr<osgViewer::Viewer>m_viewer;
并在CoreOSG的析构函数中将delete m_viewer;这行代码注释掉即可。OSG中最好都是用智能指针,不要使用C++的指针,可以避免很多这种问题。
5.基于MFC的osg工程好像不能在按钮响应事件中给场景中已经存在的节点添加更新回调。只有在往场景中添加节点(无论是动态还是静态)时才可以添加更新回调,但可以通过一个控制量来让更新回调不立即起作用而在合适的地方起作用。其他回调类型没有测试过,但是需要注意这个问题。