flab3dAnimation
public class ModelViewer
接口ModelViewer


《Flab3d模型展示开发包》使用非常简单,即使是新人as3开发者,也能10分钟以内学会使用,制作出高手需要几周才能完成的专业应用。(但前提是一定要掌握基本的as3语言)
模型展示一直是除了"全景"个人用户和公司需求最高的一个应用。《模型展示开发包》也沿袭开发包系列超易用的特色,有这个开发包的人就等于有能力完成所有的模型展示项目。
虽然叫"模型展示",但它能完成的远不止简单的浏览模型,和三维产品展示(注:此为真的模型即时渲染,并非简单的产品360度拍照)。
有创意的使用它,制作一些有趣的三维游戏,网站三维应用,三维剧场都完全不在话下。
版本注意:《模型展示开发包》最新版2.0以后,必须使用flash11播放器。开发需要使用flash cs6, 或flex4.5以上的环境进行开发。配置方面不懂的时候可以咨询我们的客服QQ。
另外,《模型展示开发包 2.0》有些功能暂时未向用户开放,请不要随意使用以免带来麻烦,请严格按照开发文档上的方法进行制作。

 

功能:
☆ 一点stage3d的知识都不用懂,20行代码以内都可以制作比高手做的更商业级的模型展示应用。 ☆ 支持单机和网页上播放,也支持苹果和安卓系统的手机和移动设备。
☆ 对模型内部的各种操作; 任意更换模型贴图; 完全胜任"人物变装效果"的制作。
☆ 3dsMax9,2009,2010等直接导出研究所内部专用模型格式(.flb)插件,用户再也不用为乱七八糟的模型格式导出和读取发愁。
☆ 自动缓冲模型;贴图读取
☆ 超便捷的热点加入,2d,3d两种热点可供选择
☆ 各种便捷摄像机操作,旋转摄像,漫游摄像全都是自动商用级设置,自己一点控制代码都不用写,操作手感极佳
☆ 对模型拍照生成2d位图
☆ 运行效率最优化。(不开启3d加速下,最好把模型面数控制在5万面以内。开启时则无限制。)
☆ 购买用户享受永久免费升级,讨论区的本开发包的反馈和意见会最优先处理


声明如下可以建立模型浏览器。 代码范例如下:
var mv:ModelViewer = new ModelViewer(this.stage,"",640,480);
您通常需要调用的类如下:
import flab3dAnimation.ModelViewer;
import flab3dAnimation.event.Flab3dEvent;
.
.
.
等等

文件和模型都在asset包里。请参考我们assets包里面的范例文件。


三维空间xyz轴顺序需要注意的地方:
模型浏览开发包的XYZ轴方向,和3dsMax软件相同。X正方向为向屏幕右, Y的正方向为朝屏幕里, Z的正方向为朝屏幕上。
另外, 请注意开发包中默认摄像机出现的“摄像机Z方向” ,是指默认摄像机拉近拉远的方向。

制作模型需要注意的地方:
◆物体坐标清零:
物体导出前或物体骨骼蒙皮以前,都应该归零一次所有可见模型。这是为了让模型数据整洁,也避免导出出错。具体操作如下: 全选所有需要归零的可见模型(主要模型,骨骼和辅助不用选),点击3dmax右边工具栏最后一个页面(有个小榔头图标),选择Reset XForm按钮,下面点击一次Reset Selected。这时所有物体都多了一个XForm修改器,这时右键点击可见模型,选择Convert To:Convert To Editable Poly。 这时再导出模型,或进行骨骼蒙皮,出错几率就会小很多。
◆和上一种方法解决同一个问题,如果长期建模中留下太多冗余和错误信息,在模型浏览开发包不能正常解析。这时建议建模后导出导入一次obj类型文件(导出设置为polygon),这样可以把多余和错误的模型信息清除掉。 绑定骨骼前,强烈建议请进行一次清除。
◆max中模型要干净,不要使用多贴图材质, 每个材质球只贴一张图,只能贴在diffuse通道上。使用不同材质球的物体要切分开来,不要合并。
◆贴图的尺寸要特别注意,只能使用2的次方数,比如128*128, 512*512, 1024*1024等等
◆点击“导出”键后,等待一会儿直到导出成功。 第一次使用插件时,会提示输入授权码,请牢记网站上获取的授权码激活插件。
◆作为addCollision用的碰撞体的flb文件里,必须是简单立方体模型,最好为8个顶点的立方体。如果需要弧形碰撞,请用小一些的立方体排列成弧形。贴图无意义。最好不要把正式的模型文件直接作为碰撞体。碰撞体导出前,必须freeze transform和把所有碰撞体的中心归位到每个物体的默认中心。

《模型展示开发包》在苹果ios,和安卓系统上使用的注意
◆必须在苹果ios4.3,安卓3.2以上的系统才可能播放flash3d。
◆cs6导出时需要将所有的资源,素材包都打包入ipa或apk文件
◆最好将在移动设备上播放必须要用到的Adobe AIR3.2也一并打包进文件,以免用户需要另外下载Adobe AIR或下载到错误的AIR版本。

Flab3d模型导出插件安装方法
Flab模型导出插件的安装很简单。直接把对应您max版本的flab3dExporterXXXX.dle文件复制到您的3dsmax安装目录中的plugins文件包中,重启3dsmax软件即可。
这时,您的导出目录中应该有 .FLB格式的文件可以输出。输出后即可在模型展示开发包中使用。
第一次导出时需要输入您在网站获取的激活码,一个激活码只能激活一台机器,请小心保护。
注意max版本号和插件对应。目前对应的版本有max9, max2009, max2010。对应版本和插件功能目前还在增加中,如果您需要更多的版本对应,您可以联系我们的客服qq:1226257961



公共方法
  方法Defined by
  
ModelViewer(_getStage:DisplayObject,_rootPath:String ,_width:int=640, _height:int=480, _getAllowGPU:Boolean=false,_getPlatform:String="web")
建立一个模型浏览器。
第1个参数为目前的stage,第2个参数为根目录, 第5个参数为是否启用3d加速。如果是网页项目最好不要开启显卡,因为你不知道你的用户的电脑是否能加速。如果是单机则任意。如果是iphone,ipad,安卓系统的移动设备,则必须开启显卡。第6个参数为指定本程序运行的平台,可以是"web","android","ios"(注意和以前的版本不同)
代码范例如下:
var mv:ModelViewer = new ModelViewer(this.stage,"./",640,480);
ModelViewer
  
addModel(_getModelAddress:String, _getName:String="", _getMapPath:String = "",_getSuffixName:String="", _getIsAnimated:Boolean=false, _getY:Number=100, _getHorizontal:Number=45,_getDistance:Number=200,_getMinZ:Number=40):void
添加一套模型场景。 参数1为flb文件地址,参数2为给整个模型场景一个名字,参数3为放贴图的文件包的地址,参数4为给所有这个场景的模型一个后缀名,参数5,6,7为读取后默认摄像机的位置。 FIRST_COMPLETE事件后调用。
ModelViewer
  
removeModelByName( _getName:String=""):void
按模型name删除一个模型或整个模型场景,必须要当前场景中或场景本身有此name。 FIRST_COMPLETE事件后调用。
ModelViewer
  
loadModelListXML(_getXMLAdress:XML):void
加入一个xml 列表来读取一组模型列表,然后通过updateModelById来方便切换.
ModelViewer
  
updateModelById(_getId:int = 0):void
通过loadModelListXML设定的id来切换模型。注意1:必须要用过loadModelListXML才能使用, 注意2:本身就会调用addModel方法,所以不用重复使用addModel。
ModelViewer
  
add3dTag(_getSprite:Sprite,_getName:String, _getSpriteWidth:Number=100,_getSpriteHeight:Number=100, _getX:Number=0, _getY:Number=0, _getZ:Number=0,width:Number=100, height:Number=100):void
动态的添加3d热点标签,可以添加任何sprite类型的元件作为热点标签。3d和2d标签的区别为,3d标签真的在3d场景中但无法交互,2d标签只是跟随3d场景运动并不是真的3d,但可以做任何sprite元件的交互。 FIRST_COMPLETE事件后调用。和以前的版本不同,分成了2d和3d两种tag。
ModelViewer
  
add2dTag(_getSprite:Sprite, _getName:String, _getX:Number=0, _getY:Number=0, _getZ:Number=0,_withUpdate:Boolean=true):void
动态的添加2d热点标签,可以添加任何sprite类型的元件作为热点标签,相当有用的方法。3d和2d标签的区别为,3d标签真的在3d场景中但无法交互,2d标签只是跟随3d场景运动并不是真的3d,但可以做任何sprite元件的交互。 FIRST_COMPLETE事件后调用。
ModelViewer
  
remove3dTagByName(_getName:String):void
按name移除3d标签。 FIRST_COMPLETE事件后调用。
ModelViewer
  
remove2dTagByName(_getName:String):void
按name移除2d标签。 FIRST_COMPLETE事件后调用。
ModelViewer
  
setObj3DPosition(_getObjName:String, tx:Number=0, ty:Number=0, tz:Number=0):void
设置场景里某个模型的三维空间XYZ轴的位置,第一个参数为3dsmax里的模型名。 (如不清楚模型名可以用方法showObj3DName()获取当前模型组里所有模型的名字,详细见下面showObj3DName文档) FIRST_COMPLETE事件后调用。
ModelViewer
  
setObj3DRotation(_getObjName:String, rx:Number=0, ry:Number=0, rz:Number=0):void
设置场景里某个模型的三维空间XYZ轴的旋转,单位为“角度”,第一个参数为3dsmax里的模型名。 (如不清楚模型名可以用方法showObj3DName()获取当前模型组里所有模型的名字,详细见下面showObj3DName文档) FIRST_COMPLETE事件后调用。
ModelViewer
  
setObj3DScale(_getObjName:String, sx:Number=1, sy:Number=1,sz:Number=1):void
设置场景里某个模型的三维空间XYZ轴的缩放,第一个参数为3dsmax里的模型名。 (如不清楚模型名可以用方法showObj3DName()获取当前模型组里所有模型的名字,详细见下面showObj3DName文档) FIRST_COMPLETE事件后调用。
ModelViewer
  
getObj3DTransform(_getObjName:String):Array
获取某个模型的三维空间XYZ轴的移动,旋转和缩放。 返回的是一个9个元素的数组 [0]为X轴的平移,[1]为Y轴的平移,[2]为Z轴的平移,[3]为X轴的旋转度数,[4]为Y轴的旋转度数,[5]为Z轴的旋转度数,[6]为X轴的缩放,[7]为Y轴的缩放,[8]为Z轴的缩放。 FIRST_COMPLETE事件后调用。
ModelViewer
  
