当前位置: 首页 > news >正文

上海网络推广公司网站江苏网站设计

上海网络推广公司网站,江苏网站设计,三亚市建设局官方网站,网站建设行业前景如何基本几何体的绘制只适用于简单的编程#xff0c;当场景中需要加载一个很复杂的模型时#xff0c;还是需要从外部导入。osgDB 库 提供了读取二维图像和三维模型的接口#xff0c;同时#xff0c;也管理着第三方插件系统#xff0c;以实现对不同格式文件的读取。 1、OSG 支…  基本几何体的绘制只适用于简单的编程当场景中需要加载一个很复杂的模型时还是需要从外部导入。osgDB 库 提供了读取二维图像和三维模型的接口同时也管理着第三方插件系统以实现对不同格式文件的读取。 1、OSG 支持的文件格式 由于 OSG 包含庞大的第三方插件库所以 OSG 支持的文件格式也非常多如各种三维模型、图 片和视频等文件这也是 OSG 的一大优势它可以满足各行各业的需求。 1.1 三维模型文件格式 OSG支持的三维模型文件格式类型如下表所示。 1.2 打包及网络传输格式 OSG支持的打包及网络传输文件格式类型如下表所示。 1.3 字体文件格式 OSG支持的字体文件格式类型如下表所示。 1.4 伪插件文件格式 OSG支持的伪插件文件格式类型如下表所示。 2、.osg 文件和.ive 文件 OpenSceneGraph 支持如下两种本地文件格式 .osg OpenSceneGraph native ascii format .ive OpenSceneGraph native binary format。2.1 .osg 文件 .osg 文件格式是标准的 ASCII 文本它并不是一种可以实现高效存储和读取的数据结构但它是一种极好的调试工具。由于它是一种文本文件所以清晰可读。在应用程序开发时如果遇到了意料不到的渲染结果可以将渲染结果保存为.osg 文件然后对其进行手动的修改从而纠正错误这对实际调试程序来说是非常方便的。 2.2 .ive 文件 为了加快模型导入和显示的速度每个视景驱动软件都有自己的二进制格式如 Vega 的 FST、Vega Prime 的 VSB 和 Performer 的 PFB 等。OSG 里面的就是 IVEIVE 就是为了性能而生的它把场景树存成二进制文件。所以在分发应用程序时可以把模型转为 IVE并把纹理打包进去osgconvmyfile.flt——compressed myfile.ive这样既可以达到保护自己劳动成果的目的还能提高应用程序的性能。 3、文件读写的流程 osgDB 库允许用户程序加载、使用和写入 3D 数据库它采用插件管理的架构可以支持大量常见的 2D 图形和 3D 模型文件格式。osgDB 负责维护插件的信息注册表并负责检查将要被载入的 OSG插件接口的合法性。OSG 可以支持自己的文件格式。.osg 文件是对场景图形的一种无格式 ASCII 码文本描述而.osga文件是一组.osg 文件的有序集合。osgDB 库包含了以上文件格式的支持代码。另外OSG 还支持一种二进制的.ive 格式。 由于大型的 3D 地形数据库通常是多段数据块的组合体。因此应用程序从文件中读取各部分数据库信息时需要在不干扰当前渲染的前提下以后台线程的方式进行osgDB::DatabasePager 提供了这样的功能。 3.1 文件的读取与保存 3.1.1 文件的读取 文件读取的简单代码如下 #includeosgDB/ReadFile osg::ref_ptrosg::Node node osgDB::readNodeFile(cow.osg); osg::ref_ptrosg::Image image osgDB::readImageFile(lz.rgb);上面代码中函数类的参数可以包含绝对路径或相对路径。如果是绝对路径OSG 会去指定的位置搜索该文件如果是相对路径就要复杂一点了它会从数据路径列表中来搜索文件。在本章会提到环境变量 OSG_FILE_PATH这个是在 OSG 中预先定义的。在用户的应用程序中除了设置环境变量以外还可以手动添加数据文件路径列表。有如下两种方式 1第一种方式的程序代码如下 osgDB::FilePathList pathList osgDB::getDataFilePathList(); pathList.push_back(…); pathList.push_back(…); osgDB::setDataFilePathList(pathList);2第二种方式的程序代码如下 osgDB::Registry::instance()-getDataFilePathList().push_back(newpath );osgDB::Registry 是一个单态类singleton因此要调用函数 getDataFilePathList()就需要使用单态类的实例。osgDB::FilePathList 就是一个简单的 std::deque std::string 。 文件读取失败的原因可能很多读者可以通过设置调试信息 NOTIFY 来确定当再次读取时就会提示相关错误或者警告信息。很多时候可能是因为找不到插件或者文件不存在造成的这也要根据输出信息来具体确定到底是什么错误。 3.1.2文件的保存 文件保存的简单代码如下 #include osgDB/WriteFile osgDB::writeNodeFile(*node, saved.osg);文件保存失败的原因也很多。读者可以通过设置调试信息 NOTIFY 来确定当再次保存时就会提示相关错误或者警告信息。很多时候可能是因为找不到插件或者该扩展名不支持造成的这也要根据输出信息具体来确定到底是什么错误。需要注意的是当 OSG 保存文件时如果本地有同名文件会覆盖并不会给出任何警告的信息所以在保存时需要自行检查本地文件是否存在同名的。 3.2 文件读写进度 面对海量数据时读取可能需要耗费很长的时间这时有必要显示正在读取的数据量和读取进度等信息。下面先介绍 C流缓冲的一些知识。众所周知C标准库的 iostream 提供了如下 3 种形式的缓冲 不带缓冲区这样与 fwrite 等操作一致。 空间自动管理的缓冲区下一个可写位置总是为末边界1。 外置的缓冲区如定义局部字符串数组并将此区域传递给 iostream。 在带缓冲区的情况下iostream 本身不具体负责其相关功能而把此任务交给了 basic_streambuf及其派生类常见的如 basic_filebuf用于文件操作的缓冲和 basic_stringbuf用于字符串操作的缓冲区。basic_iostream 的两大分支 basic_istream 和 basic_ostream 都是 basic_streambuf 的友元类而basic_iostream 包含了一个 basic_streambuf 的派生类的实例该实例可以通过 basic_iostream 的成员函数 rdbuf()来获取并通过构造函数传入。我们经常使用的流操作符“”实际上是通过调用 basic_streambuf 的相关操作实现的。 要控制标准输入/输出流的缓冲区行为必须生成自己的 basic_streambuf 派生类并生成一个该类的对象传递给标准输入/输出流。由于基类 basic_streambuf 的很多功能没有具体实现为了方便操作我们需要从 basic_filebuf 或basic_stringbuf 派生。在第 6.2.5 节的示例中显示了读取一个.osg 文件的读取进度。前面已经讲到.osg 文件是一种 ASCII 文件因此.osg 支持数据流操作。在 OSG 支持的文件中只有.osg、.ive 及一些图像文件支持流操作都可以用数据流操作来显示读取进度。 所有的 osgDB 插件都可以使用 osgDB::readNodeFile()、osgDB::writeNodeFile()和 osgDB::readImageFile()之类的函数来执行文件的读取和写入操作其中一些插件还允许使用标准数据流来执行一些低层级的操作如从用户自定义的数据流中读写数据。由于 C标准模板库STL的便利性用户可以编写自定义的数据流缓存类来跟踪 uflow()方法从而获取当前读入的字节数。用户定义了正确的数据流缓存类如例子程序所示后就可以按照如下的步骤来读取文件 1给出文件名并搜索用于读取该文件的插件也就是调用 osgDB::Registry::instance()-getReaderWriterForExtension()传递文件扩展名作为该函数的输入参数并保存返回的 osgDB::ReaderWriter对象。 2创建自定义数据流缓存类的实例将文件名传递给类的构造函数。此时函数将按照类似于standard std::basic_filebuf的方法打开文件。 3通过自定义类的实例创建 std::istream 对象。 4调用步骤1中获取的 ReaderWriter 对象的 readNode()方法并将步骤3创建的 istream对象作为其输入参数。此时OSG 将读入文件同时调用自定义类的 uflow()方法该方法将负责显示读入字节的进度信息。 3.1.2读取进度示例 #include windows.h #include iostream #include fstream #include osgViewer/Viewer #include osgDB/ReaderWriter #include osgDB/ReadFile #include osgDB/FileNameUtils #include osgDB/FileUtils #include osgDB/Registry #include osgUtil/Optimizer#pragma comment(lib, OpenThreadsd.lib) #pragma comment(lib, osgd.lib) #pragma comment(lib, osgDBd.lib) #pragma comment(lib, osgUtild.lib) #pragma comment(lib, osgGAd.lib) #pragma comment(lib, osgViewerd.lib) #pragma comment(lib, osgTextd.lib)class CRenderingThread : public OpenThreads::Thread { public:CRenderingThread(osgDB::ifstream* fin) :_fin(fin){fin-seekg(0, std::ifstream::end);_length fin-tellg();fin-seekg(0, std::ifstream::beg);};virtual ~CRenderingThread() {};virtual void run(){int pos _fin-tellg();int nProgres 0;std::cout nProgres %% std::endl;while (pos _length){pos _fin-tellg();int nTemp (int)(100.0 * pos / _length);if (nTemp nProgres nTemp%5 0){std::cout nTemp %% std::endl;nProgres nTemp;}}std::cout 读取完成 std::endl;};protected:osgDB::ifstream* _fin;int _length; };class ReadFileCB : public osgDB::Registry::ReadFileCallback { public:virtual osgDB::ReaderWriter::ReadResult readNode(const std::string file, const osgDB::ReaderWriter::Options* opt){//第一步是获取OSG、IVE ReaderWriterstd::string ext osgDB::getLowerCaseFileExtension(file);osgDB::ReaderWriter* rw osgDB::Registry::instance()-getReaderWriterForExtension(ext);if (!rw){return osgDB::ReaderWriter::ReadResult::FILE_NOT_HANDLED;}std::string fileName osgDB::findDataFile(file, opt);if (fileName.empty()){return osgDB::ReaderWriter::ReadResult::FILE_NOT_FOUND;}osgDB::ifstream istream(fileName.c_str(), std::ios::in | std::ios::binary);CRenderingThread crt(istream);crt.startThread();if (istream){std::cout 正在读取模型文件进度如下 std::endl;osgDB::ReaderWriter::ReadResult rr rw-readNode(istream);while (crt.isRunning()) {}return rr;}return osgDB::ReaderWriter::ReadResult::ERROR_IN_READING_FILE;} };int main() {osg::ref_ptrosgViewer::Viewer viewer new osgViewer::Viewer;osgDB::Registry::instance()-setReadFileCallback(new ReadFileCB);viewer-setSceneData(osgDB::readNodeFile(ceep.ive));viewer-setUpViewInWindow(600, 600, 1000, 800);return viewer-run(); }3.3 OSG中文文件名及中文路径问题 在读写文件时经常会遇到这样的情况如果文件名包含中文路径就会导致无法读取或读取失败。因为我们使用的是 unicode 编码位模式而 OSG 的库函数只支持 ANSI 编码或多字节编码。其实这是符合 C 语言规范的因为 C 标准并不支持 unicode只是很多 C 的实现将宽字符用 unicode 的位模式表示。这时我们需要通过 setlocale 函数将 unicode 编码的宽字符转换成一种可以支持的编码。Setlocale 函数的语法格式如下 char * setlocale ( int category, const char * locale );该函数的返回值是字符串函数种类是操作系统与环境。该函数用来配置地域的信息设置当前程序使用的本地化信息。参数 category 可以设置为如下数值。 LC_ALL包括所有选项的功能。 LC_COLLATE配置字符串比较PHP 目前尚未实作出来本项。 LC_CTYPE配置字符类别及转换如全变大写 strtoupper()。 LC_MONETARY配置金融货币PHP 目前尚未实作。 LC_NUMERIC配置小数点后的位数。 LC_TIME配置时间日期格式与 strftime()合用。 而参数 locale 若是空字符串则会使用系统环境变量 locale。若 locale 为 0NULL则不会改变地域化配置返回当前的地域值若系统尚未实作则返回 false。 只需要做如下设置就可以实现编码格式的转换 setlocale( LC_ALL, Chinese-simplified ); setlocale( LC_ALL, chs ); setlocale( LC_ALL, ZHI ); setlocale( LC_ALL, .936 );关于字符编码转换其实有很多好用的开源工具包可用如著名的 iconv。平时积累编码方面的知识对学习 OSG 是非常有帮助的而且在程序开发时计算机编码也是一个非常重要的方面。 //创建一个节点读取牛的模型 osg::ref_ptrosg::Node node1 new osg::Node(); /*很关键的一个函数用于识别 unicode 中文字符 */ setlocale( LC_ALL, chs ); node1 osgDB::readNodeFile(牛.ive);
http://www.zqtcl.cn/news/714044/

