查看: 3030|回复: 1

PagedLOD加载文件问题

[复制链接]

该用户从未签到

发表于 2023-1-18 18:47:40 | 显示全部楼层 |阅读模式
本帖最后由 zz12138 于 2023-1-18 19:23 编辑

代码是照着教程敲的
  1. #include <Windows.h>
  2. #include <osgViewer/Viewer>

  3. #include <osg/Node>
  4. #include <osg/Geode>
  5. #include <osg/Group>
  6. #include <osg/PagedLOD>
  7. #include <osg/PositionAttitudeTransform>
  8. #include <osg/MatrixTransform>

  9. #include <osgDB/ReadFile>
  10. #include <osgDB/WriteFile>

  11. #include <osgGA/TrackballManipulator>

  12. #include <osgUtil/Optimizer>

  13. #include <iostream>

  14. //创建三级PagedLOD场景
  15. osg::ref_ptr<osg::Group> createPagedLOD()
  16. {
  17.         //创建PagedLOD对象
  18.         osg::ref_ptr<osg::PagedLOD> page = new osg::PagedLOD();
  19.         //设置中心位置
  20.         page->setCenter(osg::Vec3(0.0f, 0.0f, 0.0f));

  21.         //添加节点,设置0级的内容为cow.osg
  22.         page->setFileName(0, "cow.osg");
  23.         //设置可视变化范围为0.0f-50.0f
  24.         page->setRange(0, 0.0f, 50.0f);

  25.         //添加节点,设置1级的内容为glider.osg
  26.         page->setFileName(1, "glider.osg");
  27.         //设置可视变化范围50.0f-100.0f
  28.         page->setRange(1, 50.0f, 100.0f);

  29.         //添加节点,设置2级的内容为cessna.osg
  30.         page->setFileName(2, "cessna.osg");
  31.         //设置可视变化范围100.0f-200.0f
  32.         page->setRange(2, 100.0f, 200.0f);

  33.         return page.get();
  34. }

  35. int main()
  36. {
  37.         osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();

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

  39.         //创建矩阵变换节点
  40.         osg::ref_ptr<osg::MatrixTransform> mt = new osg::MatrixTransform();
  41.         //添加子节点
  42.         mt->addChild(createPagedLOD());
  43.         //旋转一下,调整一下合适的角度
  44.         osg::Matrix m;
  45.         m.makeRotate(60.0f, 0.0f, 0.0f, 1.0f);
  46.         //设置矩阵
  47.         mt->setMatrix(m);

  48.         //添加PagedLOD场景
  49.         root->addChild(mt.get());

  50.         //写入PagedLOD
  51.         osgDB::writeNodeFile(*root, "page.osg");

  52.         //优化场景数据
  53.         osgUtil::Optimizer optimizer;
  54.         optimizer.optimize(root.get());

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

  56.         viewer->realize();
  57.         
  58.         viewer->getDatabasePager()->setDoPreCompile(false);
  59.         viewer->run();

  60.         return 0;
  61. }
复制代码

但是在vs2017,osg版本3.6.5 x64 release情况下无法正确显示,效果如图,截屏截不到所以用手机拍了,可以隐约看出牛的纹理,但是只能旋转,无法缩放和使用鼠标中键移动。
OZ}~NOIMDNY%I6`8OJ_}3MM.png
删掉矩阵变换节点,即root只有一个pageLOD节点运行,或者直接使用osgViewer在命令行中查看程序保存的page.osg都是显示上面的效果,已知cow gliter cessna都可以正常显示,基本可以确定就是pagedLOD的问题。
如果不使用setFileName,改成使用readNodeFile先读然后使用pageLOD的addChild方法加载是可以正确显示的,基本可以确定是setFileName没有正确读入文件。

网上有一篇帖子遇到了和我一样的问题,如下图,但是没有人回答

$ZBWK6TY4KS`YAB6DIN6QJ3.png

请问这种问题如何解决,是我的电脑的环境问题吗,还是因为什么东西没配置好,还是别的问题?求大佬帮忙看看。CPU为i5-8265,内存、显卡以及程序运行时系统资源占用如下
W9Z{LR6Z@P6OZ_CVJOJ_)]4.png



该用户从未签到

 楼主| 发表于 2023-1-31 16:47:11 | 显示全部楼层
发现问题了,单纯是因为牛这个模型太大了才加载成这个样子的:L:L:L:L,滚轮滚了好久才法线牛,
不知道怎么删帖,此贴就在这终结吧
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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