[ActionScript 3.0] 透视投影
2015-08-05 16:52
465 查看
下面的示例演示如何使用透视投影来创建 3D 空间。该示例演示如何通过projectionCenter属性来修改消失点和更改空间的透视投影。进行这种修改后,将强制重新计算focalLength和fieldOfView(及其相关的 3D 空间扭曲)。
此示例:
创建一个名为center的 sprite,作为包含十字准线的圆
将centersprite 的坐标指定给根的transform属性的perspectiveProjection属性的projectionCenter属性
为鼠标事件添加事件侦听器,用于调用修改projectionCenter的处理程序,以便跟踪center对象的位置
创建四个折叠样式的框,这四个框将形成透视空间的墙壁
在测试此示例时,ProjectionDragger.swf 将圆拖动到不同的位置。消失点将跟随圆移动,直到释放圆时才固定下来。在移动投影中心使其远离舞台中心时,观察包围空间的框所发生的拉伸和出现的扭曲。
效果如图:
此示例:
创建一个名为center的 sprite,作为包含十字准线的圆
将centersprite 的坐标指定给根的transform属性的perspectiveProjection属性的projectionCenter属性
为鼠标事件添加事件侦听器,用于调用修改projectionCenter的处理程序,以便跟踪center对象的位置
创建四个折叠样式的框,这四个框将形成透视空间的墙壁
在测试此示例时,ProjectionDragger.swf 将圆拖动到不同的位置。消失点将跟随圆移动,直到释放圆时才固定下来。在移动投影中心使其远离舞台中心时,观察包围空间的框所发生的拉伸和出现的扭曲。
package { import flash.display.Sprite; import flash.display.Shape; import flash.geom.Point; import flash.events.*; public class ProjectionDragger extends Sprite { private var center:Sprite; private var boxPanel:Shape; private var inDrag:Boolean = false; public function ProjectionDragger():void { createBoxes(); createCenter(); } public function createCenter():void { var centerRadius:int = 20; center = new Sprite ; // circle center.graphics.lineStyle(1,0x000099); center.graphics.beginFill(0xCCCCCC,0.5); center.graphics.drawCircle(0,0,centerRadius); center.graphics.endFill(); // cross hairs ; center.graphics.moveTo(0,centerRadius); center.graphics.lineTo(0, - centerRadius); center.graphics.moveTo(centerRadius,0); center.graphics.lineTo( - centerRadius,0); center.x = 175; center.y = 175; center.z = 0; this.addChild(center); center.addEventListener(MouseEvent.MOUSE_DOWN,startDragProjectionCenter); center.addEventListener(MouseEvent.MOUSE_UP,stopDragProjectionCenter); center.addEventListener(MouseEvent.MOUSE_MOVE,doDragProjectionCenter); root.transform.perspectiveProjection.projectionCenter = new Point(center.x,center.y); } public function createBoxes():void { // createBoxPanel(); var boxWidth:int = 50; var boxHeight:int = 50; var numLayers:int = 12; var depthPerLayer:int = 50; // var boxVec:Vector.<Shape> = new Vector.<Shape>(numLayers); for (var i:int = 0; i < numLayers; i++) { this.addChild(createBox(150,50,(numLayers - i) * depthPerLayer,boxWidth,boxHeight,0xCCCCFF)); this.addChild(createBox(50,150,(numLayers - i) * depthPerLayer,boxWidth,boxHeight,0xFFCCCC)); this.addChild(createBox(250,150,(numLayers - i) * depthPerLayer,boxWidth,boxHeight,0xCCFFCC)); this.addChild(createBox(150,250,(numLayers - i) * depthPerLayer,boxWidth,boxHeight,0xDDDDDD)); } } public function createBox(xPos:int=0,yPos:int=0,zPos:int=100,w:int=50,h:int=50,color:int=0xDDDDDD):Shape { var box:Shape = new Shape ; box.graphics.lineStyle(2,0x666666); box.graphics.beginFill(color,1.0); box.graphics.drawRect(0,0,w,h); box.graphics.endFill(); box.x = xPos; box.y = yPos; box.z = zPos; return box; } public function startDragProjectionCenter(e:Event) { center.startDrag(); inDrag = true; } public function doDragProjectionCenter(e:Event) { if (inDrag) { root.transform.perspectiveProjection.projectionCenter = new Point(center.x,center.y); } } public function stopDragProjectionCenter(e:Event) { center.stopDrag(); root.transform.perspectiveProjection.projectionCenter = new Point(center.x,center.y); inDrag = false; } } }
效果如图:
![](http://images0.cnblogs.com/blog2015/682255/201508/051710516733012.png)
相关文章推荐
- .NET手记-友盟消息推送服务器端加密算法的实现
- 测试工程师(QA)必知必会的测试工具
- HDOJ1342lotto(DFS)
- Courses
- C++沉思录 第八章 面向对象程序范例
- .net 如何在后台添加控件,并获取值。
- 红头文件
- android 3G移植
- SylixOS 经得起检验的国产操作系统 (六)
- system.cpp
- 【POJ 2151】Check the difficulty of problems
- Web API with OAuth2.0
- Collection集合的总结以及如果选择适合的集合(包括对List和Set的对比)
- 使用CSS绘制星级评分效果的方法
- 一个简单了解spring的例子
- java正则表达式特殊字符转义
- CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\e6148660
- system.h
- hdu 1728 逃离迷宫
- 学院,系别,班级,学生XXX.hbm.xml配置