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