`
madfroghe
  • 浏览: 122081 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Flash/Flex学习笔记(45):3维旋转与透视变换(PerspectiveProjection)

阅读更多

Flash/Flex学习笔记:3D基础 里已经介绍了3D透视的基本原理,不过如果每次都要利用象该文中那样写一堆代码,估计很多人不喜欢,事实上AS3的DisplayObject类已经内置了z坐标、rotationX、rotationY、rotationZ属性,再加上PerspectiveProjection类用于处理透视转换,基本上可以满足大多数的3D要求。

 
import flash.events.Event;

 
import flash.display.Sprite;

 
import flash.text.TextField;

 
import flash.events.MouseEvent;

import flash.text.TextFieldAutoSize;


var isAngleChangeing = false;

 
var txtX:TextField,txtY:TextField,txtZ:TextField,txtPosZ:TextField,txtFieldOfView:TextField,txtInfo:TextField,txtCenter:TextField,txtFocusLength:TextField;

 
txtX = new TextField();

 
txtX.text = "rotationX:";

 
txtY = new TextField();

 
txtY.text = "rotationY:";

 
txtZ = new TextField();

 
txtZ.text = "rotationZ:";

 
txtPosZ = new TextField();

 
txtPosZ.text = "Z:";

 
txtFieldOfView = new TextField();

 
txtFieldOfView.text = "视角:";

 
txtCenter = new TextField();

 
txtCenter.text = "消失点:"

 
txtFocusLength = new TextField();

 
txtFocusLength.text = "焦距:";

 
txtX.y = txtY.y = txtZ.y = 5;

 
txtX.x = txtPosZ.x = 10;

 
txtPosZ.y = txtX.y + 26;

 
txtPosZ.x +=  40;

 
txtY.x = txtX.x + 180;

 
txtZ.x = txtY.x + 180;

 
txtFieldOfView.x = txtPosZ.x + 160;

 
txtFieldOfView.y = txtPosZ.y;

 
txtCenter.x = txtFieldOfView.x + 170;

 
txtCenter.y = txtPosZ.y;

 
txtInfo = new TextField();

 
txtInfo.text="";

 
txtFocusLength.x = txtX.x + 25;


txtFocusLength.y = txtPosZ.y + 25;


var imgBD:BitmapData = new ImgSample();

 
var img:Bitmap = new Bitmap(imgBD);

 
trace("img.width=",img.width,",img.height=",img.height);

var imgSprite:Sprite = new Sprite();

 
img.x =  -  img.width / 2;


img.y =  -  img.height / 2;

 
imgSprite.addChild(img);

 
trace("imgSprite.width=",imgSprite.width,",imgSprite.height=",imgSprite.height);

 
var containerSprite:Sprite = new Sprite();

 
containerSprite.addChild(imgSprite);

 
imgSprite.x = img.width / 2;

imgSprite.y = img.height / 2;

addChild(containerSprite);


trace("containerSprite.width=",containerSprite.width,",containerSprite.height=",containerSprite.height);

 
containerSprite.x = stage.stageWidth / 2 - containerSprite.width / 2;

 
containerSprite.y = stage.stageHeight / 2 - containerSprite.height / 2;


containerSprite.z = 50;

 
var silderX:SimpleSlider = new SimpleSlider(0,360,0);

 
silderX.x = txtX.x + 160;

 
silderX.y = txtX.y + 7;


silderX.rotation = 90;

 
var silderY:SimpleSlider = new SimpleSlider(0,360,0);

 
silderY.x = txtY.x + 160;

 
silderY.y = silderX.y;

 
silderY.rotation = 90;

 
var silderZ:SimpleSlider = new SimpleSlider(0,360,0);

 
silderZ.x = txtZ.x + 160;

 
silderZ.y = silderX.y;

 
silderZ.rotation = 90;

 
var silderPosZ:SimpleSlider = new SimpleSlider(-200,200,50);

 
silderPosZ.x = txtX.x + 160;

 
silderPosZ.y = silderX.y + 25;

 
silderPosZ.rotation = 90;

 
var silderFieldOfView:SimpleSlider = new SimpleSlider(0.1,179.9,90);

 
silderFieldOfView.x = silderPosZ.x + 180;

 
silderFieldOfView.y = silderPosZ.y;


silderFieldOfView.rotation = 90;

 
var silderCenterPos:SimpleSlider = new SimpleSlider(150,400,275);

 
silderCenterPos.x = silderFieldOfView.x + 180;

 
silderCenterPos.y = silderPosZ.y;

 
silderCenterPos.rotation = 90;

 
var silderFocusLength:SimpleSlider = new SimpleSlider(100,500,300);

 
silderFocusLength.x = silderPosZ.x ;

 
silderFocusLength.y = silderPosZ.y + 25;

 
silderFocusLength.rotation = 90;

 
addChild(txtX);

 
addChild(txtY);

 
addChild(txtZ);

 
addChild(txtPosZ);

 
addChild(txtFieldOfView);

 
addChild(txtInfo);

 
addChild(txtCenter);

 
addChild(txtFocusLength);

 
addChild(silderX);

 
addChild(silderY);

 
addChild(silderZ);

 
addChild(silderPosZ);

 
addChild(silderFieldOfView);

 
addChild(silderCenterPos);

 
addChild(silderFocusLength);

 
silderX.addEventListener(Event.CHANGE,silderXChangeHandler);

 
silderY.addEventListener(Event.CHANGE,silderYChangeHandler);

 
silderZ.addEventListener(Event.CHANGE,silderZChangeHandler);

 
silderPosZ.addEventListener(Event.CHANGE,silderPosZChangeHandler);

 
silderFieldOfView.addEventListener(Event.CHANGE,silderFieldOfViewChangeHandler);


silderFieldOfView.addEventListener(MouseEvent.MOUSE_UP,function(){isAngleChangeing = false});

 
silderCenterPos.addEventListener(Event.CHANGE,silderCenterPosChangeHandler);

 
silderFocusLength.addEventListener(Event.CHANGE,silderFocusLengthChangeHandler);

 
function showTxtInfo(s:SimpleSlider){


txtInfo.text = s.value.toString().substr(0,5);

 
txtInfo.x = mouseX + 20;

 
txtInfo.y = s.y + 5;

 
}


function silderXChangeHandler(e:Event):void {

 
imgSprite.rotationX = silderX.value;

 
showTxtInfo(silderX);

 
}

 
function silderYChangeHandler(e:Event):void {

imgSprite.rotationY = silderY.value;


showTxtInfo(silderY);

 
}

 
function silderZChangeHandler(e:Event):void {

 
imgSprite.rotationZ = silderZ.value;

 
showTxtInfo(silderZ);

 
}

 
function silderPosZChangeHandler(e:Event):void {

 
containerSprite.z = silderPosZ.value;

 
showTxtInfo(silderPosZ);

 
}


function silderFieldOfViewChangeHandler(e:Event):void {

 
doPerspectiveProjection();

 
showTxtInfo(silderFieldOfView);

 
isAngleChangeing = true;

 
}

 

function silderCenterPosChangeHandler(e:Event):void {

 
doPerspectiveProjection();

 
showTxtInfo(silderCenterPos);

 
}

 
function silderFocusLengthChangeHandler(e:Event):void {

 
doPerspectiveProjection();


showTxtInfo(silderFocusLength);

 
}

 
function doPerspectiveProjection():void{

 
var pp:PerspectiveProjection=new PerspectiveProjection();


pp.fieldOfView = silderFieldOfView.value;

 
if (!isAngleChangeing){

 
pp.focalLength  = silderFocusLength.value;  

 
}


//trace(pp.focalLength);

 
pp.projectionCenter = new Point(silderCenterPos.value,silderCenterPos.value);

 
containerSprite.transform.perspectiveProjection = pp;

 
}

 
doPerspectiveProjection();

 
var txtAuthor:TextField = new TextField();

 
txtAuthor.htmlText ="<a href='http://yjmyzz.cnblogs.com/' target='_blank'>by 菩提树下的杨过</a>";

 
addChild(txtAuthor);

txtAuthor.y = txtFocusLength.y;

 
txtAuthor.x = 425;

 
txtAuthor.autoSize = TextFieldAutoSize.LEFT;

稍加解释:

z坐标:即对象在z轴上的坐标,flash默认采用的是右手三维坐标,也就是说z值越大,物体越小

rotaionX,rotationY,rotationZ:即对象绕着x,y,z轴旋转的角度

PerspectiveProjection对象的三个属性:

1.focalLength 即焦距,使用效果上貌似焦距越大,物体也越大(?跟常规理解的不同),而且据官方帮助上讲:在透视转换过程中,将使用视野的角度和舞台的高宽比(舞台宽度除以舞台高度)来自动计算 focalLength

2.fieldOfView 即观察点的三维"视角"(0到180之间的值),怎么理解我还没想好,不过在使用效果上,如果当物体的z轴坐标不为0时,该值越大,物体的扭曲和形变越夸张,而且动态调整该值时focalLength值也会自动重新计算。(所以如果用代码写死了focalLength,不管如何调整fieldOfView都是看不到效果的)

3.projectionCenter:即3D透视中的消失点,当z轴坐标趋近于无限大时,物体越趋向于该点(消失)。

最后:上面的代码中暗藏了二个小技巧

1.为啥要先把图片放到imgSprite中,然后再将imgSprite又放到containerSprite中?

因为旋转时有一个旋转的中心点,而Flash默认这个中心就是对象的左顶点,即(0,0)位置,用二个sprite嵌套后,再配合坐标的设定,巧妙的将中心点正好移动到了图片中心,如下图:

2.如何用代码从库里取出一张图片?

如上图,关键在于导入图片时要指定“类”名,这样在代码中就可以用

1
var imgBD:BitmapData = new ImgSample();//从库中取出一张图片

2
var img:Bitmap = new Bitmap(imgBD);

得到一个图片的Bigmap实例

分享到:
评论

相关推荐

    flex/Flash开发系列书籍:WEB3D应用研究

    flex/Flash开发系列书籍:基于FLASH的WEB3D应用研究

    Flash/Flex 框架应用 Cairngorm、Mate、PureMVC以及Swiz 的典型例子

    附件是关于 Flash/Flex 几个重要框架 Cairngorm、Mate、PureMVC以及Swiz 的典型例子,由 Tony Hillerson 提供 Homepage: http://insideria.com

    flash/flex画曲线,绘图板

    在IT行业中,Flash/Flex是一种基于ActionScript编程语言和Adobe Flex框架的开发工具,用于创建交互式的、富媒体的Web应用程序。"Flash/Flex画曲线,绘图板"这个主题涉及的是如何使用这些技术来创建一个允许用户自由...

    RE/flex lexical analyzer generator:以正则表达式为中心的快速词法分析器生成器,用于C ++-开源

    语言:C ++许可证:BSD-3代码质量:A + https://lgtm.com/projects/g/Genivia/RE-flex/context:cpp文档:https://www.genivia.com/doc/reflex/html /index.html存储库:https://github.com/Genivia/RE-flex更改日志...

    [Flash/Flex] 使用css定义文本样式

    在IT行业中,Flash和Flex是曾经非常流行的富互联网应用程序(RIA)开发框架,它们主要用于创建交互式的网页内容和应用程序。本文将重点讲解如何在Flash或Flex项目中利用CSS(层叠样式表)来定义文本样式,提升用户...

    FDT-flash/flex devtoolkit for eclipse.

    **FDT - 一款强大的Flash/Flex开发工具集** FDT(Flash Development Tool)是一款专为Adobe Flash和Flex开发者设计的集成开发环境(IDE),它基于Eclipse平台,提供了高效、专业的开发工具和服务。FDT的出现极大地...

    FLEX安装方法 集成到eclipse中

    FLEX 安装方法 集成到 eclipse 中 ...* 汉化 FLEX 尤其是 FLEX/AIR 方面的中文资料 * 原创的关于 FLEX 的博客:http://liguoliang.com/ * Adobe 公司 FLEX 主页:http://www.adobe.com/cn/products/flex/

    flash/flex 的aqua皮肤

    在IT行业中,Flash/Flex是一种广泛使用的开发工具,主要用于创建交互式、富媒体的Web应用程序。Flex是基于ActionScript和MXML的开放源代码框架,它允许开发者构建可自定义的用户界面,而Flash则是其背后的动画和...

    Flex:登录

    标题“Flex:登录”指的是使用Adobe Flex技术实现用户登录功能的一种方法。Flex是Adobe公司推出的一款基于ActionScript的开源框架,主要用于构建富互联网应用程序(RIA)。这篇博客文章可能详细介绍了如何在Flex项目...

    flex学习笔记 flex学习总结 flex学习教程

    本教程是作者精心编写的Flex学习资料,适合初学者入门,通过图文并茂的方式,帮助读者快速掌握Flex的基本概念和核心技能。 1. **Flex基础**:Flex提供了MXML和ActionScript两种编程方式。MXML是一种声明式语言,...

    解决flash/flex/as3 访问中文域名时的流错误示例

    在《潮汕IT男》网站的文章《解决flash/flex/as3 访问中文域名时的流错误》中,作者陈林生提供了详细的步骤和代码示例,帮助开发者理解和解决这个问题。文章地址是:[http://chenlinsheng.com/?p=990]...

    RTMP直播例子--基于FLASH/FLEX(含源代码) 下载

    RTMP(Real-Time Messaging Protocol)...通过学习和理解源代码,你可以深入了解RTMP协议的实现细节,以及FLEX如何与服务器和客户端进行交互。这对于想要从事音视频直播开发的人员来说,是一个宝贵的实践和学习资源。

    FLEX学习笔记

    《FLEX学习笔记》 FLEX,全称为Flex Builder,是由Adobe公司开发的一款基于MXML和ActionScript的开源框架,用于构建富互联网应用程序(RIA)。它允许开发者创建具有交互性、响应性和丰富用户体验的Web应用。FLEX的...

    flex开发系列书籍:三维实景模拟

    基于Flex的网络三维实景模拟技术的研究与实现.kdh

    Flex学习笔记.rar

    1. **Flex概述**:介绍Flex技术的基本概念,包括它的历史、目标和应用领域,以及它与Flash Player和Adobe AIR的关系。 2. **Flex开发环境**:可能会讲解如何安装和配置Flex Builder或IntelliJ IDEA等开发工具,以及...

    4个简单的Flex例子(包含custom-class-mapping)共享

    总共有4个例子: 1.http://127.0.0.1:8080/flexDemo/HelloWorld/HelloWorld.html ...如果你的数据库配置和我的不一样,请修改flexDemo\WEB-INF\classes\下的DBSetting.properties文件,数据库建表的sql语句是user.sql

    flex开源项目介绍.doc

    Flex是一种用于构建富互联网应用程序(RIA)的开源框架,它基于ActionScript 3(AS3)编程语言和MXML标记语言。这些开源项目为开发者提供了丰富的组件库、工具和框架,帮助他们扩展Flex的功能,提高开发效率,并实现...

    Flex与Java的交互

    Flex与Java的交互是跨平台应用开发中的常见技术组合,允许前端用户界面(UI)与后端业务逻辑进行高效沟通。在本文中,我们将深入探讨如何使用Flex 4与Java进行通信,并通过三种不同的方法实现这一目标:RemoteObject...

    FLEX2和FLEX3全屏的代码

    总结一下,要在Flex 2和Flex 3中实现全屏功能,你需要确保你的开发环境和Flash Player已更新到支持`StageDisplayState`的版本,并正确编写代码以利用这些API。通过以上示例,你可以了解如何在MXML中定义事件监听器和...

    as3/flex4.6

    ### Flex4.6与AS3知识点详解 #### 一、Flex4.6简介与特性 **Flex4.6**作为一款强大的开源框架,主要用于构建跨平台的企业级应用程序、网页游戏、桌面应用及移动应用等。它基于ActionScript 3 (AS3) 开发,为开发者...

Global site tag (gtag.js) - Google Analytics