setObj3DMaterial(_getObjName:String, _getMap:*):void
动态更换本模型组某模型的贴图。第二个参数可以为贴图地址String,也可以为读取好的贴图信息BitmapData, 贴图图片接受jpg,png,bmp。
贴图的尺寸要特别注意,只能使用2的次方数,比如128*128, 512*512, 1024*1024等等
FIRST_COMPLETE事件后调用。
ModelViewer
  
setObj3DBothSide(_getObjName:String, _getBoolean:Boolean = false ):void
设置本模型组中某模型,是否为双面渲染。 当您贴图背面的显示很重要时可以设置为true,但运行效率会下降。 FIRST_COMPLETE事件后调用。
ModelViewer
  
setObj3DVisible(_getObjName:String, _getBoolean:Boolean = true):void
设置本模型组中某模型,是否可见。 可以结合使用此方法制作“人物换装”或“组装机械”等功能。 FIRST_COMPLETE事件后调用。
ModelViewer
  
updateVerticalRange(_getMin:Number = 0, _getMax:Number = 25):void
限制默认摄像机竖方向的范围,单位为“度数”,范围为-90到90. FIRST_COMPLETE事件后调用。
ModelViewer
  
updateHorizontalRange(_getLeft:Number = 0, _getRight:Number = 360):void
限制默认摄像机横方向的范围,单位为“度数”。如果2个参数之差大于等于360度,则表示没有范围限制。 FIRST_COMPLETE事件后调用。
ModelViewer
  
updateZRange(_getNear:Number = 50, _getFar:Number = 300):void
限制摄像机远近Z方向可伸缩的范围,范围为负无限到正无限。 FIRST_COMPLETE事件后调用。
ModelViewer
  
updateZClipping(_getMinZ:Number = -3000, _getMaxZ:Number = 3000):void
设置最远最近能显示的区域,超出这个区域,模型就会被切断不显示。这个用在超大场景提高效率上. FIRST_COMPLETE事件后调用。
ModelViewer
  
autoRotate(_getAngel:Number = 1, _getAxis:String = "z"):void
默认摄像机自动绕轴旋转。目前只能绕Z轴,也就是竖轴旋转。第一个角度参数设为0,就可终止自动旋转。 FIRST_COMPLETE事件后调用。
ModelViewer
  
setCameraPosition(_getHorizontal:Number, _getVertical:Number, _getDistance:Number,_isTween:Boolean=false):void
直接设置摄像机位置, 如果是默认摄像机3个参数分别为横方向度数,竖方向度数和离目标的远近。
如果目前摄像机为漫游摄像机,3个参数则为摄像机的xyz. 第4个参数为是否渐变的平移到位置,还是直接切换到位置。
ModelViewer
  
获取摄像机位置。 返回一个数组,[0]为横方向度数,[1]为竖方向度数,[2]为离目标的远近.
如果目前摄像机为漫游摄像机,则返回数组有6个数[0][1][2]为摄像机的xyz, [3][4][5]为摄像机的xyz旋转。 FIRST_COMPLETE事件后调用。
ModelViewer
  
setCameraTarget(offsetX:Number, offsetY:Number, offsetZ:Number):void
设置摄像机对准的模型,可以动态的切换摄像机对准的位置,3个参数为以对准模型为中心的XYZ偏移。用户可以通过设置达到对某模型特定部分的观看,也可以制作“镜头切换”效果. FIRST_COMPLETE事件后调用。
ModelViewer
  
setCameraInertia(_getInertia:Number):void
设置默认摄像机拖动时的惯性,建议0-10. 数值越大镜头滑动越久 FIRST_COMPLETE事件后调用。
ModelViewer
  
setCameraMouseWheelSpeed(_getSpeed:Number=5):void
控制鼠标滚轮对缩放镜头的速度。FIRST_COMPLETE事件后调用。
ModelViewer
  
setCameraMode(_isMode:String):void
切换摄像机。参数目前可以是"drag","move". 以后还会有其他摄像机。
参数如果是"drag"则为旋转摄像机。 参数如果是"move"则为漫游摄像机。 漫游摄像机目前默认就可以移动,完全不用自己写移动代码了,但对高端程序员用户少了一定灵活性。 FIRST_COMPLETE事件后调用。
ModelViewer
  
getCameraMode():String
获取目前是什么摄像机。返回的参数为"drag","move". 以后还会有其他摄像机。
如果是"drag"则为旋转摄像机。 参数如果是"move"则为旋转摄像机。 FIRST_COMPLETE事件后调用。
ModelViewer
  
showObj3DName():Array
查看当前场景中所有模型的名字,返回一个Array,包含所有模型名。 每次MODEL_CHANGE事件后调用。
ModelViewer
  
setRenderGap(_getGap:int=0):void
设置渲染间隔,比如2帧渲染1次。用户可以按自己需求处理效率和效果的平衡,间隔越小,画面越流畅但CPU消耗越大;间隔越大越不流畅但CPU消耗越小。FIRST_COMPLETE事件后再调用。
ModelViewer
  
allowRender(_getBoolean:Boolean = false):void
是否允许渲染,用户可自己控制是否暂时停止渲染。 FIRST_COMPLETE事件后再调用。
ModelViewer
  
takeSingleShot():BitmapData
截取目前的3d渲染屏幕成为一个位图图片,返回一个bitmapData,可以用于生成bitmap。 MODEL_CHANGE事件后调用。
ModelViewer
  
updateBackground(_getBitmapData:BitmapData):void
更换背景图,使用BitmapData。
ModelViewer
  
