第一次使用Papervision3D

分享Flash3DPapervision3D by 达达 at 2007-05-29

上星期六帮朋友做了一个3D的Flash程序,他的客户需要可以让网站用户可以在线定制马克杯,我想这样的应用使用3D是再好不过的了,正好我前段时间找到一个不错的Flash 3D引擎Papervisio3D,于是打算用它来做。

一开始心里很没底,因为我没有做过3D的应用,更不用说做WEB上的3D应用了。还好找到一个很好的入门老师,让我省下非常非常多的时间。

按教程上说的安装3Ds MAX和TortoiseSVN还是比较顺利的。但是折腾3Ds MAX花掉我半天多工夫,从早上开始要弄Papervision3D开始折腾到下午差不多4点多,中间安装了3Ds MAX 8.0,又卸载掉,再下载3Ds MAX 9.0,最后又安装3Ds MAX 8.0.....还好我耐心极佳....

为什么装3Ds MAX的插件花我这么长时间呢。原来是我装错了插件。Feeling Software网站上有一个3Ds MAX plug-in 又有一个Collada MAX。结果我载了3Ds MAX plug-in下来一直装,就是看不到导出Collada文件的选项,所以在折腾了很久。大家记得不要载错了 :-(

花我时间第二多的是3D模型,我不是第一次做3D模型,但是第一次正经的做3D模型,而不是试试3Ds MAX的效果。不过做杯子其实没花我太多时间,一个管状体加一个环状物就成了,呵呵。花我时间比较多的是调用Papervision3D将模型显示出来。

一开始载入杯子模型的.dae文件,然后用教程里的代码渲染 (我只是简单换上我的模型)。结果运行会出错,说没有正常加载什么的。于是我研究起那段代码,代码的贴图部分有说到,模型的材质贴图名称要和我们程序里面给的材质贴图名称是一致的。

// create an object containing the material(s)
myMaterials = {
    // the property name needs to correspond with the name you gave it
    // in 3ds Max. you can also look it up in the collada (*.dae) file:
    // 
    myPhotoMaterial: new BitmapMaterial( myPhotoMaterial.bitmapData)
};

于是我用文本编辑器打开.dae文件,发现我的材质贴图并不是叫myPhotoMaterial。于是我手动修改了.dae中材质贴图名称。再运行程序,果然不会出错了。但是并没有看到贴图,而且显示出来的那东西根本不像是杯子,看起来就像被破坏掉的3D模型,我心想不会是Papervision3D对Collata文件还支持不好,复杂点的就不能正常显示了?不过比较有可能的是Camera的位置太近造成的,为什么会有这样直觉呢?我也不知道,大概3D游戏玩多了,变成跟Nio一样了,呵呵。果然被我料中,将Camera的位置调远了就正常显示了 :-D ,当时还真是兴奋了一下 (当然不是一下就成功的,我逐渐调大了Z轴、X轴、Y轴数值后才得到的结果)。

不过贴图问题还没有解决呢,没贴图用户怎么用,更不用说自定义贴图了。于是我进3Ds MAX里看材质贴图名称怎么改,原来就是添加材质贴图时默认为01 - Default的那个选框,那是可以修改的。

img1.png

改好名字后导出来,我的杯子就能正常显示贴图了 :-)

花我时间第三多的就是用户自定义贴图了。我把原先的程序搬到Flex下,可以正常显示,但是做自定义贴图时遇到了一个很大问题,我不知道怎么把图片载下来变成Bitmap。咋想来这个过程好像理所当然,但是实际做起来,如果没有在Flex中这么做过的,你还真摸不着头脑。一开始我试了URLLoader,栽下来后,把data属性转成BitmapData类型,再实例化Bitmap,结果不行,贴图显示会很诡异,就算改了URLLoader的dataFormat也不行。最后我试了Loader,Loader和Bitmap是同一个祖宗。不过最后发挥作用的是Loader的content属性,我把content强制转化成Bitmap类型就正常显示了,content属性是DisplayObject类型和Bitmap的血缘关系更近,呵呵。

结果呢,花我最少时间的是写3D的代码,呵呵。Papervision3D的调用代码还是很容易理解的。

我的演示程序: