查看: 1733|回复: 8

关于模型加载却不显示的问题

[复制链接]

该用户从未签到

发表于 2011-3-4 09:05:48 | 显示全部楼层 |阅读模式
大家好,
我有个问题,麻烦高人帮我看看。
我在Viewer里面用一个图像作为背景,然后加载一个IVE模型,想让模型显示在背景之前的。代码如下:
  1. -(osg::Node *) create2DBGTexture
  2. {
  3.    unsigned int w = 480;
  4.    unsigned int h = 320;
  5.    
  6.    float vx = (float)w;
  7.    float vy = (float)h;
  8.    
  9.    osg::ref_ptr<osg::Geometry> rectBG_geom = new osg::Geometry;
  10.    
  11.    osg::Vec3Array * vertices = new osg::Vec3Array;
  12.    vertices->push_back(osg::Vec3(0.0, 0.0, -1.0));
  13.     vertices->push_back(osg::Vec3(0.0, vy, -1.0));
  14.     vertices->push_back(osg::Vec3(vx, vy, -1.0));
  15.     vertices->push_back(osg::Vec3(vx, 0.0, -1.0));
  16.     rectBG_geom->setVertexArray(vertices);
  17.    
  18.     osg::Vec2Array * texcoords = new osg::Vec2Array;
  19.     texcoords->push_back(osg::Vec2(0.0, 0.0625));
  20.     texcoords->push_back(osg::Vec2(0.0, 0.9375));
  21.     texcoords->push_back(osg::Vec2(1.0, 0.9375));
  22.     texcoords->push_back(osg::Vec2(1.0, 0.0625));
  23.     rectBG_geom->setTexCoordArray(0,texcoords);
  24.    
  25.     osg::Vec3Array * normals = new osg::Vec3Array;
  26.     normals->push_back(osg::Vec3(0.0f,0.0f,1.0f));
  27.     rectBG_geom->setNormalArray(normals);
  28.     rectBG_geom->setNormalBinding(osg::Geometry::BIND_OVERALL);

  29.    rectBG_geom->addPrimitiveSet(new osg::DrawArrays(GL_QUADS,0,4));
  30.    
  31.    BG_image = new osg::Image;
  32.    BG_image->setImage(AVWidth, AVHeight, 1, GL_RGBA, GL_BGRA, GL_UNSIGNED_BYTE, pAVImage, osg::Image::NO_DELETE);
  33.    
  34.     BG_texture = new osg::Texture2D;
  35.     BG_texture->setDataVariance(osg::Object::DYNAMIC);
  36.    BG_texture->setImage(BG_image);
  37.    BG_texture->setResizeNonPowerOfTwoHint(false);
  38.    BG_texture->setFilter(osg::Texture2D::MIN_FILTER, osg::Texture2D::NEAREST);
  39.    BG_texture->setFilter(osg::Texture2D::MAG_FILTER, osg::Texture2D::NEAREST);

  40.    osg::StateSet* stateset = rectBG_geom->getOrCreateStateSet();
  41.     stateset->setTextureAttributeAndModes(0,BG_texture,osg::StateAttribute::ON);
  42.    
  43.    osg::Geode * BG_geode = new osg::Geode;
  44.     BG_geode->addDrawable(rectBG_geom);
  45.    
  46.    return BG_geode;
  47. }

  48. -(int)   initOsgTree
  49. {
  50.    int dwError = 0;
  51.    
  52.    osg::setNotifyLevel(osg::DEBUG_INFO);
  53.    
  54.    // camera
  55.    unsigned int w = 480;
  56.    unsigned int h = 320;
  57.    
  58.    //create and attach ortho camera for hud text
  59.    osg::ref_ptr<osg::Camera> hudCamera = new osg::Camera;
  60.    hudCamera->setProjectionMatrix(osg::Matrix::ortho2D(0,w,0,h));
  61.    hudCamera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
  62.    hudCamera->setViewMatrix(osg::Matrix::identity());
  63.    hudCamera->setClearMask(GL_DEPTH_BUFFER_BIT);
  64.    hudCamera->setRenderOrder(osg::Camera::POST_RENDER);
  65.    
  66.    ModelMatrix = new osg::MatrixTransform();
  67.    osg::ref_ptr<osg::Node> model = (osgDB::readNodeFile("myModel.IVE"));
  68.    ModelMatrix->addChild(model);
  69.    osg::Matrix m;
  70.    m.makeTranslate(osg::Vec3(0.0, 0.0, 10.0));
  71.    ModelMatrix->setMatrix(m);
  72.    
  73.    osg::ref_ptr<osg::Group> MARRoot = new osg::Group;
  74.     MARRoot->getOrCreateStateSet()->setMode(GL_LIGHTING,osg::StateAttribute::OFF);
  75.    hudCamera->addChild([self create2DBGTexture]);
  76.    MARRoot->addChild(hudCamera.get());
  77.    MARRoot->addChild(ModelMatrix.get());
  78.    
  79.    // viewer
  80.    MARViewer = new osgViewer::Viewer();
  81.    MARViewer->setSceneData(MARRoot.get());
  82.    MARViewer->setCameraManipulator(new osgGA::MultiTouchTrackballManipulator);
  83.    MARViewer->realize();
  84.    MARViewer->frame();
  85.    
  86.    return dwError;
  87. }
