今天又发现Away3D存在的一个问题,加载的dae模型无法进行双面渲染。整整一天都被这个问题所困扰,耐着性子对它的Loader3D类和Collada类来来回回仔细的看了一番,对着Dae格式文件逐段分析,最后终于找到了问题所在。 要对DAE文件进行双面渲染,DAE文件中有一个节点
需要设置为1。但是为什么有的文件明明是
1
了,但是还是会被渲染为单面呢。 通过把away3D的例子中的mario_testrun.dae和我自己的DAE文件以及网上找来了其他DAE文件的比较,发现:有的DAE文件的双面渲染参数放置在
节点中(away3D例子中的mario_testrun.dae),3DSMAX输出的DAE文件的双面渲染参数却在
的
中(我用max输出的所有文件都是这样。 mario_testrun.dae的渲染参数位置
……
0
我的模型中渲染参数的位置
……
0
1
0
0
目前我所用的away3D 版本3.4.0似乎只对
节点中的渲染参数做了判断,不支持后一种。 打开你的Collada类将其中私有方法parseGeometry(geometryData:GeometryData)做以下修改可以解决上述问题: 修改前Collada类的parseGeometry方法: --------------------------------------------------------------------------------------------------------------------------------- …… private function parseGeometry(geometryData:GeometryData):void { …… // Double Side if (String(geometryData.geoXML["extra"].technique.double_sided) != "") geometryData.bothsides = (geometryData.geoXML["extra"].technique.double_sided[0].toString() == "1"); else geometryData.bothsides = false; …… } 修改后Collada类的parseGeometry方法: --------------------------------------------------------------------------------------------------------------------------------- private function parseGeometry(geometryData:GeometryData):void { …… // Double Side if (String(geometryData.geoXML["extra"].technique.double_sided) != "") geometryData.bothsides = (geometryData.geoXML["extra"].technique.double_sided[0].toString() == "1"); //修复双面渲染的Bug else { var materialName:String = geometryData.materials[geometryData.materials.length - 1].symbol; var geoMaterial:XML=collada["library_materials"].material.(@id == materialName)[0]; if( geoMaterial ) { var effectId:String = getId( geoMaterial["instance_effect"].@url ); var effect:XML = collada["library_effects"].effect.(@id == effectId)[0]; var doubleSides:String; if (effect&&effect.profile_COMMON.extra.technique.double_sided[0]) { doubleSides = effect.profile_COMMON.extra.technique.double_sided[0].toString(); geometryData.bothsides = (doubleSides == "1"); } else if (effect&&effect.extra.technique.double_sided[0]) { doubleSides = effect.extra.technique.double_sided[0].toString(); geometryData.bothsides = (doubleSides == "1"); } else geometryData.bothsides = false; } else geometryData.bothsides = false; } …… } 大功告成 ==!
Away3D中DAE模型无法双面渲染的解决方案
最新推荐文章于 2023-07-19 16:55:26 发布