《超简易papervision3D基础 第十一篇 转换绕旋轴和卡通材质》
DDM君 ,
Flab3D.com (允许转载,转载请注明)
常常有朋友会想要实现,或摄像机,或某物体绕另一个物体旋转的功能。其实它的思路非常简单。
另外讨论区有朋友询问是否能够卡通渲染,嗯…其实pv3d是有类似功能的。实事上卡通材质相对其他材质是一种耗资源较少的方法。但是卡通勾线却是没有适用价值非常耗资源的且效果很差的,希望明年内能有优良的卡通勾线功能,所以这里我们不讲解卡通勾线的问题。
原理解释:
转换绕旋轴的思路应该源于以前的三维动画架设师的技巧。以前我们的三维软件中没有移动pivot功能,三维架设师常常把此物体父籍给另一个物体,旋转另父物体,则可达成绕任意点旋转子物体的目的。
我们建立一个不可被渲染的虚拟DiaplayObject3D物体,把物体作为虚拟体的子物体,旋转虚拟体即可。注意,由于物体是虚拟体的子物体,那么他的,x,y,z都是相对虚拟物体的距离,我们可以看作是绕旋的半径。
目前建立带贴图的材质,步骤还稍稍有点麻烦。卡通材质需要两个东西,卡通材质和材质上的位图贴图。把这两个东西合在一起变成生成模型时能被接受的MaterialObject3D参数.
如果有朋友确实需要更方便的材质带贴图功能,可以发到讨论区,我们研究所会放出更方便的贴图功能。
这里下载源代码 这次在下不想加更多外部导入贴图的代码,所以手动在fla文件里导入了需要的位图贴图,并命名其类名为MyMap,继承自BitmapData。代码中我们可以直接new MyMap()来建立和使用,我们需要它作为BitmapData使用。
代码分析:
建立两个DisplayObject3D虚拟物体,我们可在他们之间互相切换sphere1
private var sphere1:Sphere;
private var do3d1:DisplayObject3D=new DisplayObject3D;
private var do3d2:DisplayObject3D=new DisplayObject3D;
凡是和材质有关的都必需要有光源,建立好了记住要加到场景里。
private var light1:PointLight3D=new PointLight3D();
建立卡通材质,4个参数分别是:1光源2亮部颜色3影部颜色4颜色段数
var shader1:CellShader= new CellShader(light1,0xffffff,0x555555,4);
注意下面这个不是我们平常用的BitmapFileMaterial哦,这个东西不能直接new BitmapMaterial(贴图地址),它只接受BitmapData参数。MyMap就是在下在fla文件中导入的位图的类名字,是个BitmapData。BitmapData的参数随便写两个什么整数作为长宽都可以,不清楚BitmapData可以查询flash帮助文档。
var bm:BitmapMaterial=new BitmapMaterial(new MyMap(256,256));
有了以上两个东西,就可以用ShadedMaterial把他们结合起来了,ShadedMaterial是一个MaterialObject3D,所以和一般的贴图是一样使用。
var shaded:ShadedMaterial= new ShadedMaterial(bm,shader1);
建立球体模型,ShadedMaterial被直接作为了第一个贴图参数。
sphere1=new Sphere(shaded,100,10,10);
再次强调一下,和flash2d一样,子物体的x,y,z是相对父物体来说的,所以这里x=200表示的是XZ平面绕行半径为200,而不是shpere1的绝对位置。
sphere1.x=200;
这里,在下建立了一个按钮来动态的切换绕行轴。如何建立按钮在下这里就不讲解了,不是flash3d的内容。
当点击按钮时,两个虚拟物体转换着将球体加为子物体继续旋转。记得要先从以前的父亲那里移除再加给另一个父亲。
if (sphere1.parent==do3d1) {
do3d1.removeChild(sphere1);
do3d2.addChild(sphere1);
} else {
do3d2.removeChild(sphere1);
do3d1.addChild(sphere1);
}
在enterframe里面加入两个虚拟体旋转的代码
do3d1.rotationY+=4;
do3d2.rotationY+=-4;
当然,除开那些建立按钮相关的类,这次需要导入的pv3d新类有:
import org.papervision3d.materials.BitmapMaterial;
import org.papervision3d.materials.shaders.CellShader;
import org.papervision3d.materials.shaders.ShadedMaterial;
import org.papervision3d.lights.PointLight3D;
这个使用材质的方法当然不仅限于卡通材质,任何材质都可以如此使用,只是细节上的不同而已。有什么心得都欢迎给我们分享,有问题
欢迎去讨论区。
想了解更多其他贴图用法,欢迎参考
《贴图,更深一点》。
这次的代码比以前的要麻烦很多,但请不要放弃,继续加油!
DDM君
Flab3D.comFlash3d研究所推荐的最新pv3d傻瓜包程序源代码 (无法右键另存,直接点击即可)