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

教程

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

时间: 2024-10-30 02:07:01

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

Flash制作时钟的实例教程

核心提示:Flash制作时钟的实例教程. 本例为用Flash AS3.0制作时钟的实例教程,为Flash AS入门教程第八课的延伸教程,希望能给朋友们带来帮助. AS3.0实例教程二-时钟的制作 效果: 虽然制作时钟老套了点,但它确可以较全面地应用到时间日期和间隔等知识,仍不失为较好的入门练习. 一. AS3.0时间日期简介 时间和日期主要应用在读取时间日期和设置时间间隔两个方面.在AS3.0中时间日期仍然是用Date类来读取,与AS2.0相比3.0要获取时间日期更加方便一些.同样的要使用Dat

《Unity 3D NGUI 实战教程》一2.5 创建第一个UI

2.5 创建第一个UI Unity 3D NGUI 实战教程 2.5.1 创建一个2D UI 制作UI时,首先我们要创建UI的"根".在Unity顶部NGUI菜单中选择Create,然后选择2D UI,如图2.25所示. 创建完成后,我们能看到图2.26所示的景象,在Scene窗口中,NGUI自动生成了一个名为UI Root的物体,其中带有一个Camera作为子物体. 这个新生成的Camera,是NGUI生成的专门用来渲染UI的相机,当我们生成NGUI的UI Root时,就自动将生成的

《Unity 3D NGUI 实战教程》一2.3 制作第一个UI图集

2.3 制作第一个UI图集 Unity 3D NGUI 实战教程 2.3.1 学会解剖UI的资源结构 为什么要剖析UI的资源结构?因为通常情况下,策划设计好UI的功能和大概布局之后,美术人员会做出一张UI的成品效果图,我们称之为UI设计图.然后,客户端程序需要根据自己的制作方式,告诉美术人员如何分割出相应的UI元素提交给程序,以完成制作. 下面以图2.17所示的UI设计图作为例子来讲解分析.首先说明一点,客户端程序一定要同时拿到UI设计图和UI功能描述文档才能彻底知道这个UI会进行什么样的操作逻

《Unity 3D NGUI 实战教程》一2.4 制作第一个UI字体

2.4 制作第一个UI字体 Unity 3D NGUI 实战教程 2.4.1 为什么要制作UI字体 在游戏的项目开发中,字体是经常会用到的东西,因为游戏中不论是聊天.公告.提示语还是界面显示,都会涉及用程序来写字.一般来说,会有系统默认字体供我们使用,但是出于以下两个原因我们经常会需要制作独特的字体. 系统字体的风格和美观程度等无法满足我们的需求.一般来说,系统字体都比较死板.生硬,风格单一,经常无法满足项目需求.例如,我们希望游戏中所有文字都使用楷书来突出中国风,那么则需要我们自己植入楷书字体

photoshop制作漂亮的3d文字壁纸教程

photoshop制作漂亮的3d文字壁纸教程,在本教程中大家将学习到如何用PS创建多彩的3D文字效果. 在本教程中大家将学习到如何用PS创建多彩的3D文字效果.(这个教程不是特别完美 大家凑活着读吧) 创建一个1280×1024 px, 72 dpi的新文件(文件>新建).然后选择矩形工具(U)在整个工作区域中画一个矩形. 然后设置混合选项>渐变叠加.按下图设置: 然后选择自定义图形工具(U),选择下图的形状: 把它放在下图所示的位置: 按下图设置不透明度: 设置下图的混合选项: 你将得到如下

PhotoShop CS5制作转动的3D地球动画教程

教程主要使用Photoshop制作转动的3D地球动画教程,制作方法并不难,但是Photoshop CS5中的3D功能它对显卡的要求比较高, 大家也可以动手尝试制作一下属于自己的东东. 最终效果: 1.打开素材,使用矩形选框工具,绘制选区后,执行-编辑-填充,使用内容填充可以快速的把素材中的文字给处理掉,如图. 2.简单的处理完文字之后,复制一层,把背景层填充黑色,因为我们需要对地球素材还要做进一步调整.选择背景副本图层,点击鼠标右键, 选择图层的混合选项,找到混合颜色带,按住ALT键,移动滑块到

Flash MX 2004 ActionScript图文教程

教程 1.Flash MX 2004 ActionScript图文教程(十四) [2005-03-02]     2.Flash MX 2004 ActionScript图文教程(十三) [2005-03-02]     3.Flash MX 2004 ActionScript图文教程(十二) [2005-03-02]     4.Flash MX 2004 ActionScript图文教程(十一) [2005-03-02]     5.Flash MX 2004 ActionScript图文教

flash调用xml数据的教程

下面简单介绍flash调用xml数据的教程 一.建立XML对象:  var myXML = new XML();  二.引用XML文件:  myXML.load("pro.xml");  三.忽略空格: //默认的为false myXML.ignoreWhite = true;  四.处理XML对象的函数:  myXML.onLoad = function(success) { statements;}  五.pro.XML文件的内容  <products name="

Flash制作插按钮动画教程

   Flash是制作二维动画的一个常用软件,小北的这个教程详细的讲述了非常实用的插按钮方法~很实用的哦,希望能对大家有所帮助! 工具/原料 Flash CS3或以上 方法/步骤 1.打开Flash,新建一个文档,或者打开自己做的动画文件.(小北是打开自己做好的FL哦~)如图所示: 2.在场景中绘制按钮,并且储存为按钮元件,并双击进入按钮设置界面,设置好弹起,指针经过,按下,点击,如图所示: 3.返回场景,新建按钮图层,在需要插入按钮的那一帧插入停止动作,具体做法如下:(1) 将鼠标指针放在需要