分享
 
 
 

Flash 实现3D的类(教程 源文件)

王朝other·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

下面就让我来具体阐述一下这些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);

[1] [2] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有