updateBackgroundColor(_getColorCode:int=0x808080):void
更换背景颜色。
ModelViewer
  
disableMouseDrag(_getBoolean:Boolean):void
禁止默认摄像机点击拖动。
ModelViewer
  
addCollision(_getCollisionModelAddress:String):void
读取一个flb文件作为漫游摄像机的碰撞体,模拟漫游时的墙体限制等等。作为addCollision的flb文件必须是简单立方体,如果需要弧形碰撞,请用小一些的立方体构成弧形型。贴图无意义。详细参考美工小贴士。
ModelViewer
  
addLight(_getName:String, _getColor:int,_getX:Number=0,_getY:Number=0,_getZ:Number=0):void
添加灯光,最多不要超过3盏。 注意:必须开启3d加速下才能使用
ModelViewer
  
setObj3DShader(_getObjName:String, _getShader:ModelViewerShader):void
变更指定模型的材质。注意材质和贴图是不同的,贴图是材质包含的其中一个属性。 材质通常要配合灯光才能表现出效果。注意:必须开启3d加速下才能使用
变更材质很复杂,所以需要调用新的一个类,模型展示包的材质信息类-ModelViewerShader,使用方法见下面详细内容。
ModelViewer
事件
  事件Defined by
  
第一次读取完成后,会返回一个FIRST_COMPLETE事件
Flab3dEvent
  
侦听第一次建立模型展示器的读取进度,用evt.data.progressRate获取进度,是一个0-1的小数。
Flab3dEvent
  
每次读取完成模型时,会反馈一个MODEL_LOAD_COMPLETE事件。
Flab3dEvent
  
侦听读取模型的读取进度,用evt.data.progressRate获取进度,是一个0-1的小数。
Flab3dEvent
  
点击模型时,会反馈一个MODEL_CLICK事件。evt.data.name获取的模型名
Flab3dEvent
  
鼠标按下模型时,会反馈一个MODEL_DOWN事件。evt.data.name获取的模型名
Flab3dEvent
  
鼠标放上模型时,会反馈一个MODEL_OVER事件。evt.data.name获取的模型名
Flab3dEvent
  
鼠标移开模型时,会反馈一个MODEL_OUT事件。evt.data.name获取的模型名
Flab3dEvent
  
使用setObj3DMaterial方法更换贴图时,会返回MAP_LOAD_PROGRESS读取进度。用evt.data.progressRate获取进度,是一个0-1的小数。
Flab3dEvent
  
使用setObj3DMaterial方法读取贴图完成后,返回完成事件。
Flab3dEvent
  
使用addCollision方法加入碰撞体时,会返回COLLISION_LOAD_PROGRESS读取进度。用evt.data.progressRate获取进度,是一个0-1的小数。
Flab3dEvent
  
使用addCollision方法读取完碰撞体后,返回完成事件。
Flab3dEvent
事件
FIRST_COMPLETE 事件

第一次读取完成后,会返回一个FIRST_COMPLETE事件。大部分方法都需要在侦听此事件后调用。
侦听方法:.addEventListener(Flab3dEvent.FIRST_COMPLETE, 方法);



FIRST_LOAD_PROGRESS 事件

侦听每组模型的读取进度。
用evt.data.progressRate获取进度,是一个0-1的小数。
侦听方法:.addEventListener(Flab3dEvent.FIRST_LOAD_PROGRESS, 方法);



MODEL_LOAD_COMPLETE 事件

每次读取完成模型时,会反馈一个MODEL_LOAD_COMPLETE事件。
侦听方法:.addEventListener(Flab3dEvent.MODEL_LOAD_COMPLETE, 方法);



MODEL_LOAD_PROGRESS 事件

侦听读取模型的读取进度,用evt.data.progressRate获取进度,是一个0-1的小数。<
侦听方法:.addEventListener(Flab3dEvent.MODEL_LOAD_COMPLETE, 方法);



MODEL_CLICK 事件

点击模型时,会反馈一个MODEL_CLICK事件。evt.data.name获取的模型名
侦听方法:.addEventListener(Flab3dEvent.MODEL_CLICK, 方法);



MODEL_DOWN 事件

鼠标按下模型时,会反馈一个MODEL_DOWN事件。
evt.data.name获取的模型名
侦听方法:.addEventListener(Flab3dEvent.MODEL_DOWN, 方法);



MODEL_OVER 事件

鼠标放上模型时,会反馈一个MODEL_OVER事件。
evt.data.name获取的模型名
侦听方法:.addEventListener(Flab3dEvent.MODEL_OVER, 方法);



MODEL_OUT 事件

鼠标移出模型时,会反馈一个MODEL_OUT事件。
evt.data.name获取的模型名
侦听方法:.addEventListener(Flab3dEvent.MODEL_OUT, 方法);



MAP_LOAD_PROGRESS 事件

使用setObj3DMaterial方法更换贴图时,会返回MAP_LOAD_PROGRESS读取进度。
用evt.data.progressRate获取进度,是一个0-1的小数。 侦听方法:.addEventListener(Flab3dEvent.MAP_LOAD_PROGRESS, 方法);



MAP_LOAD_COMPLETE 事件

使用setObj3DMaterial方法读取贴图完成后,返回完成事件。
侦听方法:.addEventListener(Flab3dEvent.MAP_LOAD_COMPLETE, 方法);



COLLISION_LOAD_PROGRESS 事件

