毕业论文 论文提纲 论文写作 公文范例 教育论文 教育学论文 师范教育 学术论文     论文指导*
                     
 
   
   
   
   
           
 

当前位置:课件115学培吧(kj115.com)→flash网侠教程(助你成为顶尖课件高手)→系列文章

 
 
标题:Flash 实现3D的类(教程 源文件)
 
展示台

文章来源 作者:admin 密码:admin 整理:湖北金鹰

◇网侠教程栏目简介
    提供FLASH侠客教程和网页制作侠客教程,高手进阶教程。
    浏览过这些资源的还浏览过经典教程图文教程游戏开发教程等相关资源。

---------------

湖北金鹰课件吧

论文相关服务
 

 

下面就让我来具体阐述一下这些3D类的用法。
注意,首先得保证这些类文件和你的fla文件在同一子目录下或者在publishing settings里面做了
相应的类文件添加,否则实例不会成功。
首先要向大家介绍的是TVector3D这个类。
今天的这部分内容可能要求您有点向量的知识,而且比起以后的略显枯燥和缺乏实用性。 缺乏足够的耐性和暂时不想学习向量知识的人可以略过。
表达能力或许欠佳,望海涵。
3dclasses.rar
每一个TVector3D类的实例,表示的是一个3D空间的向量,因此它是三维的。我们用三元组(x,y,z)表示它们,因此每个TVector3D类的实例有3个属性,分别是x,y和z。
申请一个新的TVector3D类实例的方法是:
var 你的变量名 = new TVector3D(x的值,y的值,z的值);
举例:
var v = new TVector3D(1,1,1);//v现在是一个表示向量(1,1,1)的TVector3D实例。
然后,让我们看看TVector3D提供哪些重要的方法。
1.printf()
printf是用trace向output窗口以三元组的形式输出此向量,无需参数。
举例:
var v = new TVector3D(1,1,1);
v.printf();
运行以后,你会发现在output窗口里面输出了(1,1,1);
这个方法一般在 调试程序 的时候使用。
注:千万不要让你的眼睛受欺骗: 如果某个数为1.4342e-15或者5.45561234234142e-17,要记住,这就是0,而非一个不是0的浮点数 !
2.reset()
reset是为这个TVector3D向量重新赋值。
举例:
var v = new TVector3D(1,1,1);
v.reset(2,2,2);
v.printf();
运行以后你会发现output窗口输出的是(2,2,2)而不是(1,1,1)
3.getCopy()
getCopy 方法是将该向量自身复制,并传递给另外一个TVector3D向量。
举例:
var v = new TVector3D(1,1,1);
var v1 = new TVector3D(0,0,0);
v1 = v.getCopy();
v1.printf();
这时候运行output窗口输出的是(1,1,1)而非(0,0,0);
4.向量运算的方法:
(1) plusby
yourVector.plusby(b:TVEctor3D);
向量相加。需要一个参数b,b为与此向量相加的向量。
实例:
var v = new TVector3D(1,2,3);
var v1 = new TVector3D(3,2,1);
v.plusby(v1);
v.printf();
运行后输出(4,4,4)
(2)minusby
yourVector.minusby(b:TVector3D);
向量减法。需要一个参数b,b为与此向量相减的向量。
实例:
var v = new TVector3D(4,4,4);
var v1 = new TVector3D(3,2,1);
v.plusby(v1);
v.printf();
运行后输出(1,2,3)
(3)realmulby
yourVector.realmulby(k:Number);
和实数相乘。需要一个参数k,k为与此向量相乘的实数(Number)。
实例:
var v = new TVector3D(1,4,2);
v.realmulby(2);
v.printf();
运行后输出(2,8,4)
(4)dotproby
yourVector.dotproby(b:TVector3D):Number;
向量点乘。需要一个参数b,b为与此向量点乘的向量。有返回值,为实数(Number)。
实例:
var v = new TVector3D(1,2,3);
var v1 = new TVector3D(3,2,1);
var r:Number = v.dotproby(v1);
trace(r);
运行后输出 10
(5)crosspro
TVector3D.crosspro(a,b:TVector3D):TVector3D;
向量叉乘。静态方法。需要两个参数a和b,a和b为与需要作叉乘的向量。有返回值,为
TVector3D向量。
在此,让我们看一下静态方法与以上方法的差别。
其实,我只需要举一个例子。大家用Math类的函数的时候,怎么用?
是了,用如Math.abs()这样。 在这里也一样。对于静态方法,使用TVector3D.方法名()来调用。
实例:
var v = new TVector3D(4,4,4);
var v1 = new TVector3D(3,2,1);
var t = new TVector3D(0,0,0);
t = TVector3D.crosspro(v,v1);
t.printf();
运行后输出(-4 , 8 , -4)
5.len2()
yourVector.len2():Number;
返回当前向量的长度的平方。
我们应该认识到,很多时候我们更需要的不是向量的长度,而是它长度的平方。省掉一个耗时的开方运算,何乐而不为呢?
实例:
var v = new TVector3D(1,2,2);
var l:Number = v.len2();
trace(l);
输出为:9
6.rotate
yourVector.rotate(tx,ty,tz:Number);
这个方法是用来让你的向量绕某个坐标轴旋转,注意,是某个。
一般的,tx,ty,tz三个参数分别是绕相应的轴旋转的角度,其中一般至少有两个为0,也就是说,不要用同一次调用rotate方法来绕两个或三个轴旋转,如果要那样,应该分两或者三次调用。
tx,ty,tz使用角度制。
实例:
var v = new TVector3D(1,0,0);
v.rotate(0,90,0);//绕y轴旋转90度。
v.printf();
输出:(0,0,-1)
使用教程2
TParitcle3D.as粒子类。
这个实际上是robert penner的书上所提供的一个类。
剖析一下这个类先:
1. 创建类的实例。
如果我们想要创建一个这个类的实例,首先我们来看看它的创建函数:
function TParticle3D(x1:Number, y1:Number, z1:Number, dist1:Number, panel1:MovieClip, id1:String, mcname1:String, dep1:Number)
去掉类型的说明:
function TParticle3D(x1, y1, z1, dist1, panel1:, id1, mcname1, dep1)
因为参数较多,所以创建的时候要留神,不要弄错。
先看一下每个参数的作用:
x1,y1,z1:这三个实数(Number)表示的是你要创建的粒子在坐标系中的位置。
dist1,描述的是观察者的眼睛到xOy这个平面的距离。距离的取值是正实数。注意,距离越小,表示你看到的物体的“透视”效果越明显,越大表示你看到的物体的“透视”效果将越不明显。 一般的,如果你想要较明显的透视,选择250~300的某个值,而取1000时,透视效果比较不明显。 如果取3000,说明你不想要透视效果。
panel1:这个参数是一个电影剪辑(MovieClip, mc),用来放置将要绘制出的3D粒子。一般来说,是一个空的电影剪辑。所以,我们经常需要在创建一个TParticle3D类的实例之前,用creatEmptyMovieClip先创建一个空的电影剪辑(mc),再作为参数传递。
id1:这是一个字符串型的参数。它表示的是你将要作为“粒子”attach到屏幕上的那个电影剪辑(mc)的ID。 我们使用attachMovie的时候,当中的那个ID,和这里的这个id意思是一样的。因此,将你的粒子mc的Id先设置好,因为它将被attach。设置的方法是:右键点击库中的粒子mc,选择Linkage...,勾选EXPort for ActionScript, 然后
在上面的Identifier里为它命名。这个命名结果就是ID。
mcname1:你所要创建的那个新的粒子的实例名称。字符串型(String);
dep1:整数,创建的mc的深度。
2. rotate(a,b,c);
这个方法的三个参数都是实数,分别表示绕x,y,z轴转动的角度。
一般地,我们可以认为a,b,c三个中至少有两个为0,理由和上一篇中关于TVector
3D类中的rotate()方法一样。
3.rotateAxis:这个方法不是Robert Penner的类里面本来有的,是我后来添加的。作用是绕特定轴旋转,在此不做详细介绍。
4.render();
这个是一个至关重要的方法!!!
我们前面创建一个类实例,只是一个逻辑上面的东西。 创建完了以后怎么样在屏
幕上出现动画呢?
render()方法处理的就是根据这个粒子的位置,在屏幕上相应的位置“画”出相应的粒子(就是那个粒子mc)。如果仅仅创建了一个类而并不进行render(),那么什么也不会看到。如果进行了修改( 比如旋转(rotate) )而不render(),则改动不会在屏幕上显示出来。而动画,就是不断地修改,不断地render()所表现出来的。
ok,介绍完了类,让我们看一个实例:
首先,创建一个mc,比如一个球。 保证它的圆心在0,0点。为它加上ID,比方"ball"。
然后,我们需要创建空的mc:
_root.createEmptyMovieClip("p",1);//创建一个空mc,名字是p
p._x = 275;
p._y = 200;//因为大多数flash电影的Stage设定为550*400,这两句把mc放到
stage画布的中央。
继而,创建TParticle3D的实例,实例名不妨叫par:
var par = new TParticle3D(0,-40,-80,300,_root.p,"ball","a",1);
这个实例对应的粒子在坐标系中的位置是(0,-40,-80),我们观察者距xOy平面距离为300,有较强的透视效果(近大远小)。 它的父mc是_root.p,就是我们刚刚创建的空mc。 "ball"是我们的粒子mc的ID,前面刚刚设定的。 "a"表示这个"ball"被放到画布上以后的实例名为"a",1表示a这个mc的深度。
这个时候,你运行一下,会发现屏幕上没有任何东西。为什么呢? 对了,render!
然后,准备就绪,可以render()了。
加上一句:
par.render();
这个时候运行,是不是发现可以看到那个球了呢?
下面我们来让它运动!和很多AS动画一样,我们不妨使用onEnterFrame这个事件句柄。
以上代码总和:
_root.createEmptyMovieClip("p",1);
p._x = 275;
p._y = 200;
var par = new TParticle3D(0,-40,-80,300,_root.p,"ball","a",1);
par.render();
_root.onEnterFrame = function(){
par.rotate(0,5,0);
par.render();
}
运行就能看到旋转的效果了。
如果觉得运动不平滑,可以用setInterval。关于setInterval的用法可以查看帮助或者搜索浏览旧帖子。
代码改成:
_root.createEmptyMovieClip("p",1);
p._x = 275;
p._y = 200;
var par = new TParticle3D(0,-40,-80,300,_root.p,"ball","a",1);
par.render();
function checker(){
par.rotate(0,4,0);
par.render();
updateAfterEvent();
}
var timer1:Number = setInterval(checker,30);
tparticle.rar
tparticlesetinterval.rar
框架类(上)
TFrame.as 还是那句话,在例子的制作中,确保fla和.as在同一个目录下或者.as和fla有关联。
所谓框架类,实际上是由多边形构成的多面体类。因为是由线段构成图形,看上去只是一个多面体的框架,因此称作框架类。学完了这个,就能方便地创建框架立体图形,比方说正方体,正四面体等等。
剖析一下这个类先:
1. 创建类的实例。
如果我们想要创建一个这个类的实例,首先我们来看看它的创建函数:
function TFrame(n1:Number, v1:Array, d1:Number, e1:Array, back1:MovieClip, color1:Number, dist1:Number)
去掉类型的说明:
function TFrame(n1,v1, d1, e1, back1, color1, dist1)
这些参数当中:
n1:是整数。 它表示框架一共有多少个点。
v1:是一个数组。它的每一个元素都是一个TVector3D类实例(TVector3D,向量类),表示这个点在坐标系中的坐标。v1一共有n1个元素,下标从v1[0]一直到v1[n1-1];
d1:整数。表示框架的边数。每个线段称为一条边(edge)。
e1:数组。e1用来描述每一条边。e1的每一个元素都是一个“记录”,我们可以把它看成是一个object。每个元素有两个属性,a和b,是两个整数,分别表示这条边所连接的两个点(a、b的值表示对应点在v1中的索引(下标))。e1一共有d1个元素,下标从e1[0]到e1[d1-1]。
back1:类型是影片剪辑。表示用来盛放这个框架的mc,一般地,是一个空的mc。所以我们经常需要在创建一个框架类实例前申请一个空mc:createEmptyMovieClip();
color1:表示框架的颜色。 可以用十进制数(会很烦),也可以用十六进制数(和AS中原来表示颜色的方法一样,推荐)如0x000000表示黒。
dist1:距离,在上篇的“创建类实例”中讲过,不再赘述。
这个时候,创建一个框架类只需要:
var 你的变量名 = new TFrame(n1,v1, d1, e1, back1, color1, dist1);
就可以了。
如:
var myFrame = new TFrame(8,v1, 12, e1, _root.p, 0x000000, 1000);
2.类的方法:
还是render和rotate,不再赘述。
下面就让我们看看如何使用框架类作出一个立体的正方形,注意,是正方形(注:所有代码放到第一帧)。
首先,把四个点的位置放到数组里面,这里的数组为v。
PHP代码:
v = [];
v[0] = new TVector3D(50,-50,0);
v[1] = new TVector3D(50,50,0);
v[2] = new TVector3D(-50,50,0);
v[3] = new TVector3D(-50,-50,0);//正方形的边长为100,以上为其四个点的坐标。正方形的中心在(0,0,0)
然后我们给出点对的关系,这些关系被存放在e数组中。稍时,e和v将作为参数传递给Tframe创建函数:
PHP代码:
e = [];
e[0] = {a:0,b:1};//这句话表示第零条边分别连接在v中编号为e[0].a = 0的点和编号为e[0].b = 1的这个点。以下类推。
e[0] = {a:1,b:2};
e[0] = {a:2,b:3};
e[0] = {a:3,b:4};
再为TFrame实例申请一个空的mc:
PHP代码:
_root.createEmptyMovieClip("p",1);
p._x = 275;
p._y = 200;//将mc居中
然后开始申请TFrame实例,并且render一下使它出现在屏幕上面。
PHP代码:
var f0 = new TFrame(4,v,4,e,_root.p,0xFF0000,300);
f0.render();
至此,正方形的创建就完成了,如果要添加用键盘方向键旋转的效果,加上如下代码(就不详细介绍了,如果读不懂程序再细说):
PHP代码:
function checker() {
if (Key.isDown(Key.UP)) {
f0.rotate(-3, 0, 0);
f0.render();
}
if (Key.isDown(Key.DOWN)) {
f0.rotate(3, 0, 0);
f0.render();
}
if (Key.isDown(Key.LEFT)) {
f0.rotate(0, 3, 0);
f0.render();
}
if (Key.isDown(Key.RIGHT)) {
f0.rotate(0, -3, 0);
f0.render();
}
updateAfterEvent();
}
var timer1:Number = setInterval(checker, 30);
正方形.rar
友情提示:把.fla放在同一个目录里,然后把所有的as放在那个目录里就可以了。注意生成的swf不需要依赖它所使用的类。
正方形的例子中,使用的是TVector3D,TVector和TFrame

 

 
课件115学培吧(湖北金鹰)欢迎您!永久免费服务网址:http://www.kj115.com
   
 

学员众多的FLASH课件学习基地,成万免费FLASH课件制作教程在线学习,还有免费内容课件教程、视频教程、课件技巧、课件探讨、课件欣赏、课件展示、实用教程、课件界面、课件脚本、课件游戏、课件下载、课件封面、课文内容图片、课文人物图片库、课件素材、图片素材、声音素材、动物素材、背景图片、背景资料、背景边框、课件顶栏图片素材、Dreamweaver教程、Dreamweaver网页课件教程、软件下载。承接学习和培训,承接课件订制,课件修改等所有课件相关服务。
本站主要业务:┃flash课件制作视频教程培训┃承接全国竞赛flash课件┃论文代写代发┃代办课件国家级获奖证书┃
联系:QQ:444860709 手机:13339817386


 
 

业务办理
鄂ICP备08005724号