查看: 1793|回复: 4

cameraManipulator请教!

[复制链接]

该用户从未签到

发表于 2013-3-15 23:05:43 | 显示全部楼层 |阅读模式
cameraManipulator请教!
应用MFC框架建立一个读取地球模型的程序,程序中应用了:
//建立窗口参数
    RECT rect;
    mViewer->addEventHandler(new osgViewer::StatsHandler);
    ::GetWindowRect(m_hWnd, &rect);
    osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
    osg::ref_ptr<osg::Referenced> windata = new osgViewer::GraphicsWindowWin32::WindowData(m_hWnd);
    traits->x = 0; traits->y = 0;
    traits->width = rect.right - rect.left;traits->height = rect.bottom - rect.top;
    traits->windowDecoration = false;traits->doubleBuffer = true;
    traits->sharedContext = 0;traits->setInheritedWindowPixelFormat = true; traits->inheritedWindowData = windata;
   
    //设置相机和视图
    osg::GraphicsContext* gc = osg::GraphicsContext::createGraphicsContext(traits.get());
    osg::ref_ptr<osg::Camera> camera = new osg::Camera;
    camera->setGraphicsContext(gc);
    camera->setViewport(new osg::Viewport(traits->x, traits->y, traits->width, traits->height));
    camera->setClearMask(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
    camera->setClearColor(osg::Vec4f(0.0f, 0.0f, 0.0f, 1.0f));
    camera->setProjectionMatrixAsPerspective(80.0f, static_cast<double>(traits->width)/static_cast<double>(traits->height), 1.0, 1000.0);
    mViewer->setCamera(camera.get());
    //对视点进行控制
       
       
        //设置初始
        m_earthManipulator->setHomeViewpoint(Viewpoint( osg::Vec3d( 0, 0, 0 ), 0.0, -90.0, 5e6 ) );
       
        //m_earthManipulator
        mViewer->setCameraManipulator(m_earthManipulator);
        //mViewer->setCameraManipulator( keyswitchManipulator );
        //加入根结点
    mViewer->setSceneData(mRoot.get());
    mViewer->realize();

        // 修正视口比率
    double fovy,aspectRatio,z1,z2;
    mViewer->getCamera()->getProjectionMatrixAsPerspective(fovy,aspectRatio,z1,z2);
    aspectRatio=double(traits->width)/double(traits->height);
    mViewer->getCamera()->setProjectionMatrixAsPerspective(fovy,aspectRatio,z1,z2);

生成结果如下:
mfc.jpg

同样的my.earth文件,应用osgearth_viewer来读取,结果如下:
osgviewer.jpg

现在存在一个困惑:
MFC中,太阳发生了变形。而osgearth_viewer中太阳不会发生变形。通过操作发现,鼠标滚轮操作放大或者缩小场景(前移视点或者后退视点),MFC中太阳和整个星空背景、地球都会放大或缩小。而osgearth_viewer中鼠标滚轮操作放大或者缩小场景(前移视点或者后退视点)时,只有地球会放大或缩小,而太阳与整个星空背景不会发生任何移动。
请教array等高手给解答一下,谢谢!

该用户从未签到

 楼主| 发表于 2013-3-16 00:02:12 | 显示全部楼层
好像是camera->setProjectionMatrixAsPerspective(80.0f, static_cast<double>(traits->width)/static_cast<double>(traits->height), 1.0, 1000.0);语句影响了,去掉就没事了,但是又存在一个问题,如下图:
sss.jpg
初始视点需要地球处于比较远的位置,而图中地球的LOD采用比较低的效果,地球周边只采用了极少的多边形,出现很明显的棱角。
请问array,可以人为设置视点比较远时,my.earth中地球还能保持比较细节的层次吗?

该用户从未签到

发表于 2013-3-18 10:51:38 | 显示全部楼层
应该可以自己配置LOD的范围吧

该用户从未签到

发表于 2013-3-18 16:28:47 | 显示全部楼层
setLODScale是可以的,值越小则精细层次在更远的地方也能看到

该用户从未签到

 楼主| 发表于 2013-3-27 07:02:24 | 显示全部楼层
thanks
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表