查看: 2711|回复: 12

MFC下多相机是怎么实现的。。

[复制链接]

该用户从未签到

发表于 2010-4-14 10:57:40 | 显示全部楼层 |阅读模式
在控制台下,
#include <osg/Camera>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osg/BoundingSphere>
osg::Camera* createBirdsEye( const osg::BoundingSphere& bs )
{
osg::ref_ptr<osg::Camera> camera = new osg::Camera;
camera->setClearMask(/* GL_COLOR_BUFFER_BIT |*/ GL_DEPTH_BUFFER_BIT );
camera->setReferenceFrame( osg::Transform::ABSOLUTE_RF );

double viewDistance = 2.0 * bs.radius();
double znear = viewDistance - bs.radius();
double zfar = viewDistance + bs.radius();
float top = bs.radius();
float right = bs.radius();
camera->setProjectionMatrixAsOrtho( -right, right, -top, top, znear, zfar );
osg::Vec3d upDirection( 0.0,1.0,0.0 );
osg::Vec3d viewDirection( 0.0,0.0,1.0 );
osg::Vec3d center = bs.center();
osg::Vec3d eyePoint = center + viewDirection * viewDistance;;
camera->setViewMatrixAsLookAt( eyePoint, center, upDirection );

return camera.release();
}
int main( int argc, char** argv )
{
osg::ArgumentParser arguments( &argc, argv );
osg::Node* model = osgDB::readNodeFiles( arguments );
if ( !model ) model = osgDB::readNodeFile( "lz.osg" );
osg::ref_ptr<osg::Group>root=new osg::Group;//总根节点
osg::ref_ptr<osg::Group>root1=new osg::Group;//存场景放
root->addChild(root1);
root1->addChild(osgDB::readNodeFile("cow.osg"));
root1->addChild( model );
osg::Camera* camera = createBirdsEye(root1->getBound() );//俯视相机
root->addChild(camera);
camera->addChild(root1);
camera->setViewport(500.0f,400.0f,500,500.0f);
/*camera->setClearColor(osg::Vec4(0.0f,0.0f,0.0f,0.0f));*/
/*root->addChild(model);*/
osgViewer::Viewer viewer;
viewer.setSceneData( root );
return viewer.run();
}
这样就有个俯视图了,但是我现在想加入到MFC中,按照同样的方式,发现不可以。。

该用户从未签到

发表于 2010-4-14 11:04:43 | 显示全部楼层
有啥不可以的啊~~~

该用户从未签到

发表于 2010-4-14 12:33:38 | 显示全部楼层
  1. camera->setViewport(500.0f,400.0f,500,500.0f);
复制代码
注意判断一下,这一行中设置的视口是否能在MFC窗口中被显示出来

该用户从未签到

 楼主| 发表于 2010-4-14 17:20:13 | 显示全部楼层
现在在MFC上也出现了子摄像机,但是,它会受到我mViewer->setCameraManipulator(new CSouth() );操作器的影响,下面是我图形设备初始化的代码
void CoreOsg::InitCameraConfig()
{
        // 局部变量存放窗口矩形
        RECT rect;
        // 创建一个viewer
        mViewer = new osgViewer::Viewer();
        // 加入一个statshandler
        /*mViewer->addEventHandler(new osgViewer::StatsHandler);*/
        // 得到当前窗口矩形
        ::GetWindowRect(m_hWnd, &rect);
        // 初始化图形描述什么东西,反正就是那么回事
        osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
        // 初始化窗口变量,为OSG所用
        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;
        // 绑
        osg::ref_ptr<osg::Camera>camera1=new osg::Camera;//子摄像机
        camera->setGraphicsContext(gc);
        camera1->setGraphicsContext(gc);
        //相机视口设置
        camera->setViewport(new osg::Viewport(traits->x, traits->y, traits->width, traits->height));
        // 添加相机到VIEWER
        mViewer->addSlave(camera.get());
       
       
        // 添加操作器到VIEWER
        /*mViewer->setCameraManipulator(keyswitchManipulator.get());*/
        mViewer->setCameraManipulator(new CSouth() );
        mViewer->addEventHandler(new pick (mViewer));
        mViewer->addEventHandler(new AddDragger);
        //添加子摄像机
        BirdEye *bd=new BirdEye;       
        camera1->setViewport(200,200,500,500);
        camera1->setClearColor(osg::Vec4(0.0f,0.0f,0.0f,0.0f));
        camera1->addChild(osgDB::readNodeFile("fountain.osg"));
        mRoot->addChild(camera1);
        camera1=bd->creatBirdEye(camera1->getBound());
        mViewer->setSceneData(camera);       
        mViewer->realize();
}

该用户从未签到

 楼主| 发表于 2010-4-14 17:22:14 | 显示全部楼层
上边mViewer->setSceneData(camera);改为mViewer->setSceneData(mRoot);mRoot只是一个自己定义的根节点

该用户从未签到

发表于 2010-4-15 08:39:30 | 显示全部楼层
现在在MFC上也出现了子摄像机
如果可能的话,介绍一下您是如何实现子相机的,这样有助于您和其他朋友总结问题和提高。

使子相机不受到漫游器影响的方法是设置它的setAllowEventFocus(false)

该用户从未签到

 楼主| 发表于 2010-4-15 15:11:24 | 显示全部楼层
其实就是直接在渲染的那棵场景树中直接加了一个camera1(子相机),但是这样的话,按照阿ray的方法,还是不能使他不受漫游器的影响。。太郁闷了,下一步准备按照阿ray书上的单视图多相机例子去试验了。。自己胡想的方式行不同貌似。。

该用户从未签到

 楼主| 发表于 2010-4-15 15:29:14 | 显示全部楼层
还有就是阿ray你的单视图多相机的源码是什么名字了。。。

该用户从未签到

发表于 2010-4-15 17:04:21 | 显示全部楼层
但是这样的话,按照阿ray的方法,还是不能使他不受漫游器的影响
此外还需要设置相机setReferenceFrame(ABSOLUTE_RF)

该用户从未签到

 楼主| 发表于 2010-4-15 17:26:41 | 显示全部楼层
这个也必须设置了。。。因为都是看着你的书在学习。。。

该用户从未签到

 楼主| 发表于 2010-4-15 17:37:22 | 显示全部楼层
我只是在MFC下应用书上的例子,可能会有些程序上的错误也说不定,我现在找不到您的那个单视图多相机的源码。。我想在控制台程序下试试。。您能告诉我下源码名吗?Thanks.

该用户从未签到

发表于 2010-4-16 08:38:49 | 显示全部楼层
我现在找不到您的那个单视图多相机的源码
我不记得自己在书里专门写过这方面的例子。如果您想测试自己的程序有没有错误,那么最简单的方法是在控制台下把它重写一下,然后再进行讨论

该用户从未签到

发表于 2013-3-17 10:07:35 | 显示全部楼层
不知您的问题解决没???我遇到了和你一样的问题,就是鸟瞰图在控制台程序下有用,但移到mfc里面就没用了,不知道为什么。我实验得到的一点就是,在控制台程序中是直接把相机加到组节点中,但mfc中不能这样,必须加入到viewer中,问题就出现在这里,加入到viewer中不然就出错,不然就鸟瞰图没有,对比测试我还加了后视图,后视图又有用!实在不懂怎么弄了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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