使用addCollision方法加入碰撞体时,会返回COLLISION_LOAD_PROGRESS读取进度。用evt.data.progressRate获取进度,是一个0-1的小数。 侦听方法:.addEventListener(Flab3dEvent.COLLISION_LOAD_PROGRESS, 方法);



COLLISION_LOAD_COMPLETE 事件

使用addCollision方法读取完碰撞体后,返回完成事件。
侦听方法:.addEventListener(Flab3dEvent.COLLISION_LOAD_COMPLETE, 方法);







构造方法
ModelViewer() 构造方法
public function ModelViewer(_getStage:DisplayObject,_rootPath:String ,_width:int=640, _height:int=480, _getAllowGPU:Boolean=false)

建立一个模型浏览器。
代码范例如下:
var mv:ModelViewer = new ModelViewer(this.stage,"./",640,480);

第1个参数为目前的stage,第2个参数为根目录, 第5个参数为是否启用3d加速。如果是网页项目最好不要开启显卡,因为你不知道你的用户的电脑是否能加速。如果是单机则任意。如果是iphone,ipad,安卓系统的移动设备,则必须开启3d显卡加速。第6个参数为指定本程序运行的平台,可以是"web","android","ios"(注意和以前的版本不同)


参数
_getStage:DisplayObject— 为目前的stage。

_rootPath:String— 根目录地址。如果本地制作则填本地地址,如果是网页制作就填服务器存放地址。

_width:int— 模型浏览器的宽度

_height:int— 模型浏览器的高度

_getAllowGPU:Boolean—是否启用3d加速。如果是网页项目最好不要开启显卡,因为你不知道你的用户的电脑是否能加速。如果是单机则任意。如果是iphone,ipad,安卓系统的移动设备,则必须开启3d显卡加速。

_getPlatform:String— 指定本程序运行的平台,可以是"web","android","ios"




方法
addModel() 方法
public function addModel(_getModelAddress:String, _getName:String="", _getMapPath:String = "",_getSuffixName:String="", _getIsAnimated:Boolean=false, _getY:Number=100, _getHorizontal:Number=45,_getDistance:Number=200,_getMinZ:Number=40):void

添加一套模型场景。 参数1为flb文件地址,参数2为给整个模型场景一个名字,参数3为放贴图的文件包的地址,参数4为给所有这个场景的模型一个后缀名,参数5,6,7,8为读取后默认摄像机的位置。
FIRST_COMPLETE事件后调用。

参数
_getModelAddress:String—flb模型文件的相对路径
_getName:String—数2为给整个模型场景一个名字
_getMapPath:String = ""—模型对应的贴图包的相对路径
_getSuffixName:String=""—给本模型里所有子模型名加后缀。为了防止名字重复,用户可以指定后缀名以区分
_getY:Number=100—一开始摄像机的高度
_getHorizontal:Number=45— 一开始摄像机水平方向的旋转度数
_getDistance:Number=200—一开始摄像机距离物体的距离
_getMinZ:Number=40—摄像机距离物理的最近距离的限制。



removeModelByName() 方法
public function removeModelByName( _getName:String=""):void

按模型name删除一个模型或整个模型场景,必须要当前场景中或场景本身有此name。 FIRST_COMPLETE事件后调用。

参数
_getName:String—场景中模型或场景本身的名字



loadModelListXML() 方法
public function loadModelListXML(_getXMLAdress:XML):void

加入一个xml 列表来读取一组模型列表,然后通过updateModelById来方便切换. XML的声明格式如下:
private var myxml:XML=new XML(<flab3d>
<model id="0" source="asset/demo_model01.xml" mapSource="asset/mapdemo/"></model>
<model id="1" source="asset/demo_model02.xml" mapSource="asset/mapdemo/"></model>
<model id="2" source="asset/demo_model03.xml" mapSource="asset/mapdemo/"></model>
<model id="3" source="asset/demo_model04.xml" mapSource="asset/mapdemo/"></model>
</flab3d>);

参数
_getXMLAdress:XML—XML属性列表参数,格式见上面



updateModelById() 方法
public function updateModelById(_getId:int = 0):void

通过loadModelListXML设定的id来切换模型。注意1:必须要用过loadModelListXML才能使用, 注意2:本身就会调用addModel方法,所以不用重复使用addModel。

参数
_getId:int— xml列表中的id来切换模型



add3dTag() 方法
public function add3dTag(_getSprite:Sprite,_getName:String, _getSpriteWidth:Number=100,_getSpriteHeight:Number=100, _getX:Number=0, _getY:Number=0, _getZ:Number=0,width:Number=100, height:Number=100):void

动态的添加3d热点标签,可以添加任何sprite类型的元件作为热点标签。3d和2d标签的区别为,3d标签真的在3d场景中但无法交互,2d标签只是跟随3d场景运动并不是真的3d,但可以做任何sprite元件的交互。
FIRST_COMPLETE事件后调用。
和以前的版本不同,分成了2d和3d两种tag。

 

参数
_getSprite:Sprite— 要被用做热点标签的Sprite, 任意Sprite都可。

_getName:String—给tag一个名字

_getSpriteWidth:Number —sprite本身的宽度,输入自己sprite的高度即可

_getSpriteHeight:Number —sprite本身的高度,输入自己sprite的宽度即可

_getX:Number —热点标签在三维空间X轴方向的位置

_getY:Number —热点标签在三维空间Y轴方向的位置

_getZ:Number —热点标签在三维空间Z轴方向的位置

