转 第十六章 3D 线条与填充(1) (as3.0)

AS3.0 绘制线条组件 回答http://topic.csdn.net/u/20091128/16/6dbc9c19-a8b8-4c81-b498-44044073e8a8.html?25809 带箭头移动绘制矩形,小议AS3.0面向对像 立即下载

 第十五章我们介绍了 3D,但只是将物体置于 3D 空间中,设置大小与位置。物体实际
上还是 2D 的。这就像老的 3D 游戏中,我们可以绕着某个物体或人物走,这些对象会转
过来面对我们。这些物体或人物并不是真正的会转过来 —— 只是看上去是这样的,因为它
们都是 2D 物体,那是我们看到它唯一的一个视角。
    本章,我们将真正地在 Flash 中创建 3D 模型。具体说来有创建并使用 3D 点,线条,
填充以及立体图形。学习完本章,大家就可以任意在三维空间中创建各种形状,并对它们执
行移动和旋转。
创建点和线条
    如果只在 3D 中创建点而不创建线条的话是没有任何意义的。因为理论上讲,一个点
是没有维度并且不可见的。开始时,我们还将使用 Ball3D 类,给一个非常小的半径,只要
能看到点在哪就够了。这样,只需要再创建几条线将这些小球连起来就行了。相当简单。我
们前面做过这样的例子,不过这次要在小球上添加透视,将它们放入 3D 空间。
    可以将点的实例设为黑色,10 像素宽。创建一些点的实例,根据鼠标的位置对它们进
行旋转(如前一章最后所讲的一样)然后在点间绘制一些线条。代码与上一章的 RotateXY.as
文件几乎相同。主要的区别在 onEnterFrame 的最后一块儿,从第一个点循环绘制线条到剩
下所有的点。同时,我还删除了 sortZ 方法,因为在这里有没有都一样。以下是 Lines3D1.as
的全部代码。

运行结果如图 16-1 所示。

转 <wbr>第十六章 <wbr>3D <wbr>线条与填充(1) <wbr>(as3.0)
         图 16-1 3D 点与线


     实际来说,没有太多可改的地方。如果要转为立体 3D 模型,就要舍弃所有的这些黑
点。第一个尝试非常简单。只要在创建时将每个 Ball3D 实例的半径设置为 0 即可,如下:
    var ball:Ball3D = new Ball3D(0);


运行结果如图 16-2 所示。

转 <wbr>第十六章 <wbr>3D <wbr>线条与填充(1) <wbr>(as3.0)

图 16-2 3D 线条,点不可见
     回过头再看看先前的代码,   这时我们发现有很多地方是多余的。比如,scaleX, scaleY 以
及 visible 对于一个看不到的点来说完全没有用的。没有可见的或可缩放的对象。根据这条
线索,更深层地思考认识一下这个继承自 Sprite 类的一般类,现在它实际上只是五个变量
的容器:xpos, ypos, zpos, x, y。实在有些过分。一个影片有许多功能——发送事件,绘图,
容纳其它 sprite 影片等等 —— 并且占用了大量资源。如此使用一个 sprite 影片就像开着
坦克到市区里捡一块面包。
    如果只需要存储变量的话,不如让我们创建一个只用于存储这些变量作为属性的类。事
实上, 如果再将透视和坐标旋转再放入这个类中,比单纯只存储几个属性更有意义。  女士们、
先生们,现在我把这个 Point3D 类送与各位:

package {
 public class Point3D {
  public var fl:Number = 250;
  private var vpX:Number = 0;
  private var vpY:Number = 0;
  private var cX:Number = 0;
  private var cY:Number = 0;
  private var cZ:Number = 0;
  public var x:Number = 0;
  public var y:Number = 0;
  public var z:Number = 0;
public function Point3D(x:Number=0, y:Number=0, z:Number=0) {
  this.x = x;
  this.y = y;
  this.z = z;
}
public function setVanishingPoint(vpX:Number, vpY:Number):void {
  this.vpX = vpX;
  this.vpY = vpY;
}
public function setCenter(cX:Number,cY:Number,cZ:Number=0):void {
  this.cX = cX;
  this.cY = cY;
  this.cZ = cZ;
}
public function get screenX():Number {
  var scale:Number = fl / (fl + z + cZ);
  return vpX + cX + x * scale;
}
public function get screenY():Number {
  var scale:Number = fl / (fl + z + cZ);
  return vpY + cY + y * scale;
}
public function rotateX(angleX:Number):void {
  var cosX:Number = Math.cos(angleX);
  var sinX:Number = Math.sin(angleX);
  var y1:Number = y * cosX - z * sinX;
  var z1:Number = z * cosX + y * sinX;
  y = y1;
  z = z1;
    }
    public function rotateY(angleY:Number):void {
      var cosY:Number = Math.cos(angleY);
      var sinY:Number = Math.sin(angleY);
      var x1:Number = x * cosY - z * sinY;
      var z1:Number = z * cosY + x * sinY;
      x = x1;
      z = z1;
    }
    public function rotateZ(angleZ:Number):void {
      var cosZ:Number = Math.cos(angleZ);
      var sinZ:Number = Math.sin(angleZ);
      var x1:Number = x * cosZ - y * sinZ;
      var y1:Number = y * cosZ + x * sinZ;
      x = x1;
      y = y1;
    }
  }
}
       现在,在使用这个类创建 3D 点时,可以传入 x, y, z 坐标,或者使用公共的 x, y, z 属
性 进 行 设 置 。 类 中 包 涵 了 一 个 默 认 的 fl 属 性 以 及 用 于 存 放 消 失 点 的 属 性 , 可通过setVanishingPoint() 方法进行设置。使用三种旋转方法,可以绕着某一轴的中心点进行旋转。
还可以用 setCenter 方法改变中心点。大家马上会看到这些应用。最后,它还可以为我们处
理所有的透视。当我们已经旋转或设置了点的位置时,只需要用 screenX 和 screenY 即可
获得透视的点在屏幕上的位置。
     这个类会让我们后面两章的程序变得简单许多。
     使用这个新的类重新编写上面线条旋转的程序将会惊人的简单,如 Lines3D2.as 所示:
转 <wbr>第十六章 <wbr>3D <wbr>线条与填充(1) <wbr>(as3.0)

图 16-3 3D 空间中的正方形坐标
     注意,所有的 z 值都相同。这是一个平面上的正方形。将一个正方形放在平面上的最
简单的办法就是让所有的点在某个轴上的位置都相同(这里我选择了 z 轴),还要定义正方
形的其它两个轴(x 和 y 轴)。以下代码将代替循环随机创建的点:
points[0] = new Point3D(-100, -100, 100);
points[1] = new Point3D( 100, -100, 100);
points[2] = new Point3D( 100, 100, 100);
points[3] = new Point3D(-100, 100, 100);
我们还要手动设置每个点的消失点。在循环中做是再简单不过的了:
for (var i:uint = 0; i < numPoints; i++) {
  points[i].setVanishingPoint(vpX, vpY);
}
因为现在有四个点,我们将不得不把 numPoints 改为 4。剩下的代码还可以正常工作,但
是我们还要多做一步:绘制一条连接最后一个点与第一个点的线,用于将图形封闭。以下是
全部代码,可见 Square3D.as(运行结果如图 16-4 所示):


转 <wbr>第十六章 <wbr>3D <wbr>线条与填充(1) <wbr>(as3.0)
图 16-4 3D 旋转正方形
     太奇妙了——一个旋转的正方形!现在我们应该可以创建出任何的平面图形了。我通常
都预先将所有的这些点在方格纸上标出(如图 16-5 所示) ,用来帮助作图。

转 <wbr>第十六章 <wbr>3D <wbr>线条与填充(1) <wbr>(as3.0)
图 16-5 使用方格纸标出所有的点
     通过这个草稿,可以用来帮助创建所需的这些点:
points[0] = new Point3D(-150, -250, 100);
points[1] = new Point3D( 150, -250, 100);
points[2] = new Point3D( 150, -150, 100);
points[3] = new Point3D( -50, -150, 100);
points[4] = new Point3D( -50, -50, 100);
points[5] = new Point3D( 50, -50, 100);
points[6] = new Point3D( 50, 50, 100);
points[7] = new Point3D( -50, 50, 100);
points[8] = new Point3D( -50, 150, 100);
points[9] = new Point3D( 150, 150, 100);
points[10] = new Point3D( 150, 250, 100);
points[11] = new Point3D(-150, 250, 100);
这样就完成了 SpinningE.as 中的旋转字母 E 的效果,运行结果如图 16-6 所示。不要忘记
将 numPoints 改为 12。稍后我们要使用 points.length 让这个值可以动态改变。

转 <wbr>第十六章 <wbr>3D <wbr>线条与填充(1) <wbr>(as3.0)

图 16-6 3D 旋转字母 E

 

      执行后我们注意到当字母 E 向我们旋转过来时,某些点会变得非常近,并且与第一个
3D 例子一样会发生倒置。您也许首先会想到增加所有点的 z 值,但这实际上会让效果变
得更糟。例如,假设将 z 设为 500。旋转的时候,z 将从 500 到 -500,甚至会让有些点
运动到观察点更往后的位置,会让事情更糟糕。不过我们可以使用 setCenter 方法将所有点
向 z 轴推移,如下:
for (var i:uint = 0; i < numPoints; i++) {
  points[i].setVanishingPoint(vpX, vpY);
  points[i].setCenter(0, 0, 200);
}
打开 Point3D 类,我们会看到 scale 的计算方法为:
     var scale:Number = fl / (fl + z + cZ);
这样就将整个系统推移了 200 像素,包括旋转系统。原来 z 的值保持不变,只是因为计算
透视的值更高了,那么所有物体都将呈现在观察着的前面。试用其它的值进行替换,观察运
动效果。稍后,我们会让这个图形在其它的轴上也能运动起来。

(如果要转载请注明出处http://blog.sina.com.cn/jooi,谢谢)

flash as3.0颜色填充demo 这是一个简单的由as3.0代码实现的的颜色填充游戏,适合as3.0刚入门朋友借鉴。 立即下载

相关推荐

as3.0颜色填充

这是一个我自己写的,通过as3代码编写的简单易懂的颜色填充小游戏,希望可以帮到需要学习的人

Flash As3.0 绘制线条

package { import flash.display.Sprite; import flash.events.MouseEvent; import flash.events.Event; import fl.controls.ColorPicker;//导入组件ColorPicker的包 import flash.display.LineScaleMode;//为下面绘制线条指定笔触...

weixin_30408675的博客 529

雪莉果的Axure原型工厂vol.006 中继器应用(二)——多选穿梭框

如果你用axure有一段时间了,那么你很快就能琢磨出一个大体设计流程,比如加一个中间过度的元件,来储存需要穿梭的内容;但是如果你再想一想,就会发现,这样做,似乎只能解决单选,那么多选需要怎么操作呢? 这时候,中继器就会告诉你,我还能做的更多。

weixin_43829792的博客 979

AS3.0 Graphics类 lineStyle、drawRoundRect 、 drawRect

1.lineStyle 指定一种线条样式,Flash 可将该样式用于随后调用对象的其它 Graphics方法(如 lineTo() 或 drawCircle())。线条样式仍然有效,直到使用不同的参数调用 lineGradientStyle() 方法或 lineStyle() 方法为止。可以在绘制路径的中间调用 lineStyle(),以便为路径中的不同线段指定不同的样式。 参数

学习记录 7044

实战教程:如何用Python+小波变换+CNN搞定医学影像中的条纹噪声(附完整代码)

本文提供了一套完整的实战方案,指导如何利用Python结合小波变换与卷积神经网络(CNN)去除医学影像中的条纹噪声。该方法通过小波变换精准定位噪声,再使用轻量化CNN进行针对性清除,有效保护图像细节,并附有可运行的完整代码,为医学影像处理与AI分析提供高效工具。

weixin_29056101的博客 271

深入解析docx4j:从Word到PDF的高保真转换实战

本文深入解析了如何使用纯Java开源库docx4j实现Word到PDF的高保真转换。针对中文环境,重点讲解了字体映射原理、Linux服务器字体部署方案,并提供了完整的代码示例和配置方法。同时,文章涵盖了表格、图片处理、性能优化及生产环境部署指南,帮助Java开发者构建稳定、可控的文档转换服务。

weixin_29237635的博客 675

as3.0画直线

import flash.display.Shape; import flash.events.MouseEvent; import flash.geom.Point; var line:Shape; var point:Point; stage.addEventListener(MouseEvent.MOUSE_DOWN,drawBegin); stage.addEventLis...

weixin_30402085的博客 543

ISO7816协议深度解析-简单易懂协议详解(一)-- 复位,字符帧,及ATR

1. 摘要 IC卡必须支持T=0或T=1的协议,但不是同时支持这两种协议,而终端则必须同时支持T=0和T=1的协议。 • T=0通讯协议是异步半双工字符传输协议; • T=1通讯协议是异步半双工块传输协议; 在ISO7816-3标准中,具体规定了这两种协议:T0和T1。 IC卡所用的协议在TD1中指定,如果在复位应答信息中没有TD1,则表示用T=0的协议进行通讯。在复位应答后,IC卡和终端之间即用IC卡指定的协议进行通讯。 2. 硬件接口 1)VCC:电源输入(A类:5V, B类:3V) 2)GND:地 3

