Away3D引擎学习笔记(一)资源加载解析块
前文:Away3D断断续续用了一段时间了,三维相关的很多算法,计算转换还是有点绕,整理些自己觉得还有点意思东西,希望大家有用。
三维开始,Away3D构架你场景那几行代码各处都有,这里就不copy了,总之在构建完成之后,我们看看怎样去加载一个精细模型并解析
正式开始:
一、首先对Away3D中loader包下面几个类做简单介绍(先了解了才能知道知道怎么去用)。
Away3D类库中负责加载解析的相关类主要在loader包下,当然还有个全局资源管理的AssetLibirary相关。具体职能如下:
- AssetLoaderContext 负责资源加载过程的的一些全局控制属性,主要集中在对于资源URL的重定向控制,已加载的二进制资源命名管理等。一般情况下不用
- AssetLoaderToken 内含一个AssetLoader引用,负责资源加过程中的事件控制
- ResourceDependency 记录资源URL(或ID)与解析文件的对应关系。
- SingleFileLoader 实质性的文件加载类,解析调度类。内含URLLoader引用负责加载数据,根据对数据类型的判断(或用户设置)来获取对应数据解析器parser对数据做最终的解析。
- AssetLoader 资源加载控制类,负责针对不同URL或者二进制数据进行解析,对模型所附带的资源列表(uv,纹理图片)进行逐个加载解析。内含对AssetLoaderContext中设置属性的使用,对parse()的调用,对resourceDependency的逐个调用或者直接接卸(retrieveAsRawData)
- Loader3D 继承自ObjectContainer3D,内含一个AssetLibraryBundle或AssetLoader实例(通过属性_useAssetLib属性来控制选择使用全局资源管理还是单独构建),可以直接将加载解析的内容转换成3D可显示的模型并封装在自身容器中。
- Parser ALL_BUNDLED 定义了当前支持的几种类型的数据解析器,使用AssetLoder. enableParsers 可以设置SingleFileLoader当前支持的解析类型
- ParserBase 解析器基类,各具体类型的解析器继承自此。负责解析过程的调用,异步逐帧加载,事件的分发等。。
- 各个XXXParser 具体的解析类 很直观,不同类型的模型文件对应不同的具体解析器
- AssetLibrary AssetLibraryBundle 这两个类提供静态方法实现模型加载和全局的模型资源管理。
上述众多代码中,红色标注的三个类基本完成了模型加载解析的主要功能。ResourceDependency,AssetLoadetToken,AssetLoaderContext在过程中负责一些简单调调度和数据封装。 Loader3D实在AssetLaoder外层做了一次包装。 AssetLibraryBundle则是通过维护对应明明空间的AssetLoader来提供对资源的统一管理(目前我查看的源码版本这块还尚未完成)
二、使用方式和各区别
使用方式分为三种
1、直接使用AssetLoader
- var assetLoader:AssetLoader = new AssetLoader;
//设置解析器类型(根据模型文件格式)- AssetLoader.enableParser( OBJParser );
- //通过事件监听获取解析的结果资源。一般只关心AssetType为mesh的
//(注LoaderEvent.RESOURCE_COMPLETE事件表示当前模型全部解析完成)- assetLoader.addEventListener(AssetEvent.ASSET_COMPLETE,onAssetComplete);
- //调用Load或者LoadData接口开始加载解析
- assetLoader.load (new URLRquest("./demo.obj"));
2、使用AssetLibrary
- AssetLibrary.enableParser( OBJParser );
- AssetLibrary.addEventListener(AssetEvent.ASSET_COMPLETE,onAssetComplete);
- AssetLibrary.loadData(new HeadModel());
看着和1类似吧。其实内部也差不多。通过静态的接口调用,在AssetLibraryBundle的单例实例中通过命名空间获取AssetLoder来解析。优点一、资源维护,2、资源共享(同一命名空间下的同名资源<比如两个文件使用的同一个图片资源等>可以共享)。这边资源通过ID缓存的代码已经实现,但是读取(也就是共享)的部分...期待后续版本完善吧
3、使用Loader3D
这个就更简单了,和1一样,不过关于结果,可以直接把Loader3D添加到场景去显示。因为获取的模型会自动添加到当前Loder3D中 ,别忘了他也是个ObjectContainer3D对象啊
三、模型解析环节问题补充
现状:模型解析,这里面支持的格式有AWD,OBJ,3DS,DAE,DXF,MD2,MD5等。。总体来说种类是够用了。
ImageParser支持长用的png,jpg,gif等(其实是flash支持的他都支持,flash不支持,还是自己使用外部工具转吧)
问题: ------不支持多材质的模型解析(一个模型使用多张贴图)。
来吧,直接改源码吧,谁让这块卡主了就没法用了,总不能挨个去给模型做UVW展开的拼接操作(俺是码农,不是设计师啊)
目前解决了OBJ和3DS的多材质问题。思路拿出来跟大家分享下:
仔细查看OBJParser和MaxsDSParser的源码,发现这边代码不是没有获取多个图片的纹理信息,而是没有把纹理贴图使用到对应的集合面上去。小弟于是这样想的,最终无非是几何面找到对应纹理或者对应的纹理找到几何面。考虑纹理一般是由url或者ID的,而几何面是不断组装起来的。 我们还是让几何面来找纹理吧,毕竟纹理有现成的标记不是
解析过程中,每个面都有使用的纹理,这个在模型文件中是有定义的,关于OBJ和3DS中的模型记录方式可参考下面的两个地址。当我们吧面信息解析成三维SubGeometry的时候,我们需要记录下来它使用是哪个纹理,这样方便纹理加载后我们去寻找。 直接给SUBGeometry添加了个纹理ID属性 materialID,同时也映射到了SUBMesh上(纹理最终是给subMesh贴的),后面的在最后applayMaterial的时候... (后面你懂得,遍历查找就是了)O(∩_∩)O~
考虑没个面都贴一个张图片,模型面特别多的时候subGeomtry会比较多,而这会影响最终性能。最后提供一个优化方案,把所有使用同一纹理的subGeomtry在接卸过程中合并成一个,然后再贴纹理...
四、这个loader包的设计问题???
表示标题这样写是噱头,希望下面几点大家可以关注下。
1、上面的AssetLibrary没实现完成的问题
2、AssetLoaderContext,这个类一直没说怎么用。 简单补充下、
1)、url映射。如果模型文件建模的时候使用的不是相对模型的路径,那么我们加载的时候则是需要将这个地址做重新映射的,要不然肯定家在不到图片。。 使用属性dependencyBaseUrl可以修改整体路径。使用Mapurl可以修改url的映射关系单个调整。
2)、资源的缓存,context里有个mapUrlToData 和getDataForUrl 接口,很明显的存取。结果这个在代码中没有存的(...),取的时机也不对(这块应该算是未完成功能吧,继续同1,期待下个版本)
3、模型解析ParserBase中有个通过setTimeout来逐帧解析文件,完成一定后开始退回主线程处理渲染...这个小设计还是很巧妙的。 单线程中模拟多线程的数据处理,不卡频,后面应该用得到这种思路(大家有更好的方案也可以告知一下,非常感谢!)
解析这块大致这样了,总体来说不够完整,有待提高。关于中间多个类的调用相互关系的各种复杂,觉得应该更简化点,自己没什么好点子,大家有的话可以告诉我。先谢过
Away3D引擎学习笔记(一)资源加载解析块的更多相关文章
- Spring学习笔记(1)——资源加载
<!-- 占坑,迟点补充底层原理 --> Spring支持4种资源的地址前缀 (1)从类路径中加载资源——classpath: classpath:和classpath:/是等价的,都是相 ...
- thinkphp学习笔记9—自动加载
原文:thinkphp学习笔记9-自动加载 1.命名空间自动加载 在3.2版本中不需要手动加载类库文件,可以很方便的完成自动加载. 系统可以根据类的命名空间自动定位到类库文件,例如定义了一个类Org\ ...
- Openstack本学习笔记——Neutron-server服务加载和启动源代码分析(三)
本文是在学习Openstack过程中整理和总结.因为时间和个人能力有限.错误之处在所难免,欢迎指正! 在Neutron-server服务载入与启动源代码分析(二)中搞定模块功能的扩展和载入.我们就回到 ...
- libgdx学习记录16——资源加载器AssetManager
AssetManager用于对游戏中的资源进行加载.当游戏中资源(图片.背景音乐等)较大时,加载时会需要较长时间,可能会阻塞渲染线程,使用AssetManager可以解决此类问题. 主要优点: 1. ...
- Away3D引擎学习笔记(三)模型拾取(翻译)
原文详见http://away3d.com/tutorials/Introduction_to_Mouse_Picking.本文若有翻译不对的地方,敬请指出. 本教程详细介绍了Away3D 4.x中鼠 ...
- node 学习笔记 - Modules 模块加载系统 (1)
本文同步自我的个人博客:http://www.52cik.com/2015/12/11/learn-node-modules-path.html 用了这么久的 require,但却没有系统的学习过 n ...
- Away3D引擎学习笔记,持续更新
(1). 准备工作,一些必须知道的东西 (创建时间:2014-06-05) A.必要的开发语言基础.至少要懂点ActionScript 3.0语法(ActionScript 3.0语法及API参考), ...
- easyui学习笔记5—panel加载其他的页面
上一篇中我们看到了panel的基本实现,没有什么难度,最重要的是data-options和class两个标签属性的定义.这里我们将看一下在panel中如何加载其他的页面. 1.先看看引用的资源文件和h ...
- node 学习笔记 - Modules 模块加载系统 (2)
本文同步自我的个人博客:http://www.52cik.com/2015/12/14/learn-node-modules-module.html 上一篇讲了模块是如何被寻找到然后加载进来的,这篇则 ...
随机推荐
- AssetDatabase.RenameAsset 重命名文件失败
今天想写一段Unity Editor 的代码将在 Project Panel 中选中的所有 Texture 改变 Format,然后重命名 成 xxx.Dither.png 然后自动进行上一篇文章提到 ...
- Visual Studio 试用版的评估期已经结束【解决方案】
原文发布时间为:2010-01-09 -- 来源于本人的百度文章 [由搬家工具导入] Visual Studio 试用版的评估期已经结束…… 解决。2010年1月9日0:02:50,本人亲自尝试,可行 ...
- 反射的基本使用以及原理(Class获取方式)
1.什么是反射技术? 动态获取指定类以及类中的内容(成员),并运行其内容. 应用程序已经运行,无法在其中进行new对象的建立,就无法使用对象.这时可以根据配置文件的类全名去找对应的字节码文件,并加载进 ...
- PMI8940 PON (power on) trigger
PMI8940 唯一的 PON input pin 是 SHDN_N, PM8937 的 VREG_L5 會接到 PMI8940 的 SHDN_N, PM8937 負責整個系統的 power on s ...
- AC日记——石子归并 51nod 1021
石子归并 思路: 经典动态规划——归并类问题: 我们把状态划为n个,即1-n的n个长度为n个状态: 那么,每个长度为i的状态都可以由i-1个长度为i-1的状态推出: 所以,dp转移方程: dp[i][ ...
- iOS直播Liveroom组件,游客,用户多次切换登录同一直播间,消息出现多次重复问题解决
byzqk 新版,加入连麦功能,直播的流程修改很多,每次登录都需要登录liveroom组件 期间遇到一个奇葩的问题,就是游客登录组件之后,切换为用户登录,出现im消息重复的问题,一开始以为是游客退出不 ...
- Codeforces Round #466 (Div. 2) A. Points on the line[数轴上有n个点,问最少去掉多少个点才能使剩下的点的最大距离为不超过k。]
A. Points on the line time limit per test 1 second memory limit per test 256 megabytes input standar ...
- POI 2014 HOTELS (树形DP)
题目链接 HOTELS 依次枚举每个点,以该点为中心扩展. 每次枚举的时候,从该点的儿子依次出发,搜完一个儿子所有的点之后进行答案统计. 这里用了一个小trick. #include <bits ...
- SSH做反向代理
说实话,我对反向代理这个概念并不熟悉,只是感觉以下要做的事是一个代理的逆向过程,故借此名词一用. 问题场景是这样的:我有两套Linux集群的访问权限,分别为A和B,它们互相独立.其中A.B集群均能访问 ...
- Linux(三) 一些命令
系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS ...