[ActionScript 3.0] 透视投影

下面的示例演示如何使用透视投影来创建 3D 空间。该示例演示如何通过projectionCenter属性来修改消失点和更改空间的透视投影。进行这种修改后,将强制重新计算focalLength和fieldOfView(及其相关的 3D 空间扭曲)。

此示例:

  1. 创建一个名为center的 sprite,作为包含十字准线的圆
  2. 将centersprite 的坐标指定给根的transform属性的perspectiveProjection属性的projectionCenter属性
  3. 为鼠标事件添加事件侦听器,用于调用修改projectionCenter的处理程序,以便跟踪center对象的位置
  4. 创建四个折叠样式的框,这四个框将形成透视空间的墙壁

在测试此示例时,ProjectionDragger.swf 将圆拖动到不同的位置。消失点将跟随圆移动,直到释放圆时才固定下来。在移动投影中心使其远离舞台中心时,观察包围空间的框所发生的拉伸和出现的扭曲。

 1 package
 2 {
 3     import flash.display.Sprite;
 4     import flash.display.Shape;
 5     import flash.geom.Point;
 6     import flash.events.*;
 7     public class ProjectionDragger extends Sprite
 8     {
 9         private var center:Sprite;
10         private var boxPanel:Shape;
11         private var inDrag:Boolean = false;
12
13         public function ProjectionDragger():void
14         {
15             createBoxes();
16             createCenter();
17         }
18         public function createCenter():void
19         {
20             var centerRadius:int = 20;
21
22             center = new Sprite  ;
23
24             // circle
25             center.graphics.lineStyle(1,0x000099);
26             center.graphics.beginFill(0xCCCCCC,0.5);
27             center.graphics.drawCircle(0,0,centerRadius);
28             center.graphics.endFill();
29             // cross hairs ;
30             center.graphics.moveTo(0,centerRadius);
31             center.graphics.lineTo(0, -  centerRadius);
32             center.graphics.moveTo(centerRadius,0);
33             center.graphics.lineTo( -  centerRadius,0);
34             center.x = 175;
35             center.y = 175;
36             center.z = 0;
37             this.addChild(center);
38
39             center.addEventListener(MouseEvent.MOUSE_DOWN,startDragProjectionCenter);
40             center.addEventListener(MouseEvent.MOUSE_UP,stopDragProjectionCenter);
41             center.addEventListener(MouseEvent.MOUSE_MOVE,doDragProjectionCenter);
42             root.transform.perspectiveProjection.projectionCenter = new Point(center.x,center.y);
43         }
44         public function createBoxes():void
45         {
46             // createBoxPanel();
47             var boxWidth:int = 50;
48             var boxHeight:int = 50;
49             var numLayers:int = 12;
50             var depthPerLayer:int = 50;
51
52             // var boxVec:Vector.<Shape> = new Vector.<Shape>(numLayers);
53             for (var i:int = 0; i < numLayers; i++) {
54                 this.addChild(createBox(150,50,(numLayers - i) * depthPerLayer,boxWidth,boxHeight,0xCCCCFF));
55                 this.addChild(createBox(50,150,(numLayers - i) * depthPerLayer,boxWidth,boxHeight,0xFFCCCC));
56                 this.addChild(createBox(250,150,(numLayers - i) * depthPerLayer,boxWidth,boxHeight,0xCCFFCC));
57                 this.addChild(createBox(150,250,(numLayers - i) * depthPerLayer,boxWidth,boxHeight,0xDDDDDD));
58             }
59         }
60
61         public function createBox(xPos:int=0,yPos:int=0,zPos:int=100,w:int=50,h:int=50,color:int=0xDDDDDD):Shape
62         {
63             var box:Shape = new Shape  ;
64             box.graphics.lineStyle(2,0x666666);
65             box.graphics.beginFill(color,1.0);
66             box.graphics.drawRect(0,0,w,h);
67             box.graphics.endFill();
68             box.x = xPos;
69             box.y = yPos;
70             box.z = zPos;
71             return box;
72         }
73         public function startDragProjectionCenter(e:Event)
74         {
75             center.startDrag();
76             inDrag = true;
77         }
78
79         public function doDragProjectionCenter(e:Event)
80         {
81             if (inDrag) {
82                 root.transform.perspectiveProjection.projectionCenter = new Point(center.x,center.y);
83             }
84         }
85
86         public function stopDragProjectionCenter(e:Event)
87         {
88             center.stopDrag();
89             root.transform.perspectiveProjection.projectionCenter = new Point(center.x,center.y);
90             inDrag = false;
91         }
92     }
93 }

效果如图:

时间: 2024-10-21 09:32:23

