zoukankan      html  css  js  c++  java
  • osg读取bmp纹理失败

    在使用osg加载obj模型文件时,也需要读取相关联的mtl材质文件,bmp贴图就绑定材质文件的map_ka和map_kd通道之上。

    具体的mtl文件内容如下:

    -------------------------------------------------------------------

    newmtl 03___Default

    Ns 9.999999

    Ni 1.500000

    d 1.000000

    Tr 1.000000

    Tf 1.000000 1.000000 1.000000 

    illum 2

    Ka 0.000000 0.000000 0.000000

    Kd 0.117647 0.078431 0.921569

    Ks 0.882000 0.882000 0.882000

    Ke 0.000000 0.000000 0.000000

    map_Ka maps/CAD颜色表.bmp

    map_Kd maps/CAD颜色表.bmp

    -------------------------------------------------------------------

    在程序里面Debug跟踪发现是文件路径中含有中文的原因。

    1 ReadResult readImage(const std::string& file, const Options* options = 0) const
    2 {
    3 std::string ext = osgDB::getLowerCaseFileExtension(file);
    4 if (!acceptsExtension(ext)) return ReadResult::FILE_NOT_HANDLED;
    5
    6 std::string fileName = osgDB::findDataFile(file, options);
    7 if (fileName.empty()) return ReadResult::FILE_NOT_FOUND;
    8
    9 osgDB::ifstream istream(fileName.c_str(), std::ios::in | std::ios::binary);
    10 // 文件打开失败,直接返回
    11   if(!istream) return ReadResult::FILE_NOT_HANDLED;
    12
    13 ReadResult rr = readBMPStream(istream);
    14 if(rr.validImage()) rr.getImage()->setFileName(file);
    15
    16 return rr;
    17 }

    将代码修复为如下,即可使得ifstream/ofstream支持含中文字符的文件路径。

    1 ReadResult readImage(const std::string& file, const Options* options = 0) const
    2 {
    3 std::string ext = osgDB::getLowerCaseFileExtension(file);
    4 if (!acceptsExtension(ext)) return ReadResult::FILE_NOT_HANDLED;
    5
    6 std::string fileName = osgDB::findDataFile(file, options);
    7 if (fileName.empty()) return ReadResult::FILE_NOT_FOUND;
    8
    9 // 设置中文运行环境
    10   setlocale(LC_ALL,"Chinese-simplified");
    11 osgDB::ifstream istream(fileName.c_str(), std::ios::in | std::ios::binary);
    12 // 恢复原来运行环境
    13   setlocale(LC_ALL,"C");
    14 if(!istream) return ReadResult::FILE_NOT_HANDLED;
    15
    16 ReadResult rr = readBMPStream(istream);
    17 if(rr.validImage()) rr.getImage()->setFileName(file);
    18
    19 return rr;
    20 }

    看来老外的库对中文还是考虑得不多啊!在以后的编程中,要注意警惕中文字符带来的麻烦。

  • 相关阅读:
    基于Metaweblog API 接口一键发布到国内外主流博客平台
    uva144 Student Grants
    Uva 10452
    Uva 439 Knight Moves
    Uva 352 The Seasonal War
    switch语句
    java——基础知识
    我的lua学习2
    codeforces 431 D. Random Task 组合数学
    codeforces 285 D. Permutation Sum 状压 dfs打表
  • 原文地址:https://www.cnblogs.com/kekec/p/2053904.html
Copyright © 2011-2022 走看看