查看: 2673|回复: 6

请教:智能指针不能转化为普通指针的原因

[复制链接]

该用户从未签到

发表于 2011-4-25 15:10:49 | 显示全部楼层 |阅读模式
编译错误:
错误 32 error C2664: “osg::Group::addChild”: 不能将参数 1 从“osg::ref_ptr<T>”转换为“osg::Node *”

该用户从未签到

发表于 2011-4-25 17:06:04 | 显示全部楼层
不能直接转把,应该用.get()得到

该用户从未签到

发表于 2011-4-27 08:54:21 | 显示全部楼层
使用Node.get()方法得到

该用户从未签到

发表于 2011-4-27 18:57:03 | 显示全部楼层
osg::ref_ptr<osg::Node> createBillboardTree(osg::ref_ptr<osg::Image> image);
virtual bool addChild( Node *child );

pat->addChild(createBillboardTree(image.get())) ;//此处遇到同样问题,不能将参数 1 从
//“osg::ref_ptr<T>”转换为“osg::Node *”
//若用Node.get()方法,具体代码怎么写呀。请高手指教

该用户从未签到

发表于 2011-4-27 19:08:49 | 显示全部楼层
一个是对象一个是指针当然不能这样转换

该用户从未签到

发表于 2011-4-27 21:56:28 | 显示全部楼层
回复 5# oman


   
  1. #include <osgViewer/Viewer>

  2. #include <osg/Node>
  3. #include <osg/Geode>
  4. #include <osg/Geometry>
  5. #include <osg/Group>
  6. #include <osg/Billboard>
  7. #include <osg/Texture2D>
  8. #include <osg/Image>
  9. #include <osg/PositionAttitudeTransform>
  10. #include <osg/MatrixTransform>

  11. #include <osgDB/ReadFile>
  12. #include <osgDB/WriteFile>

  13. #include <osgUtil/Optimizer>

  14. osg::ref_ptr<osg::Node> createBillboardTree(osg::ref_ptr<osg::Image> image)
  15. {
  16. //创建四边形
  17. osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry() ;

  18. //设置顶点
  19. osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array() ;
  20. v->push_back(osg::Vec3(-0.5f,0.0f,-0.5f)) ;
  21. v->push_back(osg::Vec3(0.5f,0.0f,-0.5f)) ;
  22. v->push_back(osg::Vec3(0.5f,0.0f,0.5f)) ;
  23. v->push_back(osg::Vec3(-0.5f,0.0f,0.5f)) ;

  24. geometry->setVertexArray(v.get()) ;

  25. //设置法线
  26. osg::ref_ptr<osg::Vec3Array> normal = new osg::Vec3Array() ;
  27. normal->push_back(osg::Vec3(1.0f,0.0f,0.0f)^osg::Vec3(0.0f,0.0f,1.0f));

  28. geometry->setNormalArray(normal.get()) ;
  29. geometry->setNormalBinding(osg::Geometry::BIND_OVERALL) ;

  30. //设置纹理坐标
  31. osg::ref_ptr<osg::Vec2Array> vt = new osg::Vec2Array() ;
  32. vt->push_back(osg::Vec2(0.0f,0.0f)) ;
  33. vt->push_back(osg::Vec2(1.0f,0.0f)) ;
  34. vt->push_back(osg::Vec2(1.0f,1.0f)) ;
  35. vt->push_back(osg::Vec2(0.0f,1.0f)) ;

  36. geometry->setTexCoordArray(0,vt.get()) ;

  37. //绘制四边形
  38. geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS,0,4)) ;

  39. if(image.get())
  40. {
  41. //状态属性对象
  42. osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet() ;

  43. //创建一个Texture2D属性对象
  44. osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D() ;
  45. //关联image
  46. texture->setImage(image.get()) ;
  47. //关联Texture2D纹理对象,第三个参数默认为ON
  48. stateset->setTextureAttributeAndModes(0,texture.get(),osg::StateAttribute::ON) ;
  49. //启用混合
  50. stateset->setMode(GL_BLEND,osg::StateAttribute::ON);
  51. //关闭光照
  52. stateset ->setMode (GL_LIGHTING, osg::StateAttribute ::OFF) ;

  53. geometry->setStateSet(stateset.get()) ;
  54. }

  55. //创建Billboard对象一
  56. osg::ref_ptr<osg::Billboard> billboard1 = new osg::Billboard() ;

  57. //设置旋转模式为绕视点
  58. billboard1->setMode(osg::Billboard::POINT_ROT_EYE) ;
  59. //添加Drawable,并设置其位置,默认位置为osg::Vec3(0.0f,0.0f,0.0f) ;
  60. billboard1->addDrawable(geometry.get(),osg::Vec3(5.0f,0.0f,0.0f)) ;

  61. osg::ref_ptr<osg::Billboard> billboard2 = new osg::Billboard() ;
  62. //设置旋转模式为绕轴转,因此还需要设置转轴
  63. billboard2->setMode(osg::Billboard::AXIAL_ROT) ;
  64. //设置旋转轴
  65. billboard2->setAxis(osg::Vec3(0.0f,0.0f,1.0f)) ;
  66. billboard2->addDrawable(geometry.get(),osg::Vec3(10.0f,0.0f,0.0f)) ;

  67. osg::ref_ptr<osg::Group> billboard = new osg::Group() ;
  68. billboard->addChild(billboard1.get()) ;
  69. billboard->addChild(billboard2.get()) ;

  70. return billboard.get() ;

  71. }

  72. int main()
  73. {
  74. osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer() ;

  75. osg::ref_ptr<osg::Group> root = new osg::Group() ;

  76. //读取图像
  77. osg::ref_ptr<osg::Image> image =osgDB::readImageFile("Images/tree0.rgba") ;

  78. //缩放一下,以达到合适的大小
  79. osg::ref_ptr<osg::PositionAttitudeTransform> pat = new osg::PositionAttitudeTransform() ;
  80. pat->setScale(osg::Vec3(5.0f,5.0f,5.0f)) ;
  81. pat->addChild(createBillboardTree(image.get()));

  82. root->addChild(pat.get()) ;

  83. //读取cow的模型,以对比
  84. root->addChild(osgDB::readNodeFile("cow.osg"));

  85. //优化场景数据
  86. osgUtil::Optimizer optimizer ;
  87. optimizer.optimize(root.get()) ;

  88. viewer->setSceneData(root.get()) ;

  89. viewer->realize() ;

  90. viewer->run() ;

  91. return 0 ;

  92. }
复制代码


这是全部的代码。osg::ref_ptr<>这个运用的是智能指针。osg::ref_ptr<osg::Node>不就是相当于osg::Node *吗?如果不是怎么改呀

该用户从未签到

发表于 2011-4-28 08:39:13 | 显示全部楼层
在另一个帖子里已经回复您了,只是在末尾加一个.get()而已,何必重复发帖询问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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