相关文章:

  • 门户网站开发视频教学百度关键词怎么刷上去
  • 做网站搞流量挂联盟广告变现新媒体营销心得体会
  • 网站做信息流网站如何做担保交易平台
  • php网站后台访问统计分析互联网营销师题库
  • 提供建站服务的网络公司的比较注册网站域名后免费建站
  • 颍上建设网站长江商学院 网站建设
  • 做酒店销售上哪个网站好东莞出租车公司
  • 如何在记事本中做网站链接好看的wordpress文章模板下载
  • 做二手衣服的网站有哪些安县移动网站建设
  • 学习资料黄页网站免费美丽乡村 网站建设
  • 仲恺住房和城乡建设局网站上海wordpress
  • 网站整体结构国内现货正规交易平台
  • 正规的网站制作开发平度建设网站
  • 建筑网站在哪里找松岗网站
  • 网站开发后台框架贸易网站建站
  • 定州做网站宝安设备网站设计
  • 高端网站制作技术吉利汽车新能源品牌
  • 阿里云大学 网站建设常州网警
  • 做的网站访问不了lovefort表白网站制作
  • 自己如何做公司网站视频seo快速排名软件首页
  • 一站式做网站技术兰州网站设计哪个平台好
  • 网站按钮psdwordpress哪个主题
  • 阜宁网站制作哪家好建瓯建设局网站
  • 青岛网站建设团队营销网站建设的公司
  • 企业网站 dede phpcms 帝国食品网站建设建议
  • 网站建设友情链接怎样交换毕业设计网站开发的中期报告
  • 在线音乐制作网站google 网站打不开
  • 网站互联wordpress whatnew
  • 上海公司网站seo网站建设哪家公司好一点
  • 微信怎么建立自己的公众号大连网站优化技术