[ActionScript 3.0] 透视投影的相关文章

ActionScript 3.0 for the Lunder Algorithm

package com.feiruo.Calendar.LunderCalendar { /* *@ClassName: package:com.feiruo.Calendar.LunderCalendar::LunarDate *@INTRO: Calculating lunar and solar terms and other settings. *@Author: feiruo *@Language: ActionScript 3.0 *@SDKVersion: Flash Player

在 Flash ActionScript 2.0 中调用 Javascript 方法

本篇文章由:http://xinpure.com/call-the-javascript-method-in-flash-actionscript-2-0/ 在 Flash ActionScript 2.0 中调用 Javascript 方法 最近在工作中,有个这样的需求: 要从 Flash ActionScript 2.0 中调用网页上的 Javascript 方法 这是一个关于 Flash 和 Javascript 交互的问题. 在 ActionScript 2.0 中调用外部 javasc

ActionScript 3.0日期与时间管理(Date类)

/*Flash中,Date类管理着日期和时间信息.要获取   当前日期,可以新建一个Date对象   */var now:Date =new Date();trace (now);     /*输出当前时间和日期,格式如:                  Sun Jul 27 19:45:57 GMT+0800 2014  */ /*以上代码中,Date对象中包括了当前的秒.分.小时.  星期数.日.月.年.时区等信息...如果仅需要返  回星期值和日期值,而不返回时间或时区,可以使用Date

ActionScript 3.0数组操作

var arr:Array=new Array();arr=["a","b","c"];  //赋初值,注意这里的即使单个字符赋值使用的是""trace(arr[1]);       //获取成员信息trace(arr.length);    //获取数组中所包含的元素的个数 //接下来使用for循环逐个输出数组的每一个元素,这也称为数组的遍历var loopTime:int=arr.length;for (var i:int

[ActionScript 3.0] 正则表达式

正则表达式: 正则表达式最早是由数学家Stephen Kleene在对自然语言的递增研究成果的基础上,于1956提出来的.具有完整语法的正则表达式,主要使用在字符串的格式的匹配方面上,后来也逐渐应用到信息技术领域.不同的编程语言对于正则表达式有细微的不同,ActionScript 3.0是按照ECMAScript第3版语言规范(ECMA-262)中的定义实现正则表达式. 熟悉windows操作系统读者,应该知道windows中是怎样查找文件的.不错,使用通配符“*”用来匹配任意字符,“?”用来匹

ActionScript 3.0 加载外部SWF素材资源MovieClip,SimpleButton不支持鼠标事件

我们用flash buidler加载素材一般有三种途径: 1.SWC,这种方式会增大SWF的大小 2.flash cs项目关联 3.SWF专门放素材资源通过Loader方式加载 今天发现通过SWF加载方式有个问题要加载的素材如下图: A:是一个MC,里面放了一个B:mc,C:SimpleButton 问题:加载进A后对A添加鼠标事件如CLICK事件,单击B或C时没有反映? 开始我的加载方式是这样的: 目录结构如图: 代码如下: 1 package 2 { 3 import flash.displ

[ActionScript 3.0] as3处理xml的功能和遍历节点

as3比as2处理xml的功能增强了N倍,获取或遍历节点非常之方便,类似于json对像的处理方式. XML 的一个强大功能是它能够通过文本字符的线性字符串提供复杂的嵌套数据.将数据加载到 XML 对象时,ActionScript 会分析数据并将其分层结构加载到内存(如果 XML 数据格式有误,它会发送运行时错误). 利用 XML 和 XMLList 对象的运算符和方法可以轻松遍历 XML 数据的结构. 1.读取外部 XML 文档 可以使用 URLLoader 类从 URL 加载 XML 数据.若

[ActionScript 3.0] 与js通信

AS3代码,可做文档类; 1 package { 2 import flash.display.Sprite; 3 import flash.events.*; 4 import flash.external.ExternalInterface; 5 import flash.text.TextField; 6 import flash.utils.Timer; 7 import flash.text.TextFieldType; 8 import flash.text.TextFieldAut

[ActionScript 3.0] flash中的颜色

在 Flash 中,颜色就是一串特殊的数字,一个颜色值可以是0到16,777,215中的任意数值,这就是24位(bit)色彩.也许大家会问,为什么有16,777,216(256*256*256)种颜色值,因为 Flash 使用 RGB 颜色值,意味着每个颜色都可以由红(red),绿(green),蓝(blue)三种颜色构成.这三种合成色的每一种都是一个从0到255中的数,所以,对于每个红黄蓝都有256种可能的深度,结果会有约1,678万种颜色. 这个系统之所以叫做24位颜色是因为要使用8位(0或