快速导航:   教程资源  | 经典范例  | 友情链接  | 联系我们  | 官方微博
登陆 | 注册

 flash 3d 研究所
flash3d 研究所 pv3d 教程 研究所小贴士: 要光影吗?高级贴图吗?要抗锯齿吗?就得付出效率这个代价吧~










最近更新:
● Lourom阁下在讨论区里 回复“Digestion Of Protein...”(17:35:27)
● Lourom阁下在讨论区里 回复“Digestion Of Protein...”(17:34:10)
● Lourom阁下在讨论区里 回复“Digestion Of Protein...”(17:22:52)
浏览主题:《超简易papervision3D基础 第十一篇 转换绕旋轴和卡通材质》

《超简易papervision3D基础 第十一篇 转换绕旋轴和卡通材质》
DDM君 (2012-03-16 05:50:39)

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傻瓜包
程序源代码
(无法右键另存,直接点击即可)





flash 3d 研究所
(2008-12-27 22:27:23)
噢噢~~~ddm昆 满塞~~


flash 3d 研究所
(2008-12-30 14:48:38)
最近忙一些事情没来网站,今天回来了
突然发现换LOGO了,不错 呵呵


flash 3d 研究所
(2009-01-01 01:21:33)
呵呵 稀客稀客~~


flash 3d 研究所
(2009-01-05 11:45:43)
噢噢


flash 3d 研究所
(2009-03-28 19:31:52)
首先我要感谢DMM君~其次~我再测试这些文件时到了这个教程我遇上了一个问题!
private var map1:BitmapData=new MyMap(256,256);

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

test01.fla中的类是test01.

这其中的关系....




flash 3d 研究所
(2009-04-04 09:03:43)
貌似昨天服务器好像不正常


flash 3d 研究所
(2009-05-26 17:07:21)
DDM君,盼望你的新的文章,还有几个有连接的,但打开了是空页,不知道怎么回事啊


flash 3d 研究所
(2009-07-29 00:24:28)
是因为我们这个站浏览器兼容没有制作,所以目前只IE7上能正确显示。


flash 3d 研究所
(2009-08-08 16:53:38)
《贴图,更深一点》进不了了呀


flash 3d 研究所
(2009-11-19 14:14:31)
无意之间来到这,发现这里真是一个不错的地方,对于我们要学习PV3D的朋友来说真是个天堂,


flash 3d 研究所
(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不会增加内存负担?


flash 3d 研究所
(2010-09-02 18:07:06)
迟到不一定学不到,笨鸟不一定慢节拍


flash 3d 研究所
(2010-09-28 09:49:21)
用DAE模型,很卡呀


flash 3d 研究所
(2011-08-02 14:24:57)
迟到很久了


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

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

验证码:(为防止机器人骚扰,请麻烦输入验证码^_^)
  

(目前需登陆方可发表)


不想添加了