代码打工人的博客 4万+

转 第十六章 3D 线条与填充(2) (as3.0)

创建 3D 填充       大家也许都想到了,进行填充的准备工作大部分都已经完成了。我们已经创建了图形的 所有点,并从头到尾全部用线连接上了。现在所需的全部就是加入 beginFill 和 endFill,如 FilledE.as 文件中的代码。运行结果如图 16-7 所

roadProgram的专栏 1498

组合导航-IMU-GPS-RTK基本介绍

在实际应用中,需要利用 GPS、北斗等方式产生的信号进行初始化,结合惯导信号和卫星导航信号进行进行卡尔曼滤波处理,得出其最佳推算的定位信息。惯导比起卫星定位具有自身的技术优势,测量方法不依赖外界,短期精度高,能稳 定高频地输出信号。工作原理是通过感知物体在空间的角速度、线速度,进而获取物体的姿态、位置和速度等信息,实现对运动物体姿态和运动轨迹的测量,可以实现全天候全地点地工作。但惯导也有自身的缺陷,由于采用积分算法,定位误差随 载体运行不断累积。

NCU_wander的博客 8021

华为交换机与思科/华三设备LACP对接实战:手把手教你配置链路聚合

本文详细解析了华为交换机与思科、华三设备间的LACP链路聚合配置实战,涵盖核心原理、配置步骤及排错技巧。通过对比不同厂商的实现差异,提供可落地的跨厂商对接方案,助力企业网络工程师高效部署高可靠性链路聚合。

weixin_30836759的博客 427

【as3】ActionScript 3.0体验试教学视频教程

很不错的视频教程 原文地址: [url=http://blog.sina.com.cn/s/blog_3ecb9b1101009nx0.html]http://blog.sina.com.cn/s/blog_3ecb9b1101009nx0.html[/url]   全屏观看地址: [url=http://vhead.blog.sina.com.cn/player/outer_pla...

hgfghwq13 113

西门子博途系列学习笔记SCL(三)______自由口通讯(RS485轮询程序)

西门子博途V16系列学习笔记SCL(三)___自由口通讯轮询程序(RS485) 西门子博途系列学习笔记SCL(三)______自由口通讯(RS485轮询程序) 文章目录西门子博途V16系列学习笔记SCL(三)___自由口通讯轮询程序(RS485)前言一、FreePort自由口通讯是什么?二、使用步骤1.模块参数定义2.定义FB功能块参数:3.程序代码如下(每天写代码100行,学不会你来找我):总结 前言 很长时间都没有更新了,主要是最近在学习罗克韦尔的STUDIO5000PLC编程软件,怎么说,和博

weixin_42940283的博客 1万+
上一篇: 在flash cs4以上版本的3D基础 (as3.0)
下一篇: 转 第十六章 3D 线条与填充(2) (as3.0)
coding_most
博客等级 码龄15年 13粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值