width:Number—3d tag本身想要的宽度

height:Number —3d tag本身想要的高度



add2dTag() 方法
public function add2dTag(_getSprite:Sprite, _getName:String, _getX:Number=0, _getY:Number=0, _getZ:Number=0,_withUpdate:Boolean=true):void

动态的添加2d热点标签,可以添加任何sprite类型的元件作为热点标签,相当有用的方法。3d和2d标签的区别为,3d标签真的在3d场景中但无法交互,2d标签只是跟随3d场景运动并不是真的3d,但可以做任何sprite元件的交互。
FIRST_COMPLETE事件后调用。 和以前的版本不同,分成了2d和3d两种tag。

 

参数
_getSprite:Sprite— 要被用做热点标签的Sprite, 任意Sprite都可。

_getName:String—给tag一个名字

_getX:Number —热点标签在三维空间X轴方向的位置

_getY:Number —热点标签在三维空间Y轴方向的位置

_getZ:Number —热点标签在三维空间Z轴方向的位置

_withUpdate:Boolean—此参数目前无意义



remove3dTagByName ()方法  
public function remove3dTagByName(_getName:String):void

按name移除3d标签。
FIRST_COMPLETE事件后调用。

 

参数
_getName:String— 要移除的tag的名字

remove2dTagByName ()方法  
public function remove2dTagByName(_getName:String):void

按name移除3d标签。
FIRST_COMPLETE事件后调用。

 

参数
_getName:String— 要移除的tag的名字

setObj3DPosition ()方法  
public function setObj3DPosition(_getObjName:String, tx:Number=0, ty:Number=0, tz:Number=0):void

设置模型组里某个模型的三维空间XYZ轴的位置,第一个参数为3dsmax里的模型名。
(如不清楚模型名可以用方法showObj3DName()获取当前模型组里所有模型的名字,详细见下面showObj3DName文档)
FIRST_COMPLETE事件后调用。


参数
getObjName:String— 3dsmax里的模型名
tx:Number— 模型在三维空间X轴方向的位置
ty:Number— 模型在三维空间Y轴方向的位置
tz:Number— 模型在三维空间Z轴方向的位置



setObj3DRotation ()方法  
public function setObj3DRotation(_getObjName:String, rx:Number=0, ry:Number=0, rz:Number=0):void

设置模型组里某个模型的三维空间XYZ轴的旋转,单位为“角度”,第一个参数为3dsmax里的模型名。
(如不清楚模型名可以用方法showObj3DName()获取当前模型组里所有模型的名字,详细见下面showObj3DName文档)
FIRST_COMPLETE事件后调用。

参数
getObjName:String— 3dsmax里的模型名
rx:Number— 模型在三维空间X轴方向的旋转
ry:Number— 模型在三维空间Y轴方向的旋转
rz:Number— 模型在三维空间Z轴方向的旋转



setObj3DScale ()方法  
public function setObj3DScale(_getObjName:String, sx:Number=1, sy:Number=1,sz:Number=1):void

设置模型组里某个模型的三维空间XYZ轴的缩放,第一个参数为3dsmax里的模型名。
(如不清楚模型名可以用方法showObj3DName()获取当前模型组里所有模型的名字,详细见下面showObj3DName文档)
FIRST_COMPLETE事件后调用。

参数
getObjName:String— 3dsmax里的模型名
sx:Number— 模型在三维空间X轴方向的缩放
sy:Number— 模型在三维空间Y轴方向的缩放
sz:Number— 模型在三维空间Z轴方向的缩放


getObj3DTransform ()方法  
public function getObj3DTransform(_getObjName:String):Array

获取某个模型的三维空间XYZ轴的移动,旋转和缩放。
返回的是一个9个元素的数组 [0]为X轴的平移,[1]为Y轴的平移,[2]为Z轴的平移,[3]为X轴的旋转度数,[4]为Y轴的旋转度数,[5]为Z轴的旋转度数,[6]为X轴的缩放,[7]为Y轴的缩放,[8]为Z轴的缩放。
FIRST_COMPLETE事件后调用。

参数
getObjName:String— 3dsmax里的模型名

 

setObj3DMaterial ()方法  
public function setObj3DMaterial(_getObjName:String, _getMap:*):void

动态更换本模型组某模型的贴图。
第二个参数可以为贴图地址String,也可以为读取好的贴图信息BitmapData
贴图图片接受jpg,png,bmp。
贴图的尺寸要特别注意,只能使用2的次方数,比如128*128, 512*512, 1024*1024等等
FIRST_COMPLETE事件后调用。

参数
getObjName:String— 3dsmax里的模型名
_getMap:*— 此参数可以为贴图地址String,也可以为读取好的贴图信息BitmapData


setObj3DBothSide ()方法  
public function setObj3DBothSide(_getObjName:String, _getBoolean:Boolean = false):void

设置本模型组中某模型,是否为双面渲染。
当您贴图背面的显示很重要时可以设置为true,但运行效率会下降。
FIRST_COMPLETE事件后调用。

参数
getObjName:String— 3dsmax里的模型名
_getBoolean:Boolean— 模型贴图是否双面显示


setObj3DVisible ()方法  
public function setObj3DVisible(_getObjName:String, _getBoolean:Boolean = true):void

设置本模型组中某模型,是否可见。
可以结合使用此方法制作“人物换装”或“组装机械”等功能。
FIRST_COMPLETE事件后调用。

