查看: 2020|回复: 3

求助关于一个鹰眼图的例子

[复制链接]

该用户从未签到

发表于 2009-6-7 19:58:05 | 显示全部楼层 |阅读模式
我画了一个矩形 并用纹理贴上一个场景俯视图 最后用从相机使它显示在屏幕左下角。
然后我想在这个俯视图里标记出当前视点的位置 也就是鹰眼的的一种实现。

我用的方法是 就是添加一个子相机 往里添加了一个PositionAttitudeTransform节点来标记视点位置的。昨天我写的例子里从摄像机没使用贴图而使用采用俯视能看到视点的位置的。而将它改为纹理贴图的方式就无法显看到那个视点的位置了

我认为应该是被那个从摄像机给覆盖的缘故 请问该如何修改?

我写的代码如下:
  1. osg::Camera* createSkyLook()
  2. {
  3.         osg::Camera* camera = new osg::Camera;
  4.         camera->setClearColor(osg::Vec4(0.1f,0.1f,0.3f,1.0f));
  5.          camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
  6.          camera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  7.          camera->setRenderOrder(osg::Camera::POST_RENDER);
  8.         camera->setProjectionMatrix(osg::Matrix::ortho2D(-128,128,-128,128));
  9.         camera->setViewport(0,0,256,256);
  10.         //以下是画一个矩形 并贴上俯视图
  11.         osg::ref_ptr<osg::Geode> upGeode=new osg::Geode;
  12.         camera->addChild(upGeode.get());
  13.         osg::ref_ptr<osg::Geometry> backGeom=new osg::Geometry;
  14.         upGeode->addDrawable(backGeom.get());

  15.         osg::Vec3Array* vert=new osg::Vec3Array;
  16.         vert->push_back(osg::Vec3(-128.,-128.,0.));
  17.         vert->push_back(osg::Vec3(128.,-128.,0.));
  18.         vert->push_back(osg::Vec3(128.,128.,0.));
  19.         vert->push_back(osg::Vec3(-128.,128.,0.));
  20.         backGeom->setVertexArray(vert);

  21.         osg::Vec4Array* color=new osg::Vec4Array;
  22.         backGeom->setColorBinding(osg::Geometry::BIND_OVERALL);
  23.         backGeom->setColorArray(color);
  24.         color->push_back(osg::Vec4(1.0,1.0,1.0,1.0));

  25.         osg::Vec3Array* normal=new osg::Vec3Array;
  26.         backGeom->setNormalBinding(osg::Geometry::BIND_OVERALL);
  27.         backGeom->setNormalArray(normal);
  28.         normal->push_back(osg::Vec3(0.,1.,0.0));

  29.         backGeom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS, 0, 4 ));
  30.          osg::Vec2Array* texcoords = new osg::Vec2Array(4);
  31.          (*texcoords)[0].set(0.0f,0.0f);
  32.          (*texcoords)[1].set(1.0f,0.0f);
  33.          (*texcoords)[2].set(1.0f,1.0f);
  34.          (*texcoords)[3].set(0.0f,1.0f);
  35.          backGeom->setTexCoordArray(0,texcoords);
  36.          backGeom->setDataVariance(osg::Object::DYNAMIC);
  37.         osg::Texture2D* texture=new osg::Texture2D();
  38.         texture->setDataVariance(osg::Object::DYNAMIC);
  39.         texture->setImage(osgDB::readImageFile("a.bmp"));
  40.         osg::StateSet* state=backGeom->getOrCreateStateSet();
  41.         state->setRenderBinDetails(11,"DepthSortedBin");
  42.         state->setMode(GL_LIGHTING,osg::StateAttribute::OFF);
  43.         state->setMode(GL_BLEND,osg::StateAttribute::ON);
  44.         state->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF);
  45.         state->setRenderingHint( osg::StateSet::TRANSPARENT_BIN );
  46.         state->setTextureAttributeAndModes(0,texture,osg::StateAttribute::ON);
  47.         return camera;
  48. }
  49. osg::Camera* createHUD2()
  50. {
  51.         osg::Camera* camera = new osg::Camera;

  52.         camera->setProjectionMatrix(osg::Matrix::ortho2D(-5,5,-4,4));
  53.          camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);

  54.          camera->setClearMask(GL_DEPTH_BUFFER_BIT);
  55.          camera->setRenderOrder(osg::Camera::POST_RENDER);
  56.         camera->setViewport(0,0,256,256);

  57.     return camera;
  58. }
  59. int main()
  60. {
  61.         //root是小场景
  62.         osg::ref_ptr<osg::Group> root=create();
  63.         osgViewer::Viewer viewer;

  64.         viewer.setUpViewAcrossAllScreens();
  65.         osgViewer::Viewer::Windows windows;

  66.         osg::ref_ptr<PlayerState> player = new PlayerState(osg::Vec3(0,0,0));

  67.         //这个是我写的漫游控制器
  68.         WalkManipulator* walk=new WalkManipulator(player.get());
  69.         viewer.setCameraManipulator(walk);

  70.         viewer.setSceneData(root.get());
  71.         //加入从相机 显示俯视图
  72.         osg::Camera* skyup=createSkyLook();
  73.         viewer.getWindows(windows);
  74.         skyup->setGraphicsContext(windows[0]);
  75.         viewer.addSlave(skyup, false);

  76.         osg::ref_ptr<osg::Camera>  node=createHUD2();
  77.         osg::ref_ptr<osg::PositionAttitudeTransform> pat = new osg::PositionAttitudeTransform;
  78.         osg::ref_ptr<osg::Geode> subgeode = dynamic_cast<osg::Geode*>( osgDB::readNodeFile( "Simple.osg"));
  79.         pat->addChild( subgeode.get() );
  80.         PlayerCallback* cal=new PlayerCallback(player.get(), pat.get());
  81.         pat->setEventCallback( cal );
  82.          node->addChild(pat.get());
  83.         //加入一个子相机
  84.         root->addChild( node.get());
  85.         while(!viewer.done())
  86.         {
  87.                 viewer.frame();
  88.         }
  89. }
复制代码

[ 本帖最后由 acmiyou 于 2009-6-7 20:25 编辑 ]

该用户从未签到

发表于 2009-6-7 20:09:02 | 显示全部楼层
“将它改为纹理贴图的方式”,您的代码中有这样的体现吗?
建议不要使用addSlave来添加子摄像机,这个函数更多地用在多屏幕的场合;用addChild或者复合视景器都是可以的

该用户从未签到

 楼主| 发表于 2009-6-7 20:13:57 | 显示全部楼层
原帖由 array 于 2009-6-7 20:09 发表
“将它改为纹理贴图的方式”,您的代码中有这样的体现吗?
建议不要使用addSlave来添加子摄像机,这个函数更多地用在多屏幕的场合;用addChild或者复合视景器都是可以的


         backGeom->setDataVariance(osg::Object:YNAMIC);
        osg::Texture2D* texture=new osg::Texture2D();
        texture->setDataVariance(osg::Object::DYNAMIC);
        texture->setImage(osgDB::readImageFile("a.bmp"));
        osg::StateSet* state=backGeom->getOrCreateStateSet();
        state->setRenderBinDetails(11,"DepthSortedBin");
        state->setMode(GL_LIGHTING,osg::StateAttribute::OFF);
        state->setMode(GL_BLEND,osg::StateAttribute::ON);
        state->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF);
        state->setRenderingHint( osg::StateSet::TRANSPARENT_BIN );
        state->setTextureAttributeAndModes(0,texture,osg::StateAttribute::ON);
这个是我设置的一个纹理 将a.bmp 贴到那个矩形上的

该用户从未签到

 楼主| 发表于 2009-6-7 20:38:21 | 显示全部楼层
谢谢 array老师 将两个相机都使用addChild 设置成子摄像机 就OK了  解决了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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