flash 3d flash3d 研究所 pv3d
登陆 | 注册  flash 3d 研究所
教程区





最近更新:
● fool_tiger阁下在讨论区里 回复“旋转摄像机的问题...”(09:40:55)
● fool_tiger阁下在讨论区里 回复“旋转摄像机的问题...”(09:19:42)
● webbise阁下在讨论区里 回复“交换链接...”(23:30:47)
正在浏览教程: 《超简易papervision3D基础 第十一篇 转换绕旋轴和卡通材质》
《超简易papervision3D基础 第十一篇 转换绕旋轴和卡通材质》
DDM君 , Flab3D.com (允许转载,转载请注明)

常常有朋友会想要实现,或摄像机,或某物体绕另一个物体旋转的功能。其实它的思路非常简单。
另外讨论区有朋友询问是否能够卡通渲染,嗯…其实pv3d是有类似功能的。实事上卡通材质相对其他材质是一种耗资源较少的方法。但是卡通勾线却是没有适用价值非常耗资源的且效果很差的,希望明年内能有优良的卡通勾线功能,所以这里我们不讲解卡通勾线的问题。







原理解释
转换绕旋轴的思路应该源于以前的三维动画架设师的技巧。以前我们的三维软件中没有移动pivot功能,三维架设师常常把此物体父籍给另一个物体,旋转另父物体,则可达成绕任意点旋转子物体的目的。
我们建立一个不可被渲染的虚拟DiaplayObject3D物体,把物体作为虚拟体的子物体,旋转虚拟体即可。注意,由于物体是虚拟体的子物体,那么他的,x,y,z都是相对虚拟物体的距离,我们可以看作是绕旋的半径。

目前建立带贴图的材质,步骤还稍稍有点麻烦。卡通材质需要两个东西,卡通材质和材质上的位图贴图。把这两个东西合在一起变成生成模型时能被接受的MaterialObject3D参数.
如果有朋友确实需要更方便的材质带贴图功能,可以发到讨论区,我们研究所会放出更方便的贴图功能。


这里下载源代码
这次在下不想加更多外部导入贴图的代码,所以手动在fla文件里导入了需要的位图贴图,并命名其类名为MyMap,继承自BitmapData。代码中我们可以直接new MyMap()来建立和使用,我们需要它作为BitmapData使用。
pv3d 教程
代码分析
建立两个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.com



Flash3d研究所推荐的最新pv3d傻瓜包
程序源代码
(无法右键另存,直接点击即可)


山紫水明
(2008-12-27 22:27:23)
噢噢~~~ddm昆 满塞~~
苹果
(2008-12-30 14:48:38)
最近忙一些事情没来网站,今天回来了
突然发现换LOGO了,不错 呵呵
fur3
(2009-01-01 01:21:33)
呵呵 稀客稀客~~
cxshabi
(2009-01-05 11:45:43)
噢噢
Hi-Fi
(2009-03-28 19:31:52)
首先我要感谢DMM君~其次~我再测试这些文件时到了这个教程我遇上了一个问题!
private var map1:BitmapData=new MyMap(256,256);

在这段中flex3 提示 MyMap未自定义?

test01.fla中的类是test01.

这其中的关系....


???
(2009-04-04 09:03:43)
貌似昨天服务器好像不正常
laidun
(2009-05-26 17:07:21)
DDM君,盼望你的新的文章,还有几个有连接的,但打开了是空页,不知道怎么回事啊
DDM君
(2009-07-29 00:24:28)
是因为我们这个站浏览器兼容没有制作,所以目前只IE7上能正确显示。
yuxing5
(2009-08-08 16:53:38)
《贴图,更深一点》进不了了呀
chenyin151
(2009-11-19 14:14:31)
无意之间来到这,发现这里真是一个不错的地方,对于我们要学习PV3D的朋友来说真是个天堂,
Greg
(2009-12-24 17:46:48)
if (sphere1.parent==do3d1) {
do3d1.removeChild(sphere1);
do3d2.addChild(sphere1);
} else {
do3d2.removeChild(sphere1);
do3d1.addChild(sphere1);
}
这样反复add,remove不会增加内存负担?

评论人:
邮   箱: (填入邮箱,博客地址均可)

内   容:
链接地址
(广告和垃圾内容可能会被删除,望理解)