参数
getObjName:String— 3dsmax里的模型名
_getBoolean:Boolean— 模型是否可见
updateVerticalRange ()方法  
public function updateVerticalRange(_getMin:Number = 0, _getMax:Number = 25):void

限制摄像机竖方向的范围,单位为“度数”,范围为-90到90.
FIRST_COMPLETE事件后调用。

参数
_getMin:Number— 摄像机竖方向最低可达到位置
_getMax:Number— 摄像机竖方向最高可达到位置


updateHorizontalRange ()方法  
public function updateHorizontalRange(_getLeft:Number = 0, _getRight:Number = 360):void

限制摄像机横方向的范围,单位为“度数”。
如果2个参数之差大于等于360度,则表示没有范围限制。
FIRST_COMPLETE事件后调用。

参数
_getLeft:Number— 摄像机横方向最左可达到位置
_getRight— 摄像机横方向最右可达到位置


updateZRange ()方法  
public function updateZRange(_getNear:Number = 50, _getFar:Number = 300):void

限制摄像机远近Z方向可伸缩的范围,范围为负无限到正无限。
FIRST_COMPLETE事件后调用。

参数
_getNear:Number— 摄像机Z方向拉近最近可达到位置
_getFar:Number— 摄像机Z方向拉远最远可达到位置


updateZClipping ()方法  
public function updateZClipping(_getMinZ:Number = -3000, _getMaxZ:Number = 3000):void

设置最远最近能显示的区域,超出这个区域,模型就会被切断不显示。这个用在超大场景提高效率上.
FIRST_COMPLETE事件后调用。

参数
_getMinZ:Number— 最近能显示的区域
_getMaxZ:Number— 最远能显示的区域


autoRotate ()方法  
public function autoRotate(_getAngel:Number = 1, _getAxis:String = "z"):void

摄像机自动绕轴旋转。目前只能绕Z轴,也就是竖轴旋转。
第一个角度参数设为0,就可终止自动旋转。
FIRST_COMPLETE事件后调用。

参数
_getAngel:Number— 每帧转动的度数
_getAxis:String— 目前此参数只能是"z",也就是绕竖轴旋转。


setCameraPosition ()方法  
public function setCameraPosition(_getHorizontal:Number, _getVertical:Number, _getDistance:Number,_isTween:Boolean=false):void

直接设置摄像机位置, 如果是默认摄像机3个参数分别为横方向度数,竖方向度数和离目标的远近。
如果目前摄像机为漫游摄像机,3个参数则为摄像机的xyz. 第4个参数为是否渐变的平移到位置,还是直接切换到位置。
如果目前摄像机为漫游摄像机,3个参数则为摄像机的xyz.

参数
_getHorizontal:Number— 摄像机所在位置的横方向度数
_getVertical:Number— 摄像机所在位置的竖方向度数
_getDistance:Number— 摄像机所在位置的Z方向距离,即是离目标的远近


getCameraPosition ()方法  
public function getCameraPosition():Array

获取摄像机位置。
返回一个数组,[0]为横方向度数,[1]为竖方向度数,[2]为离目标的远近.
如果目前摄像机为漫游摄像机,则返回数组有6个数[0][1][2]为摄像机的xyz, [3][4][5]为摄像机的xyz旋转。
FIRST_COMPLETE事件后调用。

参数


setCameraTarget ()方法  
public function setCameraTarget(offsetX:Number, offsetY:Number, offsetZ:Number):void

设置摄像机对准的模型,可以动态的切换摄像机对准的位置,3个参数为以对准模型为中心的XYZ偏移。
用户可以通过设置达到对某模型特定部分的观看,也可以制作"镜头切换"效果.
FIRST_COMPLETE事件后调用。

参数
offsetX:Number— 以对准模型为中心的X方向的偏移
offsetY:Number— 以对准模型为中心的Y方向的偏移
offsetZ:Number— 以对准模型为中心的Z方向的偏移


setCameraInertia ()方法  
public function setCameraInertia(_getInertia:Number):void

设置摄像机惯性,建议0-10. 数值越大镜头滑动越久。但越影响效率。
FIRST_COMPLETE事件后调用。

参数
_getInertia:Number— 滑动系数,建议0-10. 数值越大镜头滑动越久


setCameraMouseWheelSpeed ()方法  
public function setCameraMouseWheelSpeed(_getSpeed:Number=5):void

控制鼠标滚轮对缩放镜头的速度。
FIRST_COMPLETE事件后调用。

参数
_getSpeed:Number— 鼠标滚轮滑速度


setCameraMode ()方法  
public function setCameraMode(_isMode:String):void

切换摄像机。参数目前可以是"drag","move". 以后还会有其他摄像机。
参数如果是"drag"则为旋转摄像机。 参数如果是"move"则为漫游摄像机。
漫游摄像机目前默认就可以移动,完全不用自己写移动代码了,但对高端程序员用户少了一定灵活性。
FIRST_COMPLETE事件后调用。

参数
_isMode:String— 参数如果是"drag"则为旋转摄像机。 参数如果是"move"则为漫游摄像机。


getCameraMode ()方法  
public function getCameraMode():String

获取目前是什么摄像机。返回的参数为"drag","move". 以后还会有其他摄像机。
如果是"drag"则为旋转摄像机。 参数如果是"move"则为旋转摄像机。
FIRST_COMPLETE事件后调用。


showObj3DName ()方法  
public function showObj3DName():Array

看当前模型组中所有模型的名字,返回一个Array,包含所有模型名。如果制作模型时,对模型名称不清楚,可以用这个方法查询。
每次MODEL_CHANGE事件后调用。


