之前的地址中的demo 没有出现模型, 估计是使用的 lib的问题, 导致load 模型解析失败. 本地是正常的说.
于是在这版直接嵌入了模型,同时加上骨骼绑定和第二摄像机.
地址: http://www.dreamfairy.cn/blog/work/flash/3d/everymounthgame01/bin-debug/FlareShadow.html
总结一下吧, 之前忘了总结了.
1.想模仿<天界>那样做一个2D的地图,于是试着创建一个 4000*4000的 plane 并贴上 4000*4000的位图, 显示的结果只有 2000*2000的位图被拉伸到 4000*4000了,翻阅资料后发现, 向GPU上传位图的时候,不支持超过2000的尺寸. 因此需要将位图切割并 创建4个 2000*2000的 plane进行组合.
2.在创建了水波效果后,试着创建了一个灯光,结果水波的贴图丢失了,无法渲染. 在错误日志中发现是寄存器不够用了. 于是找到水波的flsl文件,将不再使用的属性全部删除,给灯光shader留出位置. 所以对于创建的所有shader程序都要记得释放寄存器.
3.骨骼绑定,直接贴代码吧.
[cc lang=”actionscript3″ nowrap=”true”]
var skinnedMesh:Mesh3D = player.getChildByName( “astronaut”) as Mesh3D;
var weapon:Cube = new Cube( “weapon”, 10, .05, .05 );
weapon.rotateZ(90);
weapon.setPosition(0,-5,0);
weapon.addComponent( new BoneController( skinnedMesh, “Bip01 L Finger2” ) );
scene.addChild(weapon);
[/cc]
new BoneController 是一个自定义类,非官方API 借口是 IComponent. 内容如下.
在3d max中,选取模型后 该模型的名字为 astronaut. 所有的骨骼都在这个容器里. 因此先 getChildByName获得容器. 再通过 skinnedMesh.modifier.root.getChildByName( boneName ); 获取到骨骼, 返回的是一个 Pivot3D类型. 然后将这个我们定制的 weapon 添加到该骨骼上.
4.贴图更换,也是直接上代码.
var curSkin : Shader3D = player.getMaterialByName(“head”) as Shader3D;
首先可以通过材质的名称获取到该材质
然后通过 curSkin.filters[0].texture = new Texture(要替换的bitmapdata贴图); 来改变该材质的贴图.
5.GUI 我试着制作一个3D的UI,但是时间成本太高了,没有快速的解决方案,于是只好使用 starling. 虽然 starling可以在构造函数中设定使用的 stage3D层级. 但是flare3D本身却没有这样的方法. 因此这样会导致 starling会跟 场景出现渲染层级的冲突. 解决方案只有调用 flare3d 的 postRender 来延迟 flare3D的渲染,先调用 starling.nextFrame()来保证 GUI在最前.
6.flsl 是个好东西,把agal code 封装层 pixel bender的语法了,类似C++这样的高级语言, 使我很容易编写出自己想要的效果. 但是 real time shadow 一直很难实现, 会的人不多,但他们也都不肯轻易放出实现方法,原因我懂的. 那就让我自己研究吧.
记得前年暑假的时候,做过一个山寨恶魔城的游戏. 嘛~下个月就做 采用starling来复刻的版本吧~