今天又发现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模型无法双面渲染的解决方案
最新推荐文章于 2024-11-26 19:07:28 发布