查看: 1230|回复: 5

writeNodeFile文件中的网络地址

[复制链接]
  • TA的每日心情
    开心
    2020-1-14 14:24
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2014-11-14 16:29:49 | 显示全部楼层 |阅读模式
    问题描述:
    有一个Geode,设置StateSet中纹理相关的部分参数,其中纹理图片的路径为网络地址;
    osgText::Text,设置font为 osgText::readFontFile("http://XXX.XXX.XXX.XXX/simhei.ttf") 字体文件的路径为网络地址;
    使用writeNodeFile输出.osg文件后,上述两个地址都未能正确写入文件。

    都改为本地地址,如:F:/OpenSceneGraph/XXX/XXX.png 和 F:/OpenSceneGraph/XXX/simhei.ttf 等路径后能够正确写入文件。

    示例代码(下述代码只为了研究测试网络文件地址写入.osg文件的正确性问题,不具有功能性的使用价值):

    osg::ref_ptr<osgText::Font> osgtextfontOne  = new osgText::Font();               
    osgtextfontOne=        osgText::readFontFile("http://192.168.1.202/simhei.ttf ");//局域网网络地址
    osg::ref_ptr<osg::Geode> textLabelGeode = new osg::Geode();
    textOne->setFont(osgtextfontOne);
    //........省略其它设置text的代码
    std::string filename("F:/OpenSceneGraph/111.png");
    textLabelGeode->getOrCreateStateSet()->setTextureAttributeAndModes(0,new osg::Texture2D(osgDB::readImageFile(filename)));
    //......省略
    root->addChild(textLabelGeode);
    osgDB::writeNodeFile(*(root.get()),"F:/XXX/XXX.osg");

    打开.osg文件查看,上述文件地址不能正确写入。例如:纹理路径可能不存在  filename 为空;字体font字段值为空或osg自动搜索到的系统
    带有的本地字体文件路径,如:c:/windows/fonts/XXX.ttf等。

    注:网络地址对应的文件均存在而且能正确读取进来。


    谢谢。



  • TA的每日心情
    开心
    2020-1-14 14:24
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2014-11-14 16:32:08 | 显示全部楼层
    不考虑中文路径问题。

    该用户从未签到

    发表于 2014-11-14 18:12:18 | 显示全部楼层
    很显然,你写出不能为网络地址!
    否则,你不就可以在本地对网络地址进行硬盘写操作,这显然是不可取和禁止的!
  • TA的每日心情
    开心
    2020-1-14 14:24
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2014-11-16 16:39:08 | 显示全部楼层
    不是用writeNodeFile将物理文件输出到网络地址制定的位置,而是输出物理文件到本地,这点毋庸置疑,想要解决的是该物理文件中需要存储一些数据,而该数据是存在网络上的,例如网络上的纹理文件,想将该文件的网络地址路径写到writeNodeFile输出到本地的物理文件中。
    谢谢

    该用户从未签到

    发表于 2014-11-16 18:44:56 | 显示全部楼层
    本帖最后由 VR_user_happy 于 2014-11-16 19:02 编辑

    很显然,writeNodeFile不支持网络地址
    你自己讲本地硬盘网络地址解析成非网络地址的本地绝对地址!
    就是个字符串处理问题!
    另外,,如果是IVE模型,它也要保存纹理,也必须是写出纹理到打包的文件中,怎么可能用网络地址?
    同样纹理文件,也要转成非网络地址的本地地址

    如果只保存一个纹理的网络地址,岂不是模型会很小,每次读取时候,还需要访问网络地址上的文件,并下载,才能显示?那这个文件模型怎么能快速显示?
      
  • TA的每日心情
    开心
    2020-1-14 14:24
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2014-11-17 09:31:18 | 显示全部楼层
    首先感谢您的回复。谢谢
    然后再和您沟通一下。

    你自己讲本地硬盘网络地址解析成非网络地址的本地绝对地址!
    就是个字符串处理问题!
    我不太明白您想表达的意思。试着理解如下:您可能认为http://192.168.1.202/simhei.ttf 是我的电脑的局域网ip,我要读取的文件也是位于本机上,地址不应该使用http://192.168.1.202/simhei.ttf ,而应该使用本地硬盘地址,如C:/XXX/XXX.ttf。这是不是你所说的字符串处理?

    ================================

    另外,,如果是IVE模型,它也要保存纹理,也必须是写出纹理到打包的文件中,怎么可能用网络地址?
    同样纹理文件,也要转成非网络地址的本地地址

    如果只保存一个纹理的网络地址,岂不是模型会很小,每次读取时候,还需要访问网络地址上的文件,并下载,才能显示?那这个文件模型怎么能快速显示?

    您的表述很正确,确实是这样,我理解,这是保障渲染效率的方案。

    ===================================

    很显然,writeNodeFile不支持网络地址

    关于这句话我不清楚您想表达的意思。writeNodeFile的第二个参数是指定要将场景节点输出的物理文件的路径,您是指的该参数不支持网络地址(正如您所说,这很明显)还是场景节点中记录的参数不支持网络地址的参数(一般理解和实现也正是您接下来进行的表述)?
    我想知道的不是您刚才提到的实现方式,而是从osg支持的功能角度来讲,是否支持将一个网络地址(字符串)作为一行内容写入到输出的物理文件中。

    为方便大家更清晰的理解,下面补充一下对于我所面临的问题的表述:
    假如我有一个场景节点数据,100个建筑物,其中每个建筑物记录了一些数据信息,例如位置,高度,描述等,使用osgText节点来将这些信息进行可视化,通过pickhandler在双击选择建筑物时显示信息,其中涉及到了字体simhei.ttf。该字体的路径写入是我面临的问题。该文件时在pc机上生成,最终要放置到网络上供给android手机端和pc机端同时使用。

    .ttf文件的路径提供尝试2中思路:
    1,同一个地址。可以是相对路径或者同一个网络地址。该思路目前没走通,关键点在于地址写入文件的问题没解决。关于网络地址的问题正是该贴提到的问题,我知道VR_user_happy提到的一系列反问很正确,我只是不知道,假如我不考虑效率问题,单纯从功能实现来讲,osg是否提供了对应的实现方式(字体文件用网络地址记录)?
    2. ttf文件不管了,生成文件的时候不指定了,android和pc端你们各自去负责自己的字体问题。这样可以将字体文件放置到手机sd卡指定位置,然后android端代码手动加载sd上的字体文件然后通过pickhandler等方式更新osgtext相关参数。至于pc端好解决,osg内部自己会去搜索相关字体文件的。

    期待大家的指点。
    再次感谢VR_user_happy的回复。谢谢
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

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

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

    联系我们

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