参数


setRenderGap ()方法  
public function setRenderGap(_getGap:int=0):void

设置渲染间隔,比如2帧渲染1次。
用户可以按自己需求处理效率和效果的平衡。间隔越小,画面越流畅但CPU消耗越大;间隔越大越不流畅但CPU消耗越小。
FIRST_COMPLETE事件后再调用。

参数
_getGap:int— 间隔多少帧渲染一次


allowRender ()方法  
public function allowRender(_getBoolean:Boolean = false):void

是否允许渲染,用户可自己控制是否暂时停止渲染。
注:当模型浏览器内核需要强制渲染时,此方法无效。
FIRST_COMPLETE事件后再调用。

参数
_getBoolean:Boolean— 是否允许渲染


takeSingleShot ()方法  
public function takeSingleShot():BitmapData

截取目前的3d渲染屏幕成为一个位图图片,返回一个bitmapData,可以用于生成bitmap。
第二参数为保存bitmap的缩放大小,为0-1的小数。
MODEL_CHANGE事件后调用。


updateBackground ()方法  
public function updateBackground(_getBitmapData:BitmapData):void

更换背景图,使用BitmapData。

参数
_getBitmapData:BitmapData— 用户自己的背景,用bitmapData替换


updateBackgroundColor ()方法  
public function updateBackgroundColor(_getColorCode:int=0x808080):void

更换背景图,使用BitmapData。

参数
_getColorCode:int— 更换背景颜色。


disableMouseDrag ()方法  
public function disableMouseDrag(_getBoolean:Boolean):void

禁止拖动摄像机点击拖动。

参数
_getBoolean:Boolean— 禁止拖动摄像机点击拖动。


addCollision ()方法  
public function addCollision(_getCollisionModelAddress:String):void

读取一个flb文件作为漫游摄像机的碰撞体,模拟漫游时的墙体限制等等。
作为addCollision用的碰撞体的flb文件里,必须是简单立方体模型,最好为8个顶点的立方体。如果需要弧形碰撞,请用小一些的立方体排列成弧形。贴图无意义。
最好不要把正式的模型文件直接作为碰撞体。碰撞体导出前,必须freeze transform和把所有碰撞体的中心归位到每个物体的默认中心。

参数
_getCollisionModelAddress:String— 碰撞flb文件的地址


addLight ()方法  
public function addLight(_getName:String, _getColor:int,_getX:Number=0,_getY:Number=0,_getZ:Number=0):void

添加灯光,最多不要超过3盏。
要注意3d引擎的灯光和建筑渲染类的灯光不同,不能奢侈的添加太多,主要的效果任需通过贴图来表现,灯光只是辅助作用,用不好的话效果还不如完全不要灯光。
注意:必须开启3d加速下才能使用。

参数
_getName:String— 给予灯光一个名字
_getColor:int— 给予灯光颜色,灯光亮度也是靠颜色来调节
_getX:Number=0— 灯光的x方向的位置
_getY:Number=0—灯光的y方向的位置
_getZ:Number— 灯光的z方向的位置


setObj3DShader ()方法  
public function setObj3DShader(_getObjName:String, _getShader:ModelViewerShader):void

变更指定模型的材质。注意材质和贴图是不同的,贴图是材质包含的其中一个属性。 材质通常要配合灯光才能表现出效果。注意:必须开启3d加速下才能使用
要注意3d引擎的材质和建筑渲染类的材质不同,主要的效果任需通过贴图来表现,材质只是辅助表现贴图实在没法完成的效果,比如反射,凹凸,高光等等。
变更材质时,需要调用新的一个类:模型展示包的材质信息类-ModelViewerShader,使用方法如下:

var tempShaderDataObj:ModelViewerShader=new ModelViewerShader(); //实例化一个ModelViewerShader

tempShaderDataObj.hasLight=? //设置材质是否接受灯光影响。接受boolean属性的参数,=false时材质只显示贴图,和ambient=1时效果一致。

tempShaderDataObj.ambient=? //设置材质的自发光,0-1, 自发光越大,灯光对材质的作用就越小,自发光=1时,材质就没有任何光影效果了。

tempShaderDataObj.specular=? //设置材质的高光值,0-1, 高光越大,灯光的高光范围越大越亮

tempShaderDataObj.reflectBitmapData=? //设置材质的反射贴图,接受一个bitmapData属性的参数

tempShaderDataObj.reflectionAlpha=? //设置材质的反射贴图透明度,0-1,越大反射贴图越明显。

tempShaderDataObj.normalBitmapData=? //设置材质的法线贴图,通常用来表现物体的凹凸细节,接受一个bitmapData属性的参数

tempShaderDataObj.correctTransparent=? //png的贴图有个弊端,只能选择正确排列和正确透明其中一项,所以需要用户自己斟酌使用。=true时为正确透明但不正确排列。

tempShaderDataObj.bothSide=? //设置是否模型双面显示。 接受boolean属性的参数,=true时,材质为双面都显示的材质。

tempShaderDataObj.mapBitmapData=? //设置材质的贴图,和方法setObj3DMaterial的作用是一样的,接受一个bitmapData属性的参数

mv.setObj3DShader("模型名",tempShaderDataObj); //变更指定模型的材质信息


参数
_getObjName:String— 要变更材质的模型名
_getShader:ModelViewerShader— 设置好需要的材质,是一个ModelViewerShader类型的参数