复制代码
很奇怪的是,程序运行起来后,竟然看不到模型,但如果把背景注释掉,能看到模型被正确加载。
1。 请帮忙看看怎么才能正确地显示模型和背景啊?我的Viewer是X-Y平面的,背景的Z坐标是-1,模型Z坐标是10,这样应该能让我的模型在前显示吧?
2。 MARViewer->setCameraManipulator(new osgGA::MultiTouchTrackballManipulator);这一句如果被注释掉,连模型也没有了,这句有必要么?我看好多例子里面也没有这句啊?

请各位不吝赐教,谢谢了!!

该用户从未签到

发表于 2011-3-4 10:03:46 | 显示全部楼层
背景是加到了hud上,遮挡了模型的显示,而事实上你的模型已经正确加载到场景中了,可以将背景alpha设置低一些

该用户从未签到

 楼主| 发表于 2011-3-4 10:24:27 | 显示全部楼层
谢谢。
但是背景为什么要设置alpha值呢,这样是不是背景就变透明了?可我需要不透明的啊。
如果把模型也加到hud里面呢?我试了一下,还是看不到模型,是不是我的坐标有问题?!!

该用户从未签到

发表于 2011-3-4 10:53:43 | 显示全部楼层
hudCamera被设置为POST_RENDER,也就是说,它的内容总是在主场景绘制之后再进行绘制;由于清除了深度缓存,因此OpenGL总是将新的内容直接刷新到FrameBuffer中,您的深度设置在这种时候没有任何意义

setCameraManipulator设置了您的场景漫游器,它会自动在场景初始化时将视点设置在合适的位置,并且允许用户交互地进行观览。没有这句的话您的视点将位于OpenGL默认的原点和Z-方向

该用户从未签到

 楼主| 发表于 2011-3-4 11:22:30 | 显示全部楼层
谢谢,array,我明白了!
其实我之前是在用opneGL来写程序,现在要用osg来实现以前的工作,所以有点头晕

我原来的opengl伪代码是这个样子的:
  1.     glMatrixMode(GL_MODELVIEW);
  2.     glLoadIdentity();
  3.     glMatrixMode(GL_PROJECTION);
  4.     glLoadIdentity();
  5.     glOrtho(0, w, 0, h, -1, 1);
  6.     glViewPort(0, 0,w,h)
  7.     映射二维图像做背景。。。

  8.     glMatrixMode(GL_MODELVIEW);
  9.     glLoadIdentity();
  10.     glMatrixMode(GL_PROJECTION);
  11.     glLoadMatrix(camerMatrix);
  12.     glClearDepth( 1.0 );
  13.     glClear(GL_DEPTH_BUFFER_BIT);
  14.     glDepthFunc(GL_LEQUAL);
  15.     glMatrixMode(GL_MODELVIEW);
  16.     glLoadMatrixd( gl_para );
  17.     绘制三维模型
复制代码
这样我该如何修改啊,是需要在每次场景帧刷新之前,都需要调用hudcamera->setProjectionMatrix两次,一次设置osg::Matrix:rtho2D(0,w,0,h),一次设置相机的投影矩阵么?
或者还是需要做其他的修改?
麻烦您指教一下,小弟新手,还菜的很...

该用户从未签到

 楼主| 发表于 2011-3-4 11:28:55 | 显示全部楼层
。。。是不是需要两个hudcamera?一个绘制背景,一个绘制模型?

该用户从未签到

发表于 2011-3-4 13:15:58 | 显示全部楼层
可以使用两个相机(不需要hud),也可以考虑用深度测试的方法,只保留hud相机中深度在远平面上内容

该用户从未签到

 楼主| 发表于 2011-3-4 17:35:51 | 显示全部楼层
感谢array,但我试了一下午,还是不得要领。如果我用两个camera,是不是应当参考osgCamera里面的一个窗口多个摄像机的例子?但是我照它实现后,根本没有渲染效果啊
能否麻烦您照五楼的opengl实现,给我一个简单的代码例子让我参考一下,或者有其他的例子参考也可以,麻烦您了,谢谢!

该用户从未签到

发表于 2011-3-7 08:36:09 | 显示全部楼层
也许您可以先看一下osgEarth中Skynode(星空)的实现,我个人暂时没有时间单独编写这样的例子
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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