Flash教程三维引擎初探(锦集6篇)由网友“LML”投稿提供,以下是小编精心整理的Flash教程三维引擎初探,供大家参考借鉴,希望可以帮助到有需要的朋友。
篇1:Flash教程三维引擎初探
本文将介绍的是一个简单的实时3D引擎,并以此向大家阐明一种用Action Script在Flash二维的世界里表现三维对象的方法,先看看一个线描的简单实例,这是一个三棱锥绕自己的一条棱旋转的动画。
基本原理:我们所生活的世界是一个由x,y,z轴(也就是长宽高)组成的三维世界,要在一个二维平面上表现出三维的信息,我们首先必须要去掉三个坐标轴中的一个,z轴(表示物体深度的轴)。此外,我们还必须要选择一个视点,也就是代表观察者眼睛的一个点,和一个用于投影三维物体所有点的视平面,也就是我们所看见的那个面。然后,从三维物体上每个点到视点之间连线和视平面的交点就是该点在视平面上所应在位置。看了上面的一长串话是否有点头晕?没关系,请看看下面的那张图。
从图中我们可以看出当视点和物体AB位置不变,如果视平面S离物体AB越近,那么物体AB在视平面S上的投影A'B'(即我们所看到的对象)就越大。
实例:知道大致原理后,我们来看个三棱锥的例子。为了简单起见,我们假设视点,也就是眼睛的位置,是处于z轴之上的;另外,视平面S平行于x,y轴。
预备
新建一个Flash文件,并新建两个层,分别命名为actions和modal。新建一个图形元件(Graphic Symbol)并将之命名为line,在此元件中画一条沿45度角斜向右下方的直线并将之长宽皆设为100。
在actions层中插入9帧空白关键帧,并依次命名为modal info,init,start,loop,drawline,draw,rotx,roty和rotz。在modal层上插入4帧,然后将line元件从Library中拖到舞台上并将此实例命名为baseline。
一、模型定义
使用某种编码方式将我们所要进行操作的三维对象表示出来的就是本步骤要做的。在这里,我们只建立简单的框架三维模型,所以只定义模型顶点以及点与点之间的线就够了。
1.1 定义点
在三维坐标系中的每个点都对应维一的一组x,y,z坐标量。因此,我们可以建立一个变量,比如叫points,并使用下面的编码方式来存放各点的坐标值:
“
”
其中
代表第n个点的坐标,每个坐标值以三位数字来表示,即,12编码为012;1编码为001;点(33,1,0)编码为(033,001,000)。
然后,为了让每组坐标看起来清晰点,将每个点的坐标之间以一个字符R(其实随便什么都可以)来分隔。此外,还要定义一个变量,比如说叫totalpoints,来确定总的点数。
1.2 定义线
很早以前老师就告诉我们两点确定一条直线这个道理。根据这个老道理,我们只要确定两个端点的坐标值便能确定一条线段。所以,我们可以生成一个变量,比如叫lines,并使用跟上面定义点相类似的编码方式来存放各条线的定义:
“
”
其中
代表第n条线段的两个端点坐标,每个端点以两位数字来表示。例如,从顶点1到顶点5的线段就被编码为0105。这里你可能会发现,这个简易3D引擎只能最多定义99个点。如果你需要添加点数的话其实也很简单,只要增加用以表示每个端点的数字的位数即可。
同样的,你得建立一个用来确定总线段数的变量,比如叫totallines。
1.3 其它的变量
定义完了点和线,我们还得告诉引擎眼睛的位置(比如说eyez)以及视平面所处的深度(zorder)。视点(eyez)离物体越远,物体的透视效果就会越差。
1.4 构建三棱锥
用于构建模型的变量差不多都介绍完了,下面就在modal info帧中输入以下这段定义一个三棱锥模型的代码:
totalpoints=4;//四个顶点
points=“010,010,000R090,000,000R090,090,090R000,090,000”;//四个顶点的坐标
totallines=6;//六条边
lines=“0102R0103R0104R0203R0204R0304”;//六条边的定义
eyez=-500;//视点的位置
zorder=100;//视平面深度
二、构建引擎
这一步是整个程序的核心,完成了引擎差不多就等于完成了全部。
2.1 初始化
在开始真正的引擎前我们先来做一些初始化的工作——将所定义模型的信息转存到一个个单独的变量中。在init帧中输入以下代码:
setProperty (“/baseline”, _x, 1000);//隐藏原来的那条线
//下面的循环转存所有点的信息
for (i=1; i<=totalpoints; i++) {
set (“x” add i, substring(points, Number((i-1)*12+1), 3));
set (“y” add i, substring(points, Number((i-1)*12+5), 3));
set (“z” add i, substring(points, Number((i-1)*12+9), 3));
}
//下面的循环转存所有线的信息
for (i=1; i<=totallines;i++) {
set (“pt1” add i, substring(lines, Number((i-1)*5+1), 2));
set (“pt2” add i, substring(lines, Number((i-1)*5+3), 2));
}
//下面两个变量分别表示显示中心点的x和y
centerx=190;
centery=215;
2.2 创建基本循环
完成了初始化,下面我们来建立程序中最基本的循环,
选中loop帧,并在其中输入:
gotoAndPlay (“start”);
2.3 绘制模型
绘制模型的过程可分为两个部分,第一部分将三维物体的各点坐标值转换为投影到视平面S上的相应二维坐标;第二部分根据转换完毕的二维坐标在视平面S上绘制出图像。在这个例子里我们在帧draw里面进行三维坐标的二维化,然后使用帧drawline来进行绘制工作。所以,在帧draw里输入以下的代码:
//下面的循环根据公式进行三维坐标的二维化
for (i=1; i<=totalpoints; i++) {
u = (zorder-eyez)/(eval(“z” add i)-eyez);//二维化公式
if (i<=9) {
set (“2Dx0” add i, u*eval(“x” add i)+centerx);
set (“2Dy0” add i, u*eval(“y” add i)+centery);
} else {
set (“2Dx” add i, u*eval(“x” add i)+centerx);
set (“2Dy” add i, u*eval(“y” add i)+centery);
}
}
//下面的循环负责复制线段并将之显示出来
for(i=1;i<=totallines;i++){
duplicateMovieClip(“/baseline”,“line” add i,i);
call(“drawline”);
}
在帧drawline里输入以下的代码:
pt1 = eval(“pt1” add i);
pt2 = eval(“pt2” add i);
setProperty (“line” add i, _x, eval(“2Dx” add pt1));
setProperty (“line” add i, _y, eval(“2Dy” add pt1));
setProperty (“line” add i, _xscale, eval(“2Dx” add pt2) - eval(“2Dx” add pt1));
setProperty (“line” add i, _yscale, eval(“2Dy” add pt2) - eval(“2Dy” add pt1));
至此绘制模型的工作大致就做完了,在start帧中输入:
call(“draw”);
按Ctrl+Enter后就可以看到你所定义的模型的模样了。
2.4 旋转
旋转其实也很简单,只要将坐标根据不同旋转角度重新映射一次就可以了,下面是一组用于旋转计算的公式:
沿x轴旋转:
沿y轴旋转:
沿z轴旋转:
由于篇幅有限,这里就只介绍一种旋转方式——沿x轴旋转。
根据上面的这些公式,我们还需要设置一些变量来满足要求。在init帧中追加以下的代码:
basecos=0.9848; //cos10的值
basesin=0.1736; //sin10的值
cos=basecos;
sin=basesin;
axis=“x”;//沿哪个轴旋转,这里是x也就是说沿x轴旋转
在rotx中输入如下的代码:
//根据不同的角度值重新计算二维坐标
for (i=1; i<=totalpoints; i++) {
set (“tmp”, (sin*eval(“y” add i))+(cos*eval(“z” add i)));
set (“y” add i, (cos*eval(“y” add i))-(sin*eval(“z” add i)));
set (“z” add i, tmp);
}
接下来只要在start帧中call(“draw”);的上面插入一句
call(“rot” add axis);//根据axis的值调用不同类型的旋转
这样,整个引擎基本上就可以算是完工了。另外两帧roty 和rotz大家只要参照相应的公式填一下应该是没什么大问题的。
如开头所说,这个引擎在功能上其实是相当简陋的,甚至是有相当多BUG的。但本文只是想抛砖引玉,向各位展示一种思路,引擎的完善与实用化留待各位有兴趣的朋友自己慢慢研究了。
篇2:基于flash的360虚拟现实引擎实现
flash 360度3D虚拟实境(cubicVR)实现原理
flash的3D虚拟实境最早源自于德国的flash图形学大牛andre.michelle在其labsite:lab.andre-michelle.com上发表了一篇关于虚拟实境的文章,并提供了一个实例(NaN sourcecode).为了深入虚拟实境,在接下来的2个月里我陆续找到一些cubicVR的源文件并尝试破译了一些源码,我同时尝试开发了一个简单的flash3D引擎以及图片3D拉伸算法,所有这些的思想均来自于andre-michelle在其日志中提到的一些idea.现在在这篇文章中所用的实例依然是我对andre早期版本的整理,虽然目前我开发的新版本有更好的结构以及执行效率,但此版本的编程思想更通俗易懂,我想利用这个假期时间开发出flash球型虚拟实境,使它变得更真实。
在flash里部署3D虚拟实境无疑是一个革命性进步,我们再也不用去安装java虚拟机和QTVR了,事实上,在基于flash的可编程矢量图形界面基础上开发出来的虚拟现实可以通过创新的用户界面以达到完美的用户体验。city8.com既采用这种技术来部署他们的全景体验城市地图。
demo:鼠标拖拽以转换camera视角
原理:
点透视与投影
通过1点透视来产生远小近大的变化以产生空间感,在cubicVR中,设想观察者camera在一个正六面体中央,通过一点透视来计算每个面的在空间投影中的位置,以产生透视效果,
demo:没有导入透视方程的情况:
细分贴图
flash的matrix类只支持2D图形变换:切变、缩放、平面位移。位图无法实现3D变换,这与openGL不同,openGL只需要在定义多边型顶点和贴图法线,位图就会自动贴到一个面片上,而且整个贴图过程完全由GPU完成。而在flash中必须使用细分贴图的方法来欺骗人们的眼睛,既:将一张图片细分为n张小的三角面片,再将小三角面片进行平面切变,正因为如此,flash3D一旦涉及贴图必然导致大量占用cpu运算资源。
细分贴图的demo:
godson.blueidea.com/archives//3708.shtml
消隐算法
如果没有消隐算法,那么观察者只能看到离屏幕最近的面,而不能看到整个3D空间,理论上消隐算法有3个步骤:1在一个六面体中,面法线与视锥体夹角大于180度则应设为不可见,2在同一个像素上,只显示与camera最近的多边形(Zbuffer算法),3投影在屏幕以外的多边型不可见,但这三种算法非常占用cpu资源,andrew设计了一种更简单的算法:1多边形的中心与camera重合,在camera坐标系中Z值<0的多边形不可见,2投影在屏幕以外的多边型不可见。
篇3:Flash教程:鼠标绘制
知识点:
1、添加鼠标监听事件MouseEvent;
2、规定画布大小;
3、moveTo和lineTo;
4、绘制开始与结束判断,
代码:
var huabu:Sprite=new Sprite;
huabu.graphics.beginFill(0xFFFFFF);
huabu.graphics.drawRect(20,20,510,360);
huabu.graphics.endFill();
addChild(huabu);
var _drawing:Boolean;
var quxian:Sprite=new Sprite();
quxian.graphics.lineStyle( 2, 0xFF0000 );
huabu.addChild(quxian);
_drawing = false;
huabu.addEventListener( MouseEvent.MOUSE_DOWN, startDrawing );
huabu.addEventListener( MouseEvent.MOUSE_MOVE,moving);
huabu.addEventListener( MouseEvent.MOUSE_UP, stopDrawing );
stage.addEventListener(MouseEvent.MOUSE_UP,stopDrawing);
function startDrawing( event:MouseEvent ):void {
quxian.graphics.moveTo( mouseX, mouseY );
_drawing = true;
}
function moving( event:MouseEvent ):void {
if ( _drawing ) {
quxian.graphics.lineTo( mouseX, mouseY );
}
}
function stopDrawing( event:MouseEvent ):void {
_drawing = false;
}
(2):直线
知识点:
1、添加鼠标监听事件MouseEvent;
2、规定画布大小;
3、moveTo和lineTo;
4、绘制开始与结束判断。
难点:
绘制多条直线
代码:
var huabu:Sprite=new Sprite();
huabu.graphics.beginFill(0xFFFFFF);
huabu.graphics.drawRect(20,20,510,360);
huabu.graphics.endFill();
addChild(huabu);
var _drawing:Boolean=false;
var zhixian:Sprite=new Sprite();
huabu.addChild(zhixian);
var _color:Number=0xFF0000;
var zx:int=1;
var ys_x:Number;
var ys_y:Number;
huabu.addEventListener( MouseEvent.MOUSE_DOWN, startDrawing );
huabu.addEventListener( MouseEvent.MOUSE_MOVE,moving);
huabu.addEventListener( MouseEvent.MOUSE_UP, stopDrawing );
stage.addEventListener( MouseEvent.MOUSE_UP, stopDrawing );
function startDrawing( event:MouseEvent ):void {
ys_x=mouseX;
ys_y=mouseY;
_drawing = true;
}
function moving( event:MouseEvent ):void {
if (_drawing) {
huabu.removeChild(zhixian);
zhixian=new Sprite();
zhixian.graphics.lineStyle( zx, _color );
zhixian.graphics.moveTo(ys_x,ys_y);
zhixian.graphics.lineTo(mouseX,mouseY);
huabu.addChild(zhixian);
}
}
function stopDrawing( event:MouseEvent ):void {
zhixian=new Sprite();
huabu.addChild(zhixian);
//没有以上两句,只能画一条直线
_drawing = false;
}
(3):圆
知识点:
1、添加鼠标监听事件MouseEvent;
2、绘制过程中显示半径(两点间的距离Point.distance(坐标1,坐标2));
3、drawCircle、moveTo和lineTo;
4、绘制开始与结束判断。
难点:
绘制多个圆
代码:
var _drawing:Boolean;
var yuan:Sprite=new Sprite();
addChild(yuan);
var banjing:Sprite=new Sprite();
addChild(banjing);
var yuanxin_x:Number;
var yuanxin_y:Number;
var zuobiao1:Point;
var zuobiao2:Point;
var bj:Number;
_drawing = false;
stage.addEventListener( MouseEvent.MOUSE_DOWN, startDrawing );
stage.addEventListener( MouseEvent.MOUSE_MOVE,yd);
stage.addEventListener( MouseEvent.MOUSE_UP, stopDrawing );
function startDrawing( event:MouseEvent ):void {
yuanxin_x=mouseX;//鼠标按下的位置就是圆心的位置
yuanxin_y=mouseY;
_drawing = true;
}
function yd( event:MouseEvent ):void {
if ( _drawing ) {
zuobiao1 = new Point(yuanxin_x,yuanxin_y);
zuobiao2 = new Point(mouseX, mouseY);
bj= Point.distance(zuobiao1, zuobiao2);//显示两点之间的距离即为半径
removeChild(yuan);
yuan=new Sprite();
yuan.graphics.lineStyle( 2, 0xFF0000 );
yuan.graphics.drawCircle(yuanxin_x,yuanxin_y,bj);
addChild(yuan);
removeChild(banjing);
banjing=new Sprite();
banjing.graphics.lineStyle(2,0xFF0000,0.5);
banjing.graphics.moveTo(yuanxin_x,yuanxin_y);
banjing.graphics.lineTo(mouseX,mouseY);
addChild(banjing);
}
}
function stopDrawing( event:MouseEvent ):void {
removeChild(banjing);//绘制结束时半径线消失
banjing=new Sprite();//每次画圆过程中都显示半径
addChild(banjing);
yuan=new Sprite();//可绘制多个圆
addChild(yuan);
_drawing = false;
}
(4):椭圆
知识点:
1、添加鼠标监听事件MouseEvent和键盘监听事件KeyboardEvent;
2、椭圆的宽与高;
3、drawEllipse;
4、绘制开始与结束判断;
5、按下Shift键绘制正圆,
难点:
按下Shift键绘制正圆
代码:
var _drawing:Boolean=false;
var ellipse:Sprite=new Sprite();
addChild(ellipse);
var kaishi_x:Number;
var kaishi_y:Number;
var w:Number;
var h:Number;
var _max:Number;
stage.addEventListener( MouseEvent.MOUSE_DOWN, startDrawing );
stage.addEventListener( MouseEvent.MOUSE_MOVE,moving);
stage.addEventListener( MouseEvent.MOUSE_UP, stopDrawing );
function startDrawing( event:MouseEvent ):void {
kaishi_x=mouseX;
kaishi_y=mouseY;
_drawing = true;
}
function moving( event:MouseEvent ):void {
if (_drawing) {
w=mouseX-kaishi_x;
h=mouseY-kaishi_y;
removeChild(ellipse);
ellipse=new Sprite();
ellipse.graphics.lineStyle( 2, 0xFF0000 );
ellipse.graphics.drawEllipse(kaishi_x,kaishi_y,w,h);
addChild(ellipse);
}
}
function stopDrawing( event:MouseEvent ):void {
ellipse=new Sprite();
addChild(ellipse);
_drawing = false;
}
stage.focus=this;
stage.addEventListener(KeyboardEvent.KEY_DOWN, shift);
function shift(event:KeyboardEvent):void {
if (event.charCode==0) {
if (_drawing) {
w=mouseX-kaishi_x;
h=mouseY-kaishi_y;
_max=Math.max(Math.abs(w),Math.abs(h));
if (w<0 && h<0) {
w=-_max;
h=-_max;
}
if (w>0 && h>0) {
w=_max;
h=_max;
}
if (w<0 && h>0) {
w=-_max;
h=_max;
}
if (w>0 && h<0) {
w=_max;
h=-_max;
}
removeChild(ellipse);
ellipse=new Sprite();
ellipse.graphics.lineStyle( 2, 0xFF0000 );
ellipse.graphics.drawEllipse(kaishi_x,kaishi_y,w,h);
addChild(ellipse);
}
}
}
(5):矩形
知识点:
1、添加鼠标监听事件MouseEvent和键盘监听事件KeyboardEvent;
2、椭圆的宽与高;
3、drawRect;
4、绘制开始与结束判断;
5、按下Shift键绘制正方形。
难点:
按下Shift键绘制正方形
代码:
var _drawing:Boolean=false;
var _drawrect:Sprite=new Sprite();
addChild(_drawrect);
var yx_x:Number;
var yx_y:Number;
var w:Number;
var h:Number;
var _max:Number;
stage.addEventListener( MouseEvent.MOUSE_DOWN, startDrawing );
stage.addEventListener( MouseEvent.MOUSE_MOVE,moving);
stage.addEventListener( MouseEvent.MOUSE_UP, stopDrawing );
function startDrawing( event:MouseEvent ):void {
yx_x=mouseX;
yx_y=mouseY;
_drawing = true;
}
function moving( event:MouseEvent ):void {
if (_drawing) {
w=mouseX-yx_x;
h=mouseY-yx_y;
removeChild(_drawrect);
_drawrect=new Sprite();
_drawrect.graphics.lineStyle( 2, 0xFF0000 );
_drawrect.graphics.drawRect(yx_x,yx_y,w,h);
addChild(_drawrect);
}
}
function stopDrawing( event:MouseEvent ):void {
_drawrect=new Sprite();
addChild(_drawrect);
_drawing = false;
}
stage.focus=this;
stage.addEventListener(KeyboardEvent.KEY_DOWN, shift);
function shift(event:KeyboardEvent):void {
if (event.charCode==0) {
if (_drawing) {
_max=Math.max(Math.abs(w),Math.abs(h));
if (w<0 && h<0) {
w=-_max;
h=-_max;
}
if (w>0 && h>0) {
w=_max;
h=_max;
}
if (w<0 && h>0) {
w=-_max;
h=_max;
}
if (w>0 && h<0) {
w=_max;
h=-_max;
}
removeChild(_drawrect);
_drawrect=new Sprite();
_drawrect.graphics.lineStyle( 2, 0xFF0000 );
_drawrect.graphics.drawRect(yx_x,yx_y,w,h);
addChild(_drawrect);
}
}
}
更多内容进入:
精品学习网IT教育频道
篇4:AutoCAD三维建模教程
AutoCAD除具有强大的二维绘图功能外,还具备基本的三维造型能力,若物体并无复杂的外表曲面及多变的空间结构关系,则使用AutoCAD可以很方便地建立物体的三维模型。本章我们将介绍AutoCAD三维绘图的基本知识。11.1 三维几何模型分类在AutoCAD中,用户可以创建3种类型的三维模型:线框模型、表面模型及实体模型。这3种模型在计算机上的显示方式是相同的,即以线架结构显示出来,但用户可用特定命令使表面模型及实体模型的真实性表现出来。11.1.1线框模型(Wireframe. Model)线框模型是一种轮廓模型,它是用线(3D空间的直线及曲线)表达三维立体,不包含面及体的信息。不能使该模型消隐或着色。又由于其不含有体的数据,用户也不能得到对象的质量、重心、体积、惯性矩等物理特性,不能进行布尔运算。图11-1显示了立体的线框模型,在消隐模式下也看到后面的线。但线框模型结构简单,易于绘制。11.1.2 表面模型(Surface Model)表面模型是用物体的表面表示物体。表面模型具有面及三维立体边界信息。表面不透明,能遮挡光线,因而表面模型可以被渲染及消隐。对于计算机辅助加工,用户还可以根据零件的表面模型形成完整的加工信息。但是不能进行布尔运算。如图11-2所示是两个表面模型的消隐效果,前面的薄片圆筒遮住了后面长方体的一部分。
图11-1 线框模型 图11-2 表面模型
11.1.3实体模型 实体模型具有线、表面、体的全部信息。对于此类模型,可以区分对象的内部及外部,可以对它进行打孔、切槽和添加材料等布尔运算,对实体装配进行干涉检查,分析模型的质量特性,如质心、体积和惯性矩。对于计算机辅助加工,用户还可利用实体模型的数据生成数控加工代码,进行数控刀具轨迹仿真加工等。如图11-3所示是实体模型。图11-3 实体模型
11.2 三维坐标系实例——三维坐标系、长方体、倒角、删除面 AutoCAD的坐标系统是三维笛卡儿直角坐标系,分为世界坐标系(WCS)和用户坐标系(UCS)。图11-4表示的是两种坐标系下的图标。 图中“X”或“Y”的剪头方向表示当前坐标轴X轴或Y轴的正方向,Z轴正方向用右手定则判定。 世界坐标系图11-4 表示坐标系的图标
缺省状态时,AutoCAD的坐标系是世界坐标系。世界坐标系是唯一的,固定不变的,对于二维绘图,在大多数情况下,世界坐标系就能满足作图需要,但若是创建三维模型,就不太方便了,因为用户常常要在不同平面或是沿某个方向绘制结构。如绘制图11-5所示的图形,在世界坐标系下是不能完成的。此时需要以绘图的平面为XY坐标平面,创建新的坐标系,然后再调用绘图命令绘制图形。用户坐标系
图11-5 在用户坐标系下绘图任务:绘制如图11-5所示的实体。目的:通过绘制此图形,学习长方体命令、实体倒角、删除面命令和用户坐标系的建立方法。知识的储备:基本绘图命令和对象捕捉、对象追踪的应用。绘图步骤分解:1.绘制长方体调用长方体命令:实体工具栏:下拉菜单:[绘图][实体] [长方体]命令窗口:BOX 'AutoCAD提示:指定长方体的角点或 [中心点(CE)] <0,0,0>:在屏幕上任意点单击指定角点或 [立方体(C)/长度(L)]:L ' //选择给定长宽高模式。指定长度: 30'指定宽度: 20'指定高度: 20'绘制出长30,宽20,高20的长方体,如图11-6所示。2.倒角 用于二维图形的倒角、圆角编辑命令在三维图中仍然可用。单击“编辑”工具栏上的倒角按钮,调用倒角命令:命令: _chamfer(“修剪”模式) 当前倒角距离 1 = 0.0000,距离 2 = 0.0000选择第一条直线或 [多段线(P)/距离(D)/角度(A)/修剪(T)/方式(M)/多个(U)]:在AB直线上单击基面选择...输入曲面选择选项 [下一个(N)/当前(OK)] <当前>:' //选择默认值。指定基面的倒角距离: 12'指定其他曲面的倒角距离 <12.0000>:' //选择默认值12。选择边或 [环(L)]:在AB直线上单击结果如图11-7所示。图11-6 绘制长方体图 11-7 长方体倒角3.移动坐标系,绘制上表面圆 因为AutoCAD只可以在XY平面上画图,要绘制上表面上的图形,则需要建立用户坐标系。由于世界坐标系的XY面与CDEF面平行,且X轴、Y轴又分别与四边形CDEF的边平行,因此只要把世界坐标系移到CDEF面上即可。移动坐标系,只改变坐标原点的位置,不改变X、Y轴的方向。如图11-8所示。AutoCAD除具有强大的二维绘图功能外,还具备基本的三维造型能力。若物体并无复杂的外表曲面及多变的空间结构关系,则使用AutoCAD可以很方便地建立物体的三维模型。本章我们将介绍AutoCAD三维绘图的基本知识。11.1 三维几何模型分类在AutoCAD中,用户可以创建3种类型的三维模型:线框模型、表面模型及实体模型。这3种模型在计算机上的显示方式是相同的,即以线架结构显示出来,但用户可用特定命令使表面模型及实体模型的真实性表现出来。11.1.1线框模型(Wireframe. Model)线框模型是一种轮廓模型,它是用线(3D空间的直线及曲线)表达三维立体,不包含面及体的信息。不能使该模型消隐或着色。又由于其不含有体的数据,用户也不能得到对象的质量、重心、体积、惯性矩等物理特性,不能进行布尔运算。图11-1显示了立体的线框模型,在消隐模式下也看到后面的线。但线框模型结构简单,易于绘制。11.1.2 表面模型(Surface Model)表面模型是用物体的表面表示物体。表面模型具有面及三维立体边界信息。表面不透明,能遮挡光线,因而表面模型可以被渲染及消隐。对于计算机辅助加工,用户还可以根据零件的表面模型形成完整的加工信息。但是不能进行布尔运算。如图11-2所示是两个表面模型的消隐效果,前面的薄片圆筒遮住了后面长方体的一部分。图11-1 线框模型 图11-2 表面模型
11.1.3实体模型 实体模型具有线、表面、体的全部信息。对于此类模型,可以区分对象的内部及外部,可以对它进行打孔、切槽和添加材料等布尔运算,对实体装配进行干涉检查,分析模型的质量特性,如质心、体积和惯性矩。对于计算机辅助加工,用户还可利用实体模型的数据生成数控加工代码,进行数控刀具轨迹仿真加工等。如图11-3所示是实体模型。图11-3 实体模型
11.2 三维坐标系实例——三维坐标系、长方体、倒角、删除面 AutoCAD的坐标系统是三维笛卡儿直角坐标系,分为世界坐标系(WCS)和用户坐标系(UCS)。图11-4表示的是两种坐标系下的图标。 图中“X”或“Y”的剪头方向表示当前坐标轴X轴或Y轴的正方向,Z轴正方向用右手定则判定。 世界坐标系图11-4 表示坐标系的图标
缺省状态时,AutoCAD的坐标系是世界坐标系。世界坐标系是唯一的,固定不变的,对于二维绘图,在大多数情况下,世界坐标系就能满足作图需要,但若是创建三维模型,就不太方便了,因为用户常常要在不同平面或是沿某个方向绘制结构。如绘制图11-5所示的图形,在世界坐标系下是不能完成的。此时需要以绘图的平面为XY坐标平面,创建新的坐标系,然后再调用绘图命令绘制图形。用户坐标系
图11-5 在用户坐标系下绘图任务:绘制如图11-5所示的实体。目的:通过绘制此图形,学习长方体命令、实体倒角、删除面命令和用户坐标系的建立方法。知识的储备:基本绘图命令和对象捕捉、对象追踪的应用。绘图步骤分解:1.绘制长方体调用长方体命令:实体工具栏:下拉菜单:[绘图][实体] [长方体]命令窗口:BOX 'AutoCAD提示:指定长方体的角点或 [中心点(CE)] <0,0,0>:在屏幕上任意点单击指定角点或 [立方体(C)/长度(L)]:L ' //选择给定长宽高模式。指定长度: 30'指定宽度: 20'指定高度: 20'绘制出长30,宽20,高20的长方体,如图11-6所示。2.倒角 用于二维图形的倒角、圆角编辑命令在三维图中仍然可用。单击“编辑”工具栏上的倒角按钮,调用倒角命令:命令: _chamfer(“修剪”模式) 当前倒角距离 1 = 0.0000,距离 2 = 0.0000选择第一条直线或 [多段线(P)/距离(D)/角度(A)/修剪(T)/方式(M)/多个(U)]:在AB直线上单击基面选择...输入曲面选择选项 [下一个(N)/当前(OK)] <当前>:' //选择默认值。指定基面的倒角距离: 12'指定其他曲面的倒角距离 <12.0000>:' //选择默认值12。选择边或 [环(L)]:在AB直线上单击结果如图11-7所示。图11-6 绘制长方体图 11-7 长方体倒角3.移动坐标系,绘制上表面圆 因为AutoCAD只可以在XY平面上画图,要绘制上表面上的图形,则需要建立用户坐标系。由于世界坐标系的XY面与CDEF面平行,且X轴、Y轴又分别与四边形CDEF的边平行,因此只要把世界坐标系移到CDEF面上即可。移动坐标系,只改变坐标原点的位置,不改变X、Y轴的方向。如图11-8所示。(1)移动坐标系在命令窗口输入命令动词“UCS”,AutoCAD提示:命令: ucs当前 UCS 名称: *世界*输入选项[新建(N)/移动(M)/正交(G)/上一个(P)/恢复(R)/保存(S)/删除(D)/应用(A)/?/世界(W)] <世界>:M ' //选择移动选项。指定新原点或 [Z 向深度(Z)] <0,0,0>: <对象捕捉开>选择F点单击也可直接调用“移动坐标系”命令:UCS工具栏:下拉菜单:[工具][移动UCS(V)](2)绘制表面圆 打开“对象追踪”、“对象捕捉”, 调用圆命令,捕捉上表面的中心点,以5 为半径绘制上表面的圆。结果如图11-9所示。4.三点法建立坐标系,绘制斜面上圆(1)三点法建立用户坐标系命令窗口输入命令动词“UCS”命令: ucs当前 UCS 名称: *没有名称*输入选项 [新建(N)/移动(M)/正交(G)/上一个(P)/恢复(R)/保存(S)/删除(D)/应用(A)/?/世界(W)] <世界>:N ' //新建坐标系。指定新UCS的原点或[Z轴(ZA)/三点(3)/对象(OB)/面(F)/视图(V)/X/Y/Z] <0,0,0>: 3' //选择三点方式。指定新原点 <0,0,0>:在H点上单击在正 X 轴范围上指定点 <50.9844,-27.3562,12.7279>:在G点单击在 UCS XY平面的正 Y 轴范围上指定点 <49.9844,-26.3562,12.7279>:在C点单击也可用下面两种方法直接调用“三点法”建立用户坐标系UCS工具栏:下拉菜单:[工具][新建UCS(W)][三点(3)](2)绘制圆方法同第3步,结果如图11-9所示。图11-8 改变坐标系图 11-9 绘制上表面圆
5.以所选实体表面建立UCS,在侧面上画圆(1)选择实体表面建立UCS在命令窗口输入UCS,调用用户坐标系命令:命令: ucs当前 UCS 名称: *世界*输入选项 [新建(N)/移动(M)/正交(G)/上一个(P)/恢复(R)/保存(S)/删除(D)/应用(A)/?/世界(W)] <世界>: N'指定UCS的原点或[Z 轴(ZA)/三点(3)/对象(OB)/面(F)/视图(V)/X/Y/Z]<0,0,0>:F'选择实体对象的面:在侧面上接近底边处拾取实体表面输入选项 [下一个(N)/X 轴反向(X)/Y 轴反向(Y)] <接受>:' //接受图示结果。结果如图11-10所示。(2)绘制圆 方法同上步,完成图11-5所示图形。图11-10 绘制侧面上圆补充知识:1.本例介绍了建立用户坐标系常用的三种方法,在UCS命令中有许多选项:[新建(N)/移动(M)/正交(G)/上一个(P)/恢复(R)/保存(S)/删除(D)/应用(A)/?/世界(W)] ,各选项功能如下:(1)新建(N):创建一个新的坐标系,选择该选项后,AutoCAD继续提示:指定新 UCS 的原点或 [Z 轴(ZA)/三点(3)/对象(OB)/面(F)/视图(V)/X/Y/Z] <0,0,0>:l 指定新UCS 的原点:将原坐标系平移到指定原点处,新坐标系的坐标轴与原坐标系的坐标轴方向相同。l Z 轴(ZA):通过指定新坐标系的原点及Z轴正方向上的一点来建立坐标系。l 三点(3):用三点来建立坐标系,第一点为新坐标系的原点,第二点为X轴正方向上的一点,第三点为Y轴正方向上的一点。l 对象(OB):根据选定三维对象定义新的坐标系。此选项不能用于下列对象:三维实体、三维多段线、三维网格、视口、多线、面域、样条曲线、椭圆、射线、构造线、引线、多行文字。对于非三维面的对象,新 UCS 的 XY平面与绘制该对象时生效的 XY平面平行,但 X 轴和 Y 轴可作不同的旋转。如选择圆为对象,则圆的圆心成为新 UCS 的原点。X 轴通过选择点。l 面(F):将 UCS 与实体对象的选定面对齐。在选择面的边界内或面的边上单击,被选中的面将亮显,UCS 的 X 轴将与找到的第一个面上的最近的边对齐。l 视图(V):以垂直于观察方向的平面为XY平面,建立新的坐标系。UCS原点保持不变。l X/Y/Z:将当前 UCS绕指定轴旋转一定的角度。(2)移动(M):通过平移当前 UCS 的原点重新定义 UCS,但保留其 XY平面的方向不变。(3)正交(G):指定 AutoCAD 提供的六个正交 UCS 之一。这些 UCS 设置通常用于查看和编辑三维模型。如图11-11所示。图11-11 绘制侧面上圆(4)上一个(P):恢复上一个UCS。AutoCAD 保存创建的最后 10 个坐标系。重复“上一个”选项逐步返回上一个坐标系。(5)恢复(R):恢复已保存的 UCS 使它成为当前 UCS;恢复已保存的 UCS 并不重新建立在保存 UCS 时生效的观察方向。(6)保存(S):把当前 UCS 按指定名称保存。(7)删除(D):从已保存的用户坐标系列表中删除指定的 UCS。(8)应用(A):其他视口保存有不同的 UCS 时;将当前 UCS 设置应用到指定的视口或所有活动视口。(9)?:列出用户定义坐标系的名称,并列出每个保存的 UCS 相对于当前 UCS 的原点以及 X、Y 和 Z 轴。(10)世界(W):将当前用户坐标系设置为世界坐标系。2.如果倒角或圆角所创建的面不合适,可使用 “删除面”命令删除,调用删除面命令方法:实体编辑工具栏:下拉菜单:[修改][实体编辑][删除面]11.3观察三维图形——绘制球、视图、三维动态观察器、布尔运算 在绘制三维图形过程中,常常要从不同方向观察图形,AutoCAD默认视图是XY平面,方向为Z轴的正方向,看不到物体的高度。AutoCAD提供了多种创建3D视图的方法沿不同的方向观察模型,比较常用的是用标准视点观察模型和三维动态旋转方法。我们这里只介绍这两种常用方法。标准视点观察实体工具栏如图11-12所示。 图11-12 视图工具栏图11-12 视图工具栏 任务:绘制如图11-13所示的物体图11-13 股子
目的:通过绘制此物体,掌握用标准视点和用三维动态观察器旋转方法观察模型,使用圆角命令、布尔运算等编辑三维实体的方法。知识的储备:基本绘图命令、使用对象捕捉、建立用户坐标系绘图步骤分解:1.绘制正方体(1)新建两个图层: 层 名 颜色 线 型 线宽实体层 白色 Continues 默认 辅助层 黄色 Continues 默认并将实体层作为当前层。单击“视图”工具栏上“西南等轴测”按钮,将视点设置为西南方向。(2)绘制正方体在“实体”工具栏上单击“长方体”按钮,调用长方体命令:命令: _box指定长方体的角点或 [中心点(CE)] <0,0,0>:在屏幕上任意一点单击指定角点或 [立方体(C)/长度(L)]: C' //绘制立方体。指定长度: 20'结果如图11-14所示。2.挖上表面的一个球面坑(1)移动坐标系到上表面(2)绘制球调用球命令:实体工具栏:下拉菜单:[绘图][实体] [球体]命令窗口:SPHERE '当前线框密度: ISOLINES=4 //说明当前轮廓素线网格线数为4。指定球体球心 <0,0,0>: 利用双向追踪捕捉上表面的中心指定球体半径或 [直径(D)]:5'结果如图11-15所示。(3)布尔运算差集运算:通过减操作从一个实体中去掉另一些实体得到一个实体。调用命令方法:实体编辑工具栏:下拉菜单:[修改][实体编辑][差集]命令窗口:SUBTRACT'Autocad提示:命令: _subtract 选择要从中减去的实体或面域...选择对象:在立方体上单击 找到 1 个选择对象:' //结束被减去实体的选择。选择要减去的实体或面域 ..选择对象:在球体上单击 找到 1 个选择对象: ' //结束差运算。结果如图11-16所示。图11-14 立方体图 11-15 绘制球图 11-16 挖坑 3.在左侧面上挖两个点的球面坑(1)旋转UCS调用UCS命令:命令: _ucs当前 UCS 名称: *没有名称*输入选项 [新建(N)/移动(M)/正交(G)/上一个(P)/恢复(R)/保存(S)/删除(D)/应用(A)/?/世界(W)] <世界>: N'指定新UCS的原点或[Z 轴(ZA)/三点(3)/对象(OB)/面(F)/视图(V)/X/Y/Z] <0,0,0>: X'指定绕 X 轴的旋转角度 <90>:'(2)确定球心点在“草图设置”对话框中选择“端点”和“节点”捕捉,并打开“对象捕捉”。选择辅助层,调用直线命令,连接对角线。运行“绘图”菜单下的“点”“定数等分”命令,将辅助直线3等分,结果如图11-17(a)所示。(3)绘制球捕捉辅助线上的节点为球心,以4为半径绘制两个球。(4)差集运算调用“差集”命令,以立方体为被减去的实体,两个球为减去的实体,进行差集运算,结果如图11-17(b)所示。(a) (b)
图11-17 挖两点坑以同样的方法绘制前表面上的三点孔,如图11-18所示。4.绘制底面上六个点的球面坑(1)单击“三维动态观察器”工具栏上的“三维动态观察”按钮,激活三维动态观察器视图,屏幕上出现弧线圈,将光标移至弧线圈内,出现球形光标,向上拖动鼠标,使立方体的下表面转到上面全部可见位置。按 ESC 键或 ENTER 键退出,或者单击鼠标右键显示快捷菜单退出,如图11-19所示。图11-18 绘制三点坑 图11-19 三维动态观察(2)同创建两点坑一样,将上表面作为XY平面,建立用户坐标系,绘制作图辅助线,定出六个球心点,再绘制六个半径为3的球,然后进行布尔运算,结果如图11-20所示。5.用同样的方法,调整好视点,挖制另两面上的四点坑和五点坑,结果如图11-21所示。图11-20 挖六点坑图 11-21 挖坑完成6.各棱线圆角(1)倒上表面圆角单击“编辑”工具栏上的“圆角”按钮,调用圆角命令:命令: _fillet当前设置: 模式 = 修剪,半径 = 6.0000选择第一个对象或 [多段线(P)/半径(R)/修剪(T)/多个(U)]:选择上表面一条棱线输入圆角半径 <6.0000>: 2'选择边或 [链(C)/半径(R)]:选择上表面砣条棱线选择边或 [链(C)/半径(R)]:'已选定 4 个边用于圆角。 结果如图11-22所示。(2)倒下表面圆角单鳌叭维动态观察器”工具栏上的“三维动态观察”按钮,调整视图方向,使立方体的下表面转到上面四条棱线全可见位置。然后调用圆角命令,选择四根棱线,倒下表面的圆角,结果如图11-23所示。图11-22 长方体圆角 图11-23 长方体圆角(3)再次调用圆角命令,同时启用“三维动态观察”功能,选择侧面的四条棱线,以半径为2倒圆角。(4)删除辅助线层上的所有辅助线和辅助点,完成图如图11-12所示。提示、注意、技巧:这里倒圆角时不可以为12条棱线一次倒圆角,因为AutoCAD内部要为圆角计算,会发生运算错误,导致圆角失败。7.观察图形打开视图菜单下的消隐模式,分别单击图11-13所示的“视图工具栏”上的各按钮,以不同方向观察图形的变化。补充知识:1.改变三维图形曲面轮廓素线系统变量“ISOLINES”是用于控制显示曲面线框弯曲部分的素线数目。有效整数值为 0 到 2047,初始值为4。如图11-24是“ISOLINES”值为4和12时圆柱的“线框”显示形式。ISOLINES=4 ISOLINES=122.布尔运算 在AutoCAD中,三维实体可进行并集、差集、交集三种布尔运算,创建复杂实体。(1)并集运算:将多个实体合成一个新的实体,如图11-25(b)所示。命令调用:实体编辑工具栏:下拉菜单:[修改][实体编辑][并集]命令窗口:UNION'(2)交集运算:从两个或多个实体的交集创建复合实体并删除交集以外的部分,如图11-25(c)所示。实体编辑工具栏:下拉菜单:[修改][实体编辑][交集]命令窗口:INTERSECT'图11-25 布尔运算3、三维动态观察器 单击“三维动态观察器”工具栏上的“三维动态观察”按钮,激活三维动态观察器视图时,屏幕上出现弧线圈,当光标移至弧线圈内、外和四个控制点上时,会出现不同的光标形式:光标位于观察球内时,拖动鼠标可旋转对象。光标位于观察球外时,拖动鼠标可使对象绕通过观察球中心且垂直于屏幕的轴转动。光标位于观察球上下小圆时,拖动鼠标可使视图绕通过观察球中心的水平轴旋转。光标位于观察球左右小圆时,拖动鼠标可使视图绕通过观察球中心的垂直轴旋转 11.4创建基本三维实体实例——圆柱、圆锥图11-26 电视塔任务:绘制如图11-26所示的实体。目的:通过绘制此图形,学习圆柱、圆锥命令的使用。知识的储备:球命令、视图、布尔运算。 绘图步骤分解:该图形是由圆柱、圆锥、球组合而成的,球的中心、圆柱、圆锥的轴线在同一中心线上。1.绘制基座——圆柱(1)设置视图方向为“西南等轴测”方向。(2)设置线框密度命令: isolines'输入 ISOLINES 的新值 <4>: 20L (3)绘制圆柱实体工具栏:下拉菜单:[绘图][实体][圆柱]命令窗口: CYLINDER 'AutoCAD提示:命令: _cylinder当前线框密度: ISOLINES=20指定圆柱体底面的中心点或 [椭圆(E)] <0,0,0>:' //选择默认指定圆柱体底面的半径或 [直径(D)]: 80L指定圆柱体高度或 [另一个圆心(C)]: 10L2.绘制圆锥实体工具栏:下拉菜单:[绘图][实体][圆锥]命令窗口: CONE 'AutoCAD提示:命令: _cone当前线框密度: ISOLINES=20指定圆锥体底面的中心点或 [椭圆(E)] <0,0,0>: 0,0,10' //底面中心在圆柱上表面中心指定圆锥体底面的半径或 [直径(D)]: 50'指定圆锥体高度或 [顶点(A)]: 800'3.绘制球单击实体工具栏上的球图标,调用球命令:命令:SPHERE当前线框密度: ISOLINES=20指定球体球心 <0,0,0>: 0,0,250' 指定球体半径或 [直径(D)]: 80' //完成底下球的绘制。 命令: ' //再次调用球命令。命令:SPHERE当前线框密度: ISOLINES=20指定球体球心 <0,0,0>: 0,0,450'指定球体半径或 [直径(D)]: 50'4.布尔运算单击实体编辑工具栏上的并集按钮,调用并集命令:命令 _union选择对象:窗口选择各个对象 找到 4 个选择对象:'完成图如图11-26所示。补充知识:1.圆柱命令中的选项:椭圆(E):绘制截面为椭圆的柱体或锥体,如图11-3所示。另一个圆心(C):根据圆柱体另一底面的中心位置创建圆柱体,两中心点连线方向为圆柱体的轴线方向。2.圆锥命令中的选项:椭圆(E):同圆柱命令。顶点(A):根据圆锥体顶点与底面的中心连线方向为圆锥体的轴线方向创建圆锥体。提示、注意、技巧: 创建这种较规则的实体模型时,最好利用坐标点确定位置,这样操作起来较为方便。 11.5 创建基本三维实体实例--环任务:绘制如图11-27所示的实体。目的:通过绘制此图形,学习绘制环命令的使用。知识的储备:视图、布尔运算。绘图步骤分解:1.绘制大圆环(1)将视图调整到西南等轴测方向。(2)调用环命令:实体工具栏:下拉菜单:[绘图][实体][圆环体] 命令窗口: TORUS '命令: _torus当前线框密度: ISOLINES=4指定圆环体中心 <0,0,0>:'指定圆环体半径或 [直径(D)]: 100'指定圆管半径或 [直径(D)]: 2'2.绘制环珠(1)调整坐标系方向,如图11-28所示。(2)绘制橄榄球单击“实体工具栏”上环按钮,调用环命令:命令: _torus当前线框密度: ISOLINES=4指定圆环体中心 <0,0,0>: 100,0,0'指定圆环体半径或 [直径(D)]: -20'指定圆管半径或 [直径(D)]: 30'3.阵列环珠调整视图方向到俯视图方向,如图11-29所示。调用“修改工具栏”上“阵列”命令,以大环的中心为阵列中心,在360度范围内阵列环珠,个数为8个,完成图如11-27所示。提示、注意、技巧:1.在绘制环时,如果给定环半径大于圆管半径,则绘制的是正常的环。如果给定环的半径为负值,并且圆管半径大于环半径的绝对值,则绘制的是橄榄形。2.阵列对象时,如果阵列对象分布在一个平面上,则可将XY平面调整到该平面上,利用平面的“阵列”命令阵列对象,这样比用3D阵列命令(后面介绍)方便得多。 11.6通过二维图形创建实体——拉伸任务:绘制如图11-30所示的实体。目的:通过绘制此图形,学习拉伸命令的使用。知识的储备:视图、布尔运算。 绘图步骤分解:图11-30 拱形体 1.画端面图形(1)调用矩形命令,绘制长方形,长100,宽80。(2)调用圆命令,绘制直径为60的圆。将视图方向调整到“西南等轴测”方向,如图11-31所示。(3)创建面域调用面域命令::绘图工具栏:下拉菜单:[绘图][面域] 命令窗口:REGION 'AutoCAD提示:选择对象: 选择长方形和圆 找到 2 个选择对象:' //结束选择已提取 2 个环。已创建 2 个面域。(4)布尔运算单击“实体编辑工具栏”上的差集运算命令按钮,用长方形面域减去圆形面域,结果如图11-32所示。图11-31 绘制长方形和圆 图11-32 面域计算2.拉伸面域调用拉伸命令:实体工具栏:下拉菜单:[绘图][实体][拉伸] 命令窗口: EXTRUDE 'AutoCAD提示:命令: _extrude当前线框密度: ISOLINES=4选择对象:在面域线框上单击 找到 1 个选择对象:' 指定拉伸高度或 [路径(P)]: 20'指定拉伸的倾斜角度 <0>:'完成图形如图11-30所示。补充知识:1.命令选项:路径(P):对拉伸对象沿路径拉伸。可以为路径的对象有:直线、圆、椭圆、圆弧、椭圆弧、多段线、样条曲线等。2.可以拉伸的对象有:圆、椭圆、正多边形、用矩形命令绘制的矩形、封闭的样条曲线、封闭的多段线、面域等,3.路径与截面不能在同一平面内,二者一般分别在两个相互垂直的平面内,如图11-33所示。圆为拉伸对象,样条曲线和矩形为路径。图11-33 路径拉伸4.当指定拉伸高度为正时,沿Z轴正方向拉伸;当给定高度值为负时,沿Z轴反方向拉伸。5.拉伸的倾斜角度:在-90°和+90°之间。6.含有宽度的多段线在拉伸时宽度被忽略,沿线宽中心拉伸。含有厚度的对象,拉伸时厚度被忽略。 11.7通过二维图形创建实体——旋转任务:绘制如图11-34所示的实体模型。目的:通过绘制此图形,学习旋转命令的使用。知识的储备:视图。绘图步骤分解:1、画回转截面新建一张图,视图方向调整到主视图方向,调用“多段线”命令,绘制图11-35(a)所示的封闭图形,再绘制辅助直线AC,BD,如图11-35(b)所示。图11-35 绘制截面2、旋转生成实体调用旋转命令:实体工具栏:下拉菜单:[绘图][实体][旋转] 命令窗口: REVOLVE 'AutoCAD提示:命令: _revolve当前线框密度: ISOLINES=4选择对象:选择封闭线框 找到 1 个选择对象: ' //结束选择。指定旋转轴的起点或定义轴依照 [对象(O)/X 轴(X)/Y 轴(Y)]: 选择端点C //按定义轴旋转。指定轴端点:选择端点D指定旋转角度 <360>:' //接受默认,按360°旋转。3、将辅助线AC、BD删除。如图11-34所示。补充知识:1、命令选项:l 定义轴依照:捕捉两个端点指定旋转轴,旋转轴方向从先捕捉点指向后捕捉点。l 对象(O):选择一条已有的直线作为旋转轴。l X 轴(X)或Y 轴(Y):选择绕X或Y轴旋转。2、旋转轴方向:l 捕捉两个端点指定旋转轴时,旋转轴方向从先捕捉点指向后捕捉点。l 选择已知直线为旋转轴时,旋转轴的方向从直线距离坐标原点较近的一端指向较远的一端。3、旋转方向:旋转角度正向符合右手螺旋法则,即用右手握住旋转轴线,大拇指指向旋转轴正向,四指指向为旋转角度方向。4、旋转角度为0°~ 360°之间,图11-36中为旋转角度为180°和270°时的情况。图11-36 180°和270°11.8编辑实体——剖切、切割任务:绘制如图11-37所示的实体模型和断面图形。目的:通过绘制此图形,学习剖切命令、切割命令的使用。知识的储备:视图、拉伸、布尔运算。 绘图步骤分解:图11-37 轴承坐1.绘制底板实体(1)按图11-38所示尺寸绘制外形轮廓。图11-38平面图形 (2)创建面域。 调用面域命令,选择所有图形,生成两个面域。再调用“差集”命令,用外面的大面域减去中间圆孔面域,完成面域创建。(3)拉伸面域 单击实体工具栏上的“拉伸”按钮,调用拉伸命令:命令: _extrude当前线框密度: ISOLINES=4选择对象: 选择图形 找到 1 个选择对象:'指定拉伸高度或 [路径(P)]: 8'指定拉伸的倾斜角度 <0>:'结果如图11-39所示。图11-39 底板实体 图11-40 圆筒端面 2.创建圆筒(1)调用圆命令,绘制如图11-40所示的图形。(2)创建环形面域。(3)拉伸实体。 调用“实体工具栏”上的“拉伸”命令,选择环形面域,以高度为22,倾斜角度为0°拉伸面域,生成圆筒。如图11-41所示。3.合成实体(1)组装模型 调用移动命令:命令: _move选择对象: 选择圆筒 找到 1 个选择对象:' //结束选择。指定基点或位移:选择圆筒下表面圆心指定位移的第二点或 <用第一点作位移>:选择底板上表面圆孔圆心(2)并集运算 选择“实体编辑”工具栏上的“并集”按钮,调用并集命令,选择两个实体,合成一个。完成图如11-42所示。 将创建的实体复制两份备用。图11-41 圆筒 图11-42 完整的实体 4.创建全剖实体模型调用剖切命令:实体工具栏:下拉菜单:[绘图][实体][剖切] 命令窗口: SLICE 'AutoCAD提示:命令: _slice选择对象: 选择实体模型 找到 1 个选择对象: '指定切面上的第一个点,依照 [对象(O)/Z 轴(Z)/视图(V)/XY平面(XY)/YZ平面(YZ)/ZX平面(ZX)/三点(3)] <三点>:选择左侧U形槽上圆心A指定平面上的第二个点:选择圆筒上表面圆心B指定平面上的第三个点:选择右侧U形槽上圆心C在要保留的一侧指定点或 [保留两侧(B)]:在图形的右上方单击 //后侧保留。结果如图11-37(a)所示。5.创建半剖实体模型(1)选择前面复制的完整轴座实体,重复剖切过程,当系统提示:“在要保留的一侧指定点或 [保留两侧(B)]:”时,选择“B”选项,则剖切的实体两侧全保留。结果如图11-43所示,虽然看似一个实体,但已经分成前后两部分,并且在两部分中间过ABC已经产生一个分界面。(2)将前部分左右剖切再调用“剖切”命令:命令: _slice选择对象:选择前部分实体 找到 1 个选择对象:' //结束选择。指定切面上的第一个点,依照 [对象(O)/Z 轴(Z)/视图(V)/XY平面(XY)/YZ平面(YZ)/ZX平面(ZX)/三点(3)] <三点>: 选择圆筒上表面圆心B指定平面上的第二个点:选择底座边中心点D指定平面上的第三个点:选择底座边中心点E在要保留的一侧指定点或 [保留两侧(B)]:在图形左上方单击结果如图11-44所示。图11-43 切割成两部分的实体 图11-44 半剖的实体 (3)合成 调用“并集”运算命令,选择两部分实体,将剖切后得到的两部分合成一体,结果如图11-37(b)所示。6.创建断面图选择备用的完整实体操作。(1)切割调用切割命令:实体工具栏:下拉菜单:[绘图][实体][切割] 命令窗口: SECTION 'AutoCAD提示:命令: _section选择对象: 选择实体 找到 1 个选择对象: ' //选择结束。指定截面上的第一个点,依照 [对象(O)/Z 轴(Z)/视图(V)/XY平面(XY)/YZ平面(YZ)/ZX平面(ZX)/三点(3)] <三点>:选择左侧U形槽上圆心A指定平面上的第二个点:选择圆筒上表面圆心B指定平面上的第三个点:选择右侧U形槽上圆心C结果如图11-45(a)所示(在线框模式下)。图11-45 切割实体 (2)移出切割面 调用移动命令,选择图11-45(a)中的切割面,移动到图形外,如图11-45(b)所示。 (3)连接图线 调用直线命令,连接上下缺口。(4)填充图形 调用填充命令,选择两侧闭合区域填充,结果如图11-37(c) 所示。 11.9编辑实体的面——拉伸面任务:将图11-46(a)所示的实体模型修改成11-46(b)所示的图形。目的:通过绘制此图形,学习拉伸面命令的使用。知识的储备:UCS、视图、拉伸。图11-46 工字钢绘图步骤分解:1.创建图11-46(a)实体 新建一张图纸,调整到主视图方向,调用“多段线”命令,按图示尺寸绘制“工”字型断面,再选择“实体工具栏”上的“拉伸”命令,视图方向调至西南等轴测方向,创建如如图11-46(a)所示实体。2.拉伸面(1)绘制拉伸路径将坐标系的XY平面调整到底面上,坐标轴方向与“工”字钢棱线平行,调用“多段线”命令,绘制拉伸路径线。 (2)拉伸面调用拉伸面命令:实体编辑工具栏:下拉菜单:[修?span lang=EN-US>][实体编辑][拉伸面]命令: _solidedit实体编辑自动检查: SOLIDCHECK=1输入实体编辑选项 [面(F)/边(E)/体(B)/放弃(U)/退出(X)] <退出>: _face输入面编辑选项[拉伸(E)/移动(M)/旋转(R)/偏移(O)/倾斜(T)/删除(D)/复制(C)/着色(L)/放弃(U)/退出(X)] <退出>: _extrude选择面或 [放弃(U)/删除(R)]:选择工字型实体右端面 找到一个面。选择面或 [放弃(U)/删除(R)/全部(ALL)]: '指定拉伸高度或 [路径(P)]: p'选择拉伸路径:在路径线上单击已开始实体校验。已完成实体校验。结果如图11-46(b)所示。补充知识:1.命令选项中“指定拉伸高度”的使用方法同“拉伸”命令中的“指定拉伸高度”选项是相同的,这里不再赘述。2.选择面时常常会把一些不需要的面选择上,此时应选择“删除”选项删除多选择的面。 11.10编辑实体的面——移动面、旋转面、倾斜面图11-47垫块实体 任务:将图11-47(a)所示的实体模型修改成11-47(b)所示的图形。目的:通过绘制此图形,学习移动面、旋转面、倾斜面命令的使用。知识的储备:UCS、视图、拉伸、布尔运算。 绘图步骤分解:1.绘制原图形(1)创建“L”型实体块 建立一张新图,调整到主视图方向,用多段线命令按尺寸绘制“L”形的端面,然后调用“拉伸”命令创建实体。并在其上表面捕捉棱边中点绘制辅助线AB。如图11-48 (a)所示。(2)创建腰圆形立体 在俯视图方向按尺寸绘制腰圆形端面,生成面域后,拉伸成实体,并在其上表面绘制辅助线CD,如图11-48(b)所示。(3)布尔运算选择腰圆形立体,以CD的中点为基点移动到AB的中点处。然后用“L”型实体减去腰圆形实体。原图形绘制完成,结果如图11-47(a)所示。图11-48创建原图形2.移动面调用移动面命令:实体编辑工具栏:下拉菜单:[修改][实体编辑][移动面] AutoCAD提示:命令: _solidedit实体编辑自动检查: SOLIDCHECK=1输入实体编辑选项 [面(F)/边(E)/体(B)/放弃(U)/退出(X)] <退出>: _face输入面编辑选项[拉伸(E)/移动(M)/旋转(R)/偏移(O)/倾斜(T)/删除(D)/复制(C)/着色(L)/放弃(U)/退出(X)] <退出>: _move选择面或 [放弃(U)/删除(R)]:在孔边缘线上单击 找到一个面。选择面或 [放弃(U)/删除(R)/全部(ALL)]: 在孔边缘线上单击 找到 2 个面。选择面或 [放弃(U)/删除(R)/全部(ALL)]: 在孔边缘线上单击 找到 2 个面。选择面或 [放弃(U)/删除(R)/全部(ALL)]: 在孔边缘线上单击 找到 2 个面。选择面或 [放弃(U)/删除(R)/全部(ALL)]: R '删除面或 [放弃(U)/添加(A)/全部(ALL)]: 选择多选择的表面 找到一个面,已删除 1 个。删除面或 [放弃(U)/添加(A)/全部(ALL)]: ' //当只剩下要移动的内孔面时, 结束选择,如图11-49(a)所示。指定基点或位移:选择CD的中点指定位移的第二点:选择EF的中点已开始实体校验。已完成实体校验。结果如图11-49(b)所示。图11-49 移动面3.旋转面调用旋转面命令:实体编辑工具栏:下拉菜单:[修改][实体编辑][旋转面] 命令: _solidedit实体编辑自动检查: SOLIDCHECK=1输入实体编辑选项 [面(F)/边(E)/体(B)/放弃(U)/退出(X)] <退出>: _face输入面编辑选项[拉伸(E)/移动(M)/旋转(R)/偏移(O)/倾斜(T)/删除(D)/复制(C)/着色(L)/放弃(U)/退出(X)] <退出>: _rotate选择面或 [放弃(U)/删除(R)]:选择内孔表面 找到 2 个面。删除面或 [放弃(U)/添加(A)/全部(ALL)]: ' //同上步一样选择全部内孔表面,当 只剩下要移动的内孔面时, 结束选择。指定轴点或 [经过对象的轴(A)/视图(V)/X 轴(X)/Y 轴(Y)/Z 轴(Z)] <两点>: Z '指定旋转原点 <0,0,0>:选择EF的中点指定旋转角度或 [参照(R)]: 90'已开始实体校验。已完成实体校验。结果如图11-50所示。图11-50 旋转面4.倾斜面调用倾斜命令:实体编辑工具栏:下拉菜单:[修改][实体编辑][倾斜面]命令: _solidedit实体编辑自动检查: SOLIDCHECK=1输入实体编辑选项 [面(F)/边(E)/体(B)/放弃(U)/退出(X)] <退出>: _face输入面编辑选项[拉伸(E)/移动(M)/旋转(R)/偏移(O)/倾斜(T)/删除(D)/复制(C)/着色(L)/放弃(U)/退出(X)] <退出>: _taper选择面或 [放弃(U)/删除(R)]:选择GHJK表面 找到一个面。选择面或 [放弃(U)/删除(R)/全部(ALL)]:'指定基点:选择G点指定沿倾斜轴的另一个点:选择H点指定倾斜角度: 30'已开始实体校验。已完成实体校验。删除辅助线结果如图11-47(b)所示。 11.11编辑实体的面——复制面、着色面任务:将图11-51(a)所示的实体模型修改成11-51(b)(c)所示的图形。目的:通过绘制此图形,学习着色面、复制面命令的使用。知识的储备:拉伸、旋转面命令。绘图步骤分解:图11-51 着色面、复制面 1.创建图11-51(a)所示实体(步骤略)。2.倾斜面 调用“旋转面”命令,选择实体的“工字型”端面,以侧边为轴,以30°角旋转端面,得到倾斜面。3.着色面调用着色面命令:实体编辑工具栏:下拉菜单:[修改][实体编辑][着色面]命令: _solidedit实体编辑自动检查: SOLIDCHECK=1输入实体编辑选项 [面(F)/边(E)/体(B)/放弃(U)/退出(X)] <退出>: _face输入面编辑选项[拉伸(E)/移动(M)/旋转(R)/偏移(O)/倾斜(T)/删除(D)/复制(C)/着色(L)/放弃(U)/退出(X)] <退出>: _color选择面或 [放弃(U)/删除(R)]:选择倾斜的端面 找到一个面。选择面或 [放弃(U)/删除(R)/全部(ALL)]:'弹出选择颜色对话框,选择合适的颜色,单击确定。再按 Esc 键,结束命令。在面着色或体着色的模式下观察图形,结果如图11-51(b)所示。4.复制面调用复制面命令: 实体编辑工具栏:下拉菜单:[修改][实体编辑][复制面]命令: _solidedit实体编辑自动检查: SOLIDCHECK=1输入实体编辑选项 [面(F)/边(E)/体(B)/放弃(U)/退出(X)] <退出>: _face输入面编辑选项[拉伸(E)/移动(M)/旋转(R)/偏移(O)/倾斜(T)/删除(D)/复制(C)/着色(L)/放弃(U)/退出(X)] <退出>: _copy选择面或 [放弃(U)/删除(R)]:选择倾斜端面 找到 1 个面。选择面或 [放弃(U)/删除(R)/全部(ALL)]:'指定基点或位移:选择左下角点指定位移的第二点:选择目标点翟侔 Esc 键,结束命令。结果如图11-51(c)所示。 11.12编辑三维实体——抽壳、复制边、对齐、着色边任务:创建如图11-52所示实体。目的:通过绘制此图形,学习抽壳、复制边、着色边命令的使用。知识的储备:拉伸、UCS、布尔运算。绘图步骤分解:1.创建长方体 新建一个图形,调用长方体命令,绘制长400,宽250,高120的长方体。2.抽壳以下面任意一种方法调用抽壳命令:实体编辑工具栏:下拉菜单:[修改][实体编辑][抽壳]命令: _solidedit实体编辑自动检查: SOLIDCHECK=1输入实体编辑选项 [面(F)/边(E)/体(B)/放弃(U)/退出(X)] <退出>: _body输入体编辑选项[压印(I)/分割实体(P)/抽壳(S)/清除(L)/检查(C)/放弃(U)/退出(X)] <退出>: _shell选择三维实体:选择长方体删除面或 [放弃(U)/添加(A)/全部(ALL)]:选择长方体上表面 找到一个面,已删除 1 个。删除面或 [放弃(U)/添加(A)/全部(ALL)]:选择长方体前表面 找到一个面,已删除 1 个。删除面或 [放弃(U)/添加(A)/全部(ALL)]:'输入抽壳偏移距离: 18'已开始实体校验。已完成实体校验。结果如图11-53所示。3.复制边以下面任意一种方法调用复制边命令:实体编辑工具栏:下拉菜单:[修改][实体编辑][复制边]命令: _solidedit实体编辑自动检查: SOLIDCHECK=1输入实体编辑选项 [面(F)/边(E)/体(B)/放弃(U)/退出(X)] <退出>: _edge输入边编辑选项 [复制(C)/着色(L)/放弃(U)/退出(X)] <退出>: _copy选择边或 [放弃(U)/删除(R)]:选择AB边选择边或 [放弃(U)/删除(R)]:选择AC边选择边或 [放弃(U)/删除(R)]:选择CD边选择边或 [放弃(U)/删除(R)]:'指定基点或位移:选择点A指定位移的第二点:选择目标点再按 Esc 键,结束命令。得到复制的边框线A1B1,A1C1,C1D1,如图11-53 所示。图11-53 抽壳、复制边 图11-54 制作抽屉面 4.创建抽屉面板(1)新建UCS,将原点置于A1点,A1C1作为OX轴方向,A1B1作为OY轴方向。(2)调用偏移命令,将直线A1B1、A1C1、C1D1向外偏移动20,如图11-54所示。得EF,EH,HG,再编辑成矩形,创建成面域。(3)调用拉伸命令,给定高度20,拉伸成长方体。5.对齐调用着色边对齐命令:下拉菜单:[修改][三维操作][对齐]命令: _align选择对象:选择面板 找到 1 个选择对象:'指定第一个源点:选择FG中点指定第一个目标点:选择BD中点指定第二个源点:选择E点指定第二个目标点:选择A点指定第三个源点或 <继续>:选择G点指定第三个目标点: 选择D点如图11-55所示。图11-55 对齐面6、布尔运算 删除辅助线BD。 调用“并集”运算命令,选择抽壳体和面板,合并成一个实体。7、着色边 AutoCAD可以改变实体边的颜色,这样为在线框模式和消隐模式下编辑实体时,区分不同面上的线提供了方便。调用命令的方法:实体编辑工具栏:下拉菜单:[修改][实体编辑][着色边]执行结果同着色面。提示、注意、技巧:(1)对齐命令在二维和三维下均可以使用。(2)如果只指定了一点对齐,则把源对象从第一个源点移动到第一个目标点。(3)如果指定两个对齐点,则相当于移动、缩放。(4)当指定三个对齐点时,则命令结束后,3个原点定义的平面将与3个目标点定义的平面重合,并且第一个原点要移动到第一个目标点位置。 11.13编辑实体——压印、3D阵列、3D镜像、3D旋转任务:创建图11-56(a)、(b)所示实体并把其旋转成(c)方向。目的:通过绘制此图形,学习压印、3D阵列、3D镜像、3D旋转命令的使用。知识的储备:拉伸、UCS、布尔运算。 绘图步骤分解:图11-56 环形孔板1.创建“U”型板(1)将视图调整到主视图方向,绘制如图11-57所示的断面形状。(2)按长度200拉伸成实体。2.3D阵列对象(1)绘制表面圆调整UCS至上表面,方向如图11-58所示。调用圆命令,以(50,50)为圆心,20为半径绘制圆。图11-57平面图形 图11-58 绘制表面圆 (2)阵列对象调用三维阵列命令:下拉菜单:[修改][三维操作][三维阵列]AutoCAD提示:命令: _3darray选择对象: 选择圆 找到 1 个选择对象:'输入阵列类型 [矩形(R)/环形(P)] <矩形>:R'输入行数 (---) <1>: 2'输入列数 (|||) <1>: 2'输入层数 (...) <1>: 2'指定行间距 (---): 100'指定列间距 (|||): 100'指定层间距 (...): -110'结果如图11-59所示。3.压印调用压印命令:实体编辑工具栏:下拉菜单:[修改][实体编辑][压印]AutoCAD提示:命令: _solidedit实体编辑自动检查: SOLIDCHECK=1输入实体编辑选项 [面(F)/边(E)/体(B)/放弃(U)/退出(X)] <退出>: _body输入体编辑选项[压印(I)/分割实体(P)/抽壳(S)/清除(L)/检查(C)/放弃(U)/退出(X)] <退出>: _imprint选择三维实体:选择实体选择要压印的对象:选择一个圆是否删除源对象 [是(Y)/否(N)]篇5:Flash教程:随机生成树冠
用程序随机生成树冠,说明一下,元件“树”里的dp值控制树枝生长的深度,越高的话则分的越多,但请注意,dp超过13就有可能造成FLASH运行缓慢,
我解释一些代码的用处,以“右叉”的最后一帧代码来解释。
stop;
if (dp>0) { //dp用来控制树枝的生长,当dp<0的时候,树枝将不在分裂生长。
//以下是正上方新树枝的代码
k=random(4)+1; //k用来选择树形,分别是直形,左分形,右分形和中分行。
_parent.attachMovie(“sz_0”+k,“sz”+_parent.dp,_parent.dp); //生成一个新的树枝。
lik=_parent[“sz”+_parent.dp]; //用LIK锁定这个树枝,方便以后控制
rp=this._rotation+0; //rp是新的树枝的根坐标(黄点)相对于现在这个树枝根坐标(蓝点)的角度,此数值影响到将要新生成的新树枝的坐标。这里是以极坐标的角度来考虑的,因为该树枝的第一个点在正上方,所以修正值是0。
lp=62; //在rp这个方向上,新树枝根坐标的距离。
_parent.dp++; //深度控制,大家可以不用考虑
lik._x=this._x+lp*Math.sin(rp/180*Math.PI)*scal/100;
lik._y=this._y-lp*Math.cos(rp/180*Math.PI)*scal/100;
// 以上算式计算的是新树枝的根坐标,具体意思请参考极坐标和直角坐标换算的方式,
里面的scal是本树枝的缩放度。它会对坐标产生影响。
lik.scal=this.scal*_parent.jian; //新树枝的缩放度要比当前树枝的缩放度小一些
lik._xscale=lik.scal;
lik._yscale=lik.scal;
lik._rotation=rp+random(30)-15;; //新树枝的角度是当前树枝的角度向左右各15度随机摆动。(就是-15到+15度)
lik.dp=this.dp-1; //新树枝的生长度-1;
//以下是右侧新树枝的代码
k=random(4)+1;
_parent.attachMovie(“sz_0”+k,“sz”+_parent.dp,_parent.dp);
lik=_parent[“sz”+_parent.dp];
rp=this._rotation+20; //注意20度角度是这个新树枝的极坐标角度。
lp=52; //52是距离
_parent.dp++;
lik._x=this._x+lp*Math.sin(rp/180*Math.PI)*scal/100;
lik._y=this._y-lp*Math.cos(rp/180*Math.PI)*scal/100;
lik.scal=this.scal*_parent.jian;
lik._xscale=lik.scal;
lik._yscale=lik.scal;
lik._rotation=rp+random(30)+5;; //角度会向右偏一些,所以是当前角度增加5到35之间
lik.dp=this.dp-1;
}
当然管理员也提到了这是分形。
更多内容进入:
精品学习网IT教育频道
篇6:从头开始学习FLASH 3D教程
教程
效果演示:(用鼠标直接拖拽下面的物体)
点击这里下载源文件
大家都知道三维的点都有3个坐标,但FLASH只是有二维的坐标,所以要在FLASH里实现“三维”的效果,就需要对点的坐标进行转化,简单的说,就是怎么把三维坐标转换成二维坐标,(其实,这并不是真正的三维,而是一种视觉欺骗,看上去像三维的就这么回事。所以上面三维带引号。)
一、三维坐标系转化成二维坐标系
(1)、坐标的转换
flash中场景左上角为(0,0),而在数学中是场景中心为(0,0),怎样把它转成数学中的坐标系呢?
1.FLASH里的坐标视图
x=Stage.width/2; // Stage.width是场景的宽;
y=Stage.height/2; // Stage.height是场景的高;
这样就把原坐标的原点移动了,场景的中心点,不过,Y轴还是向下,为正的。(这在后面做旋转时要注意的。)
(2)、角度的转换
flash中Math函数里的参数都要用到弧度,所以角度与弧度之间的转换是需要知道的。
在flash as中,我们可以通过这样的表达式来进行转换:
hudu=jiaodu*Math.PI/180; / /把角度转换为弧度,公式为:弧度=角度 *3.14/180,3.14为pai
jiaodu=hudu*180/Math.PI; / /把弧度转换为角度,公式为:角度=弧度*180/3.14,3.14为pai
(if (jiaodu<0) { jiaodu = jiaodu+360; }/* 转换后的角度的范围从-180到180, 数学中的角度从0到360,所以小于0时加上360 */)
2、flash中的三维坐标系
如图3,z轴表示一个物体离屏幕的远近,当物体的z轴位置增加时,物体朝远离屏幕的方向运动,当物体的z值减小时,物体朝接近屏幕的方向运动。
图3:三维坐标系
图4:二维与三维的点的关系
3、三维坐标转换成二维坐标
如图4,已知一个点(x,y,z),利用三角形相似的原理,可以得出下列结论:
d/(d+z)=y1/y,推出:y1=d*y/(d+z),可在二维平面上来表现空间上的点的位置。进一步把它简化。提出因子d/(d+z),用ratio(比率)表示,这个公式就变为
ratio=d/(d+z);
y1=ratio*y;同理可推出
x1=ratio*x;
二、控制物体的属性(大小,层次,透明度等)
1、控制mc的大小
在三维坐标中,当z值增大,也就是远离屏幕时,物体应越小,反之越大。
我们可以用上满的ratio,当z增加时,ratio减少,因为在ratio中,z是作为分母的。反之,当z减少时,ratio增加。所以可用ratio来控制mc的大小。如下:
mc1._xscale=mc._xscale*ratio;
mc1._yscale=mc._yscale*ratio;
2、控制mc的层次
z值最大,物体应在最底层,最小,在最上层,
所以mc的层次可以有z组成,可以用很大的数减z,也可以让z除以负数,等等,这里方法比较灵活,也是做”三维”效果的关键,主要要在调试中确定适合设计的方法。flash中,设置mc的层次用swapDepths,如下:
mc.swapDepths(1000-z);//设置mc的层次
mc.swapDepths(z/-4);
3、控制mc的透明度
远处的物体看上去模糊些,近处的物体清晰些,在flash中,可用_alpha来控制,方法和控制大小类似,不在介绍原理。如下:
mc._alpha=100*ratio;
4、控制mc的角度(旋转)
这一步最难,也最好的东东。学习以后,你将能制作出非常cool的效果
旋转有三种,x旋转:坐标x不变,y旋转:y不变,z旋转:z不变,我们先来推导z旋转。
如下图:从点(x,y,0)转到(x1.y1.0),求点(x1.y1.0)
利用数学中的正弦、余弦公式得出
x1=r*cos(a+b),而cos(a+b)=sina*cosb+cosa*sinb
推出:x1=r(cosa*cosb-sina*sinb)
又因为x=r*cosa,y=r*sina
所以x1=x*cosb-y*sinb
同样推出:y1=y*cosb+x*sinb
这就是z旋转的公式。用同样的方法可推出x旋转,y旋转的公式。总结如下:
给定点:(x,y,z)
绕x轴旋转后的点(x1,y1,z1)
绕y轴旋转后的点(x2,y2,z2)
绕z轴旋转后的点(x3,y3,z3)
x旋转(x不变)
x1=x
y1=y*cosb-z*sinb
z1=z*cosb+y*sinb
注:x旋转要注意,在FLASH中x1=x
y1=y*cosb+z*sinb
z1=z*cosb-y*sinb
是先加后减,因为FLASH里的Y轴是反的,箭头向下的。
y旋转(y不变)
x2=x*cosb-z1*sinb
y2=y1
z2=z1*cosb+x*sinb
z旋转(z不变)
x3=x2*cosb-y1*sinb
y3=y1*cosb+x2*sinb
z3=z2
从以上公式可看出,在flash要实现旋转,先要求x轴的旋转点,再求y轴的旋转点,最后再求出z轴的旋转点。最后我们来一个x旋转的应用
三、制作x轴旋转的正方体
1、在场景中画一小球,并按F8转换为mc,实例命名为qiu。
2、增加一层,命名为as,接下去我们来写as,如下:
_root.onLoad = function() {
shumu = 8;
// 定义复制小球的数目
qiu._x = 6000;
// 让原始小球消失
for (var i = 0; i duplicateMovieClip(“qiu”, “qiu”+i, i); } // 复制小球,作为正方体的八个顶点 qiu_pos_x = new Array(100, 0, 0, 100, 100, 0, 0, 100); qiu_pos_y = new Array(100, 100, 100, 100, 0, 0, 0, 0); qiu_pos_z = new Array(50, 50, -50, -50, 50, 50, -50, -50); // 从三维坐标中取正方体的8个顶点的坐标,保存在数组中 D = 200; // 观察者与屏幕的距离 hutu = 0.001; // 控制旋转的速度 b = hutu*180/Math.PI; // 角、弧度的转换 }; _root.onEnterFrame. = function() { for (var i = 0; i x1 = qiu_pos_x[i]; y1 = qiu_pos_y[i]*Math.cos(b)-qiu_pos_z[i]*Math.sin(b); z1 = qiu_pos_z[i]*Math.cos(b)+qiu_pos_y[i]*Math.sin(b); // 按公式计算 qiu_pos_x[i] = x1; qiu_pos_y[i] = y1; qiu_pos_z[i] = z1; // 更新数组元素 ratio = D/(D+z1); perspective_x = x1*ratio; perspective_y = y1*ratio; // 按公式计算 _root[“qiu”+i]._x = 275+perspective_x; _root[“qiu”+i]._y = 200-perspective_y; / 设置球的坐标 _root[“qiu”+i]._xscale = _root[“qiu”+i]._yscale=50*ratio; // 球的大小 _root[“qiu”+i].swapDepths(10000-qiu_pos_z[i]); // 球的层次 _root[“qiu”+i]._alpha=100*ratio;//设置透明度 } }; 3、按CTRL+Enter测试,一个简单的3D旋转就形成了。 (至此为止,上面部分的教程很大程度上是参考《flash 3D 基础教程》(作者:zjs35 文章来源:flashempire 更新时间:2004-4-7)的,本人只在上面做了微小部分的修改,主要因为这篇对FLASH_3D效果的基础理论确实写的很好。修改的部分,是本人在学习之后,自己在实践练习中发现的一些需要注意的地方。) 接下来将为大家解析一篇某人大虾写的立方体旋转的FLASH_AS,这位大虾是用纯AS写的,只要把代码全部复制到第一桢就可以了。我将做详细的解析!!! //先给各项赋值,为后面的编辑作做准备 plane = [0, [0, 1, 2, 3, 4], [0, 5, 6, 7, 8], [0, 1, 2, 6, 5], [0, 2, 3, 7, 6], [0, 4, 3, 7, 8], [0, 1, 4, 8, 5]]; //给立方体的8个点都标上数,这里定义的数组是立方体的6个面,每个面上4个点,上面的数字就是哪四个点组成一个面,每组前面多个0,是为了下面做循环调用是方便,循环可以从i=1开始。大家自己可以根据上面的数组。画出它在三维坐标中的立体图形。另,第一“0“,其实是[0,0,0,0,0]。 dx = [0, 1, -1, -1, 1, 1, -1, -1, 1]; //这里是给8个点在三维坐标定义数组,竖着看,没一行就是一个点坐标的(x,y,z) ,另没组前面多个0,是为了下面做循环调用是方便,循环可以从i=1开始。 dy = [0, 1, 1, 1, 1, -1, -1, -1, -1]; // dz = [0, 1, 1, -1, -1, 1, 1, -1, -1]; // colour=0x4499FF //这里定义的是立方体的颜色,其实,要6个面,每个面的颜色不同,就把这个colour定义成数组就可以了。同样前面加个0,也是上面的理由。 //colour=[0,0x4499FF,0x6F13EC,0xF1F00E,0x6CE31C,0x26D9A3,0x808080]; trans = Math.PI/180; //下面的弧度和角度的转换用 cube_width = 100; //用于设定立方体的边的长度 d = 400; //// 观察者与屏幕的距离 num_planes = plane.length-1; //num_planes=6 num_nodes = dx.length-1; //num_nodes=8 num_nodes_per_plane = plane[1].length-1;//num_nodes_per_plane=4 xz_angle_inc = 0; //下面这4个定义对用鼠标控制旋转的速度有关, yz_angle_inc = 0; angle_inc_factor = .1; angle_dec_factor = .9; o_x = Stage.width/2; //把坐标原点移到屏幕中心 o_y = Stage.height/2; node = new Array(); //定义新数组 p_node = new Array(); //边长调整... 主要是求出8个点,在设定边长,情况下的坐标 for (i=1; i<=num_nodes; i++) { node[i] = new Object(); node[i].x = dx[i]*(cube_width/2); node[i].y = dy[i]*(cube_width/2); node[i].z = dz[i]*(cube_width/2); } for (i=1; i<=num_planes; i++) { //建立6个空白的影片剪辑,主要用于,每天影片剪辑,画一个立方体的面, _root.createEmptyMovieClip(“plane”+i, i); } //版面的调整 下面的_root.onEnterFrame. 会调用这里进行画立方体 //对这里不理解的,看附录一的代码! function create_planes() { for (var i = 1; i<=num_planes; i++) { depth = 0; //设定深度初始值 mc = _root[“plane”+i]; //每个影片剪辑画一个立方体的一个面 mc.clear(); //清除上次画的面,不用这句语句,可以看到面的连续旋转的会是什么轨迹,程序是怎么画的。不过,很难看。 mc.beginFill(colour, 100); //设置立方体面的颜色,colour可以变数组colour[i],这样每个面可以画,不同的颜色。 mc.lineStyle(3,0xFF0000,100);//设置立方体的棱的颜色 mc.moveTo(p_node[plane[i][1]].x, p_node[plane[i][1]].y);//这里设定每个正方形面,开始画时的启始点。 for (j=num_nodes_per_plane; j>=1; j--) { //这里是连续读取4个点,画好一个正方形 mc.lineTo(p_node[plane[i][j]].x, p_node[plane[i][j]].y); depth += node[plane[i][j]].z; //求每个面上4点旋转后,4个点的深度变化,并相加 } depth /= -num_nodes_per_plane;//注意除以负数,这样符合,FLASH的深度变化的远近情况 mc.swapDepths(depth); //有点的深度变化,来控制面的层次变化,如果没有这句,可以看到一个立方体在旋转是6个面的层次混乱。 amount = depth/50*100+15;//用深度变化,在传值,这个参数主要用于下面的语句,下面的语句,用于立方体在旋转时,面的亮度的调整,符合一定的光照效果。 new Color(mc).setTransform({ra:amount, ga:amount, ba:amount}); //这句语句可以查看FLASH_AS语法参考,可以找到的。主要是对色彩的设置。 } } //鼠标激发 _root.onMouseDown = function() { mouse_down = true; }; _root.onMouseUp = function() { mouse_down = false; }; _root.onEnterFrame. = function() { if (mouse_down) { //判断,鼠标情况,对鼠标移动距离的相加,如果,没有“+=”而用“=”,这样鼠标每点一次,图象就跳回初始状态。可以自己实验看下效果,进行对比。 xz_angle_inc += (_xmouse-old_mx)*angle_inc_factor; yz_angle_inc += (_ymouse-old_my)*angle_inc_factor; } for (i=1; i<=num_nodes; i++) { sin_xz = Math.sin(xz_angle_inc*trans); //对弧度与角度的转化公式。 cos_xz = Math.cos(xz_angle_inc*trans); sin_yz = Math.sin(yz_angle_inc*trans); cos_yz = Math.cos(yz_angle_inc*trans); rx1 = cos_xz*node[i].x-sin_xz*node[i].z; //这里就是上面的坐标转换公式里的,先按Y轴旋转,再按X轴旋转。 ry1 = node[i].y; rz1 = cos_xz*node[i].z+sin_xz*node[i].x; rx2 = rx1; ry2 = cos_yz*ry1+sin_yz*rz1; rz2 = cos_yz*rz1-sin_yz*ry1; node[i].x = rx2; //这里是把每个旋转后,得到的先的坐标保存在变量里 node[i].y = ry2; node[i].z = rz2; p_ratio = d/(d+node[i].z); //这个是上面d/(d+z) p_node[i] = new Object(); p_node[i].x = o_x+node[i].x*p_ratio; //确定在屏幕上点的位置 p_node[i].y = o_y-node[i].y*p_ratio; } xz_angle_inc *= angle_dec_factor; //这个加速鼠标控制时的旋转速度 yz_angle_inc *= angle_dec_factor; old_mx = _xmouse; //得到影片开始时的鼠标坐标 old_my = _ymouse; create_planes(); //调用上面的函数,画出立方体 }; //点评:本人只所以选择这个例子进行解析,主要是因为画立方体,是很常见的例子,也是3D里的一个基本的画法。另,这个例子的代码是很精练,简洁,再加上代码的前部分定义的一些值,利于以后做其他项目的开发,可以把这个程序改成一个类,适合自身以后,对画立方体时调用。同时,可以在这个程序基础上做进一步开发!比如,将好几个立方体叠起来,把图片放在立方体的面上,做一些旋转立体按钮等等,都是可以的。 //附录一: /*function create_planes(){ depth=0; plane1.clear(); plane1.beginFill(0xAB548B,100); plane1.lineStyle(3,0xFF0000,100); plane1.moveTo(p_node[5].x,p_node[5].y); plane1.lineTo(p_node[8].x,p_node[8].y); plane1.lineTo(p_node[7].x,p_node[7].y); plane1.lineTo(p_node[6].x,p_node[6].y); plane1.lineTo(p_node[5].x,p_node[5].y); depth=node[8].z+node[7].z+node[6].z+node[5].z; depth=depth/(-4); plane1.swapDepths(depth); amount=depth/50*100+15; //new Color(plane1).setTransform({ra:amount,ga:amount,ba:amount,aa:amount}); new Color(plane1).setTransform({ra:amount,ga:amount,ba:amount}); depth=0; plane2.clear(); plane2.beginFill(0x808080,100); plane2.lineStyle(3,0xFF0000,100); plane2.moveTo(p_node[1].x,p_node[1].y); plane2.lineTo(p_node[2].x,p_node[2].y); plane2.lineTo(p_node[3].x,p_node[3].y); plane2.lineTo(p_node[4].x,p_node[4].y); plane2.lineTo(p_node[1].x,p_node[1].y); depth=depth+node[4].z+node[3].z+node[2].z+node[1].z; depth=depth/(-4); plane2.swapDepths(depth); amount=depth/50*100+15; new Color(plane2).setTransform({ra:amount,ga:amount,ba:amount}); depth=0; plane3.clear(); plane3.beginFill(0x8A0FF0,100); plane3.lineStyle(3,0xFF0000,100); plane3.moveTo(p_node[1].x,p_node[1].y); plane3.lineTo(p_node[2].x,p_node[2].y); plane3.lineTo(p_node[6].x,p_node[6].y); plane3.lineTo(p_node[5].x,p_node[5].y); plane3.lineTo(p_node[1].x,p_node[1].y); depth=depth+node[1].z+node[2].z+node[6].z+node[5].z; depth=depth/(-4); plane3.swapDepths(depth); amount=depth/50*100+15; new Color(plane3).setTransform({ra:amount,ga:amount,ba:amount}); depth=0; plane4.clear(); plane4.beginFill(0xE61A48,100); plane4.lineStyle(3,0xFF0000,100); plane4.moveTo(p_node[2].x,p_node[2].y); plane4.lineTo(p_node[3].x,p_node[3].y); plane4.lineTo(p_node[7].x,p_node[7].y); plane4.lineTo(p_node[6].x,p_node[6].y); plane4.lineTo(p_node[2].x,p_node[2].y); depth=depth+node[2].z+node[3].z+node[7].z+node[6].z; depth=depth/(-4); plane4.swapDepths(depth); amount=depth/50*100+15; new Color(plane4).setTransform({ra:amount,ga:amount,ba:amount}); depth=0; plane5.clear(); plane5.beginFill(0x49B667,100); plane5.lineStyle(3,0xFF0000,100); plane5.moveTo(p_node[4].x,p_node[4].y); plane5.lineTo(p_node[3].x,p_node[3].y); plane5.lineTo(p_node[7].x,p_node[7].y); plane5.lineTo(p_node[8].x,p_node[8].y); plane5.lineTo(p_node[4].x,p_node[4].y); depth=depth+node[4].z+node[3].z+node[7].z+node[8].z; depth=depth/(-4); plane5.swapDepths(depth); amount=depth/50*100+15; new Color(plane5).setTransform({ra:amount,ga:amount,ba:amount}); depth=0; plane6.clear(); plane6.beginFill(0xDEB321,100); plane6.lineStyle(3,0xFF0000,100); plane6.moveTo(p_node[1].x,p_node[1].y); plane6.lineTo(p_node[5].x,p_node[5].y); plane6.lineTo(p_node[8].x,p_node[8].y); plane6.lineTo(p_node[4].x,p_node[4].y); plane6.lineTo(p_node[1].x,p_node[1].y); depth=depth+node[1].z+node[5].z+node[8].z+node[4].z; depth=depth/(-4); plane6.swapDepths(depth); amount=depth/50*100+15; new Color(plane6).setTransform({ra:amount,ga:amount,ba:amount}); }*/
★ 硕士论文选题攻略
【Flash教程三维引擎初探(锦集6篇)】相关文章:
seo知识总结2024-01-09
平面设计教学2022-10-15
平面设计教学反思2023-02-06
seo优化总结2022-07-24
初中信息技术教学意义与实效的论文2022-06-03
浅谈初中信息技术教学论文2022-08-28
刷网站流量刷PV刷IP工具介绍2023-07-04
学习计算机技巧2023-07-22
网络环境下大学生价值观教育机制的构建原则探究论文2022-04-29
材料科学基础试题2022-12-14