﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Sealyu-随笔分类-Flex+ActionScript</title><link>http://www.blogjava.net/sealyu/category/35895.html</link><description>--- The devil's in the Details</description><language>zh-cn</language><lastBuildDate>Tue, 14 Jul 2009 12:55:39 GMT</lastBuildDate><pubDate>Tue, 14 Jul 2009 12:55:39 GMT</pubDate><ttl>60</ttl><item><title>选择一个Flex框架 (转)</title><link>http://www.blogjava.net/sealyu/archive/2009/07/14/286659.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Tue, 14 Jul 2009 03:36:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2009/07/14/286659.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/286659.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2009/07/14/286659.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/286659.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/286659.html</trackback:ping><description><![CDATA[<h2> 介绍</h2>
<p>最近，我进行了很多次的Adobe Flex
开发职位的面试（作为自由职业，这点需要澄清，如果我现在的老板碰巧阅读到该文的话）。几乎每一次的面试，Flex框架的问题最终都会被提出来（通常就是
Cairngorm）。我就会解释尽管我知道这些框架的存在，但是我从没有真正的去用它们。这个决定看起来对我来说足够理智，但是这些不能给面试带来深刻
的印象。我开始厌倦因为我的&#8220;对Flex框架缺乏经验&#8221;而失去项目，我展开了一项任务仅我所能的去学习它们。
</p>
<p>非常巧，本地用户组的下一次聚会提到了Flex框架的话题，具体提到Cairngorm,
Mate以及PureMVC(你可以在这里看观看)。我时常在Flex
show播客上听到所有的这些框架，但是从来没有真正的意识到他们是如何运作的以及他们之间的不同，本文的目的就在于指出这些。
</p>
<p><br />
本文提供了当前最流行的Flex框架，你可以根据了解来选择最适合你的团队或者项目的需求的框架。本文覆盖了
Cairngorm、Mate、PureMVC以及Swiz 框架。我特意选择了这些框架是因为它们已经被Flex show
播客提及并且或者已经被类似360|Flex 的会议所提出。
</p>
<h3>  要求 </h3>
<p>完成本教程, 您需要安装以下软件和文件:
Flex Builder 3
</p>
<ul>
    <li> <a href="http://www.adobe.com/go/tryflex" class="external text" title="http://www.adobe.com/go/tryflex" rel="nofollow" target="_blank">试用</a>
    </li>
    <li> <a href="http://www.adobe.com/go/buyflexbuilder" class="external text" title="http://www.adobe.com/go/buyflexbuilder" rel="nofollow" target="_blank">购买</a>
    </li>
</ul>
<p><br />
</p>
<h3>  必备知识 </h3>
<p>读者需要知道什么是Adobe Flex。当然，如果读者对框架涉及的内容有基础的了解，对面向对象编程原理以及设计模式的基础了解的话，对于阅读本文那就更有帮助了。
</p>
<p><br />
</p>
<h2>  Cairngorm 框架 </h2>
<p>Cairngorm是已知的最为古老与最好的Flex
框架。它实际上是一个微架构——它提供了一系列已经被证明可以很好的互相协作的设计模式的集合。Cairngorm采用累来自Java开发世界的笨重并且
把焦点集中到了三个关键区域：处理用户行为，包装服务端交互与业务逻辑，并且管理客户端状态以及在用户界面（UI）上体现客户端状态。
</p>
<p>在Cairngorm构建一个项目包含了拆散你的应用到若干个包中并且扩展Cairngorm的类。如下是一个Cairngorm 项目 主要包含的部分和类。
</p>
<ul>
    <li>ModelLocator —— 作为数据存贮角色的单件——反映程序的状态。单件类的性质抱枕了程序中所有的组件都访问相同的数据。
    </li>
    <li>ServeiceLocator 是另外一个单件，它作为集中存贮例如HTTPService的服务的角色存在。同样，因为该类是一个单件，所有程序中的组件都会访问相同的服务。
    </li>
    <li> 业务逻辑被包装到了实现了命令模式的Command类中。这些类描述了程序响应用户事件的逻辑。
    </li>
    <li>事件会被FrontController 类处理，它会针对事件来执行相应的command类。每个程序可以回应的用户事件都必须被注册到它所附和的command类。
    </li>
    <li>Delegate 类会被用来做远端服务访问与反馈的代理。
    </li>
</ul>
<p><br />
</p>
<h3>  优点 </h3>
<p>Cairngorm是Flex社区中众所周知的，并且是一个<a href="http://opensource.adobe.com/wiki/display/site/Home" class="external text" title="http://opensource.adobe.com/wiki/display/site/Home" rel="nofollow" target="_blank">Adobe 开源网站</a>上的项目，有良好的支持并且一个活跃的开发者社区继续为它工作。此外，它借用了来自Java开发世界的已被证明的策略。最后，它非常适合团队开发，因为它提供了一个高级的结构化的一套方法来允许分发任务进行创建应用。
</p>
<h3>  缺点 </h3>
<p>或许对Cairngrom做出的最多的批评就是它需要你去写非常多的类。在Cairngorm中，每个事件映射到一个Command；因此，你不得
不为每个在你的应用中可以被触发的事件写一个对应的command类。另外，你必须要写其他的command必须用到的其他类，例如delegate。这
会快速的增加一个小型应用的类的数量到一个巨大的数字。
</p>
<p>第二，因为Cairngorm 实现了它自己的处理事件的方法，这个会把内建的Flex
事件模型变得错综复杂。它也有其他一些限制。因为每个事件都必须要有它自己的command类，你就被限制只能为每个事件提供一个响应器
（responder）.并且，Cairngorm事件并不会冒泡，所以如果你想要通知其他更高一级的容器，就只能自己来处理了。
</p>
<p>第三条普遍的批评就是框架依赖于全局单例，让想要模块化和单元测试变的困难。虽然你可以从数个单例中破坏这个框架模型让这些处理简单些，但是额外的工作需求会复杂化流程。
</p>
<h3>  资源 </h3>
<ul>
    <li> <a href="http://opensource.adobe.com/wiki/display/cairngorm/Developer+Documentation" class="external text" title="http://opensource.adobe.com/wiki/display/cairngorm/Developer+Documentation" rel="nofollow" target="_blank">Cairngorm developer documentation</a>
    </li>
    <li> <a href="http://www.adobe.com/devnet/flex/articles/cairngorm_pt1.html" class="external text" title="http://www.adobe.com/devnet/flex/articles/cairngorm_pt1.html" rel="nofollow" target="_blank">Developing Flex RIAs with Cairngorm microarchitecture &#8211; Part 1: Introducing Cairngorm</a> (Steven Webster and Leon Tanner, August 2008)
    </li>
    <li> <a href="http://www.asfusion.com/examples/item/hello-world-cairngorm-example" class="external text" title="http://www.asfusion.com/examples/item/hello-world-cairngorm-example" rel="nofollow" target="_blank">Example Cairngorm project</a>
    </li>
</ul>
<h2>  Mate 框架 </h2>
<p><a href="http://mate.asfusion.com/" class="external text" title="http://mate.asfusion.com/" rel="nofollow" target="_blank">Mate</a> 是一个基于标签的事件驱动型框架。基于标签意味着它可以完全使用MXML实现。事件驱动使框架的主要焦点放在更简单的来定义事件的回应。
</p>
<p>使用Mate来创建项目只需要两个基础的必要条件：
你必须有一个或多个事件，以及你必须有一个成为&#8220;事件映射&#8221;的MXML文件——其实就是在主要的应用程序文件中包含了一个简单的MXML文件。它定义了你
想要监听的事件以及这些事件该如何被处理。你必须至少有这些文件中的一个，在需要的情况下也可以使用多个事件映射。
</p>
<p>Mate也实现了依赖注入的思想 ——有时，适用于好莱坞原则，即
&#8220;不要给我打电话，我们会打电话给你们&#8221;.对象被这样构造出来：需要的数据会被供给或者注入到类中。也就是说，类不去呼叫外部获取数据（即&#8220;不要给我打电
话&#8221;），而是接受他们所需要的数据（即（&#8220;我们会打电话给你们&#8221;））
</p>
<h3>  优点 </h3>
<p>Mate
通过它对依赖注入的使用实现松耦合。因为组件不用依赖全局单例，对场景来说他们是自由人。Mate不限制你使用Flex的内建事件模型，也不会像
cairngorm一样限制你每个事件都要一个单独的响应处理。Mate
的MXML文件以及标签直接并且便于使用，同时如果你卡住了，它提供了不错的文档并在网站上有大量的代码范例。
</p>
<h3>  缺点 </h3>
<p>Mate只使用了MXML。所以，如果你是那种做每件事都喜欢使用ActionScript类的人，那么你就必须要调整你的正常习惯。因为Mate
不会为你的应用定义一个结构，它留给你来定义。从此以后，你将会不得不协调自己的团队来确保你的所有开发人员以一个相容的方式编码。最后，如果你碰巧需要
和 Adobe LiveCycle Data Services ES协作，那么请注意，Mate一般不会处理<a href="http://www.adobe.com/products/livecycle/dataservices/" class="external text" title="http://www.adobe.com/products/livecycle/dataservices/" rel="nofollow" target="_blank">LiveCycle Data Sevices ES</a> 提供的数据管理。
</p>
<h3> 资源</h3>
<ul>
    <li> <a href="http://mate.asfusion.com/page/documentation" class="external text" title="http://mate.asfusion.com/page/documentation" rel="nofollow" target="_blank">Mate documentation</a>
    </li>
    <li> <a href="http://mate.asfusion.com/page/examples" class="external text" title="http://mate.asfusion.com/page/examples" rel="nofollow" target="_blank">Example projects</a>
    </li>
    <li> <a href="http://www.theflexshow.com/blog/index.cfm/2008/7/2/The-Flex-Show--Episode-47-Interview-with-Laura-Arguello-creator-of-the-Mate-framework" class="external text" title="http://www.theflexshow.com/blog/index.cfm/2008/7/2/The-Flex-Show--Episode-47-Interview-with-Laura-Arguello-creator-of-the-Mate-framework" rel="nofollow" target="_blank">Podcast interview with Mate framework creator Laura Arguello</a>
    </li>
</ul>
<h2>  PureMVC 框架 </h2>
<p>虽然Flex也可以使用<a href="http://puremvc.org/" class="external text" title="http://puremvc.org/" rel="nofollow" target="_blank">PureMVC</a>框架，但是它实际上并不是作为一个Flex框架而设计的。PureMVC的创建者希望PureMVC框架是与语言无关的。其实，如果你访问他的网站，你会发现在多种语言上的实现以及代码范例。
</p>
<p>PureMVC 以模型—视图—控制器模式（MVC
模式）为中心，以把项目切分到模型，视图以及控制器层为目标。PureMVC中通过是Model，View以及Controller，这三个单件类体现了
这些层——而为了帮着这些层之间通讯使用了第四个单件类Fa&#231;ade ，同时他也作为中央存贮器的角色存在。
</p>
<p>和Cairngorm很像，创建一个使用PureMVC框架的项目，需要分割你的项目到若干包中，然后通过继承框架的类来显现你的定制类。PureMVC 还加入了作为程序主入口点的Fa&#231;ade类。
</p>
<h3> 优点</h3>
<p>类似Cairngorm，PureMVC一个稳定的框架并且拥有一个庞大的活跃社区来支持它。因为它为应用需要如何被创建以及开发人员之间的标准化编码提供了一个意义明确的结构，所以它也非常适合团队开发。
</p>
<h3> 缺点=</h3>
<p>由于对单件的依赖，PureMVC
很容易就获得与Cairngorm相同的批评。它并不是一个专门针对Flex的框架，所以它并不会像Cairngorm般利用MXML的特点。和
Cairngorm一样，PureMVC对于事件处理拥有它自己的方法，并且它会使标准的Flex事件模型更难运作。PuremvC
是一个相当复杂的框架，相对更难快速学会。除非你的团队非常熟悉它，培训新的雇员会提高生产时间。
</p>
<p>最后，还是和Cairngorm 一样，PureMVC框架需要创建很多类，这些创建工作会增加生产时间和项目的大小。
</p>
<h3> 资源</h3>
<ul>
    <li> <a href="http://trac.puremvc.org/PureMVC_AS3" class="external text" title="http://trac.puremvc.org/PureMVC_AS3" rel="nofollow" target="_blank">Documentation and licensing</a>
    </li>
    <li> <a href="http://trac.puremvc.org/Demo_AS3_Flex_CafeTownsend" class="external text" title="http://trac.puremvc.org/Demo_AS3_Flex_CafeTownsend" rel="nofollow" target="_blank">Example project</a>
    </li>
    <li> <a href="http://www.theflexshow.com/blog/index.cfm/2008/1/30/The-Flex-Show--Episode-33-PureMVC-Framework" class="external text" title="http://www.theflexshow.com/blog/index.cfm/2008/1/30/The-Flex-Show--Episode-33-PureMVC-Framework" rel="nofollow" target="_blank">Podcast interview</a> with PureMVC framework creator Cliff Hall
    </li>
</ul>
<h2>  Swiz框架 </h2>
<p><a href="http://code.google.com/p/swizframework/" class="external text" title="http://code.google.com/p/swizframework/" rel="nofollow" target="_blank">Swiz</a>
是一个为简化事件处理与异步远端方法呼叫提供方法的控制反转（IoC）框架。Swiz框架主要的焦点放在以一种简单有效的方式提供一个可靠的MVC规范。
和Cairngorm以及PureMVC所不同的是，它直接回避了宏大的Java模式并且不会强调任何预定义的文件夹结构。
</p>
<p>使用Swiz创建一个项目需要告诉Swiz框架关于你的应用的组件。在Swiz的核心，Swiz是一个集中的工厂模式。组件都会经由一个成为BeanLoader的工具类载入到这个工厂。当应用开始的时候，工厂处理这些组件的实例化。
</p>
<p>与此同时，Swiz 通过Autowire这个自定义Metatag来提供依赖管理。Autowire标签是Swiz为你处理定义类之间依赖性的一个方法。
</p>
<h3> 优点</h3>
<p>Swiz是使用简单并且不用为你的项目强制定义结构。凭借它的Autowire
依赖注入系统，和Mate一样，既确保了组件之间的松耦合又为你管理了依赖性。同时，Swiz也和Mate一样，使用了内建的Flex事件处理机制，这一
点在使用内部单件实现了全局事件分发之类的重要方面是非常有帮助的。
</p>
<h3> 缺点</h3>
<p>然后，又是和Mate一样，Swiz并不为你的应用的结构定义许多，它留给你自己去做。所以，你将会不得不为你自己的团队协调来确保你的所有开发人员以兼容的方式编码。
</p>
<p>第二，因为它使用了自定义的metatag，所以项目需要一些附加的设置——例如，设置一些额外的编译参数。或者这些步骤不困难，但是其他框架不需要，而Swiz却需要。文档指明了Flex 2用户，所以他在flex2之后的版本将不再是一个问题。
</p>
<h3> 资源</h3>
<ul>
    <li> <a href="http://code.google.com/p/swizframework/w/list" class="external text" title="http://code.google.com/p/swizframework/w/list" rel="nofollow" target="_blank">Documentation and examples</a>
    </li>
    <li> <a href="http://www.theflexshow.com/blog/index.cfm/2008/6/19/The-Flex-Show--Episode-45-Interview-with-Chris-Scott-talking-about-the-Swiz-Framework" class="external text" title="http://www.theflexshow.com/blog/index.cfm/2008/6/19/The-Flex-Show--Episode-45-Interview-with-Chris-Scott-talking-about-the-Swiz-Framework" rel="nofollow" target="_blank">Podcast interview</a> with Swiz framework creator Chris Scott
    </li>
</ul>
<h2>  做出你的选择 </h2>
<p>虽然还不是很彻底，但是这里提供的信息配合资源，应该能够为你对每个框架的方法，优点以及缺点提供了一个基本的了解。你会怎么从这些框架中选择一个超过其他框架的框架呢？
</p>
<p>也许第一个问题是，我是否需要一个框架？Flex 与MXML
为快速构建应用提供了非常强健的一套方法。我一般不使用框架的原因是当我尝试适应框架的一套方法的时候需要做更多的工作，相比较仅仅使用Flex框架而
已。对我来说，一个框架需是一个能够让任务变得更简单并且提高生产率的东西，而不是某些我用它只是因为我可以或者因为我想要让自己成为一个更好的开发人员
而去使用。
</p>
<p>就如本文开头写的，我在一个电话面试中所提到的，在给出为什么我没有选择使用一个框架的解释之后，采访者这样反应,"我必须在一个巨大的团队中工作。当然啦，你了解我需要多少有些了解框架的啦"。少许思考之后，我知道了他的意思。
</p>
<p>使用框架的好处之一就是可以标准化一些事情如何被编码。也就是说，如果程序员A 和程序员B使用相同的框架为同一项目的两个部分工作，你可以很确定他们写的是兼容的。所以可能你需要问你自己的另外一个问题就是，你想要强制确定多少结构？
</p>
<p>框架非常大量的检测了他们需要多少预定义的结构。如果你是工作在一个大型团队中，你可能想要比做自己的项目更多强制的结构。预定义的结构提
供的团队工作环境的简化和代码的一致性足够弥补你为一个更需要结构的框架创建所有必须的类而增加生产时间和项目大小。相比之下，如果你是一个项目上工作的
唯一开发人员并且你只是需要一些东西来是生活更简单速度更快的开发，然后可能就你需要一个那种不需要强调太多结构的框架来运用到你的项目上。
</p>
<p>看起来， 选择一个正确的框架或者选择完全不使用框架，
只是开发人员的目标的一个功能呢个以及在哪个环境创建项目而已。我能给你的最好的建议就是诚实的高速你自己项目需要什么。我知道在我做完我的研究并且写了
本文之后，我放开了对于框架的观念，我认为它们的确实现了明确的需求。
</p>
<img src ="http://www.blogjava.net/sealyu/aggbug/286659.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2009-07-14 11:36 <a href="http://www.blogjava.net/sealyu/archive/2009/07/14/286659.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FLEX网站收集(转)</title><link>http://www.blogjava.net/sealyu/archive/2009/07/09/286006.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Thu, 09 Jul 2009 01:34:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2009/07/09/286006.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/286006.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2009/07/09/286006.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/286006.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/286006.html</trackback:ping><description><![CDATA[<div id="blog_text" class="cnt">
<div g_c_pdin="" g_p_center="" c07="" content="" style="width: 760px;">
<p style="text-indent: 2em;">一、国外站点</p>
<p style="text-indent: 2em;">1.资源类</p>
<p style="text-indent: 2em;"><a href="http://examples.adobe.com/flex2/inproduct/sdk/explorer/explorer.html"><font color="#ffbc00">Adobe Flex 2 Component Explorer</font></a>： 官方的，展示了各种组件的用法，入门必看。</p>
<p style="text-indent: 2em;"><a href="http://www.cflex.net/"><font color="#ffbc00">CFlex</font></a>：很好的一个Flex资源站点，包括教程，新闻，资源站点&#8230;&#8230; 只是页面有点杂乱，大家一般看右边那一栏就行了。</p>
<p style="text-indent: 2em;"><a href="http://flexbox.mrinalwadhwa.com/"><font color="#ffbc00">FlexBox</font></a>：一个收集了网上很多开源组件的站点，是进阶学习的好帮手。</p>
<p style="text-indent: 2em;"><a href="http://code.google.com/p/flexlib/"><font color="#ffbc00">FlexLib</font></a>：也是一个开源Flex组件站点，不过与FlexBox不同的是，这个是原创，而FlexBox只是收集。</p>
<p style="text-indent: 2em;"><a href="http://www.adobe.com/devnet/flex/"><font color="#ffbc00">Flex Developer Center</font></a>：Adobe Flex开发者中心，经常会有一些好的教程出现。</p>
<p style="text-indent: 2em;"><a href="http://labs.adobe.com/"><font color="#ffbc00">Adobe Labs</font></a>：这个不用我说了吧。</p>
<p style="text-indent: 2em;">Flex.org：<a href="http://www.flex.org/"><font color="#ffbc00">http://www.flex.org/</font></a>&nbsp;&nbsp;  官方的，基本上应有尽有。</p>
<p style="text-indent: 2em;">2. Explorers</p>
<p style="text-indent: 2em;"><a href="http://examples.adobe.com/flex2/consulting/styleexplorer/Flex2StyleExplorer.html"><font color="#ffbc00">Flex 2 Style Explorer</font></a>：用来设计程序样式风格的工具，很好用，现在源代码已经可以下载。</p>
<p style="text-indent: 2em;"><a href="http://www.3gcomm.fr/Flex/PrimitiveExplorer/Flex2PrimitiveExplorer.html"><font color="#ffbc00">Flex 2 Primitive Explorer</font></a>：用来调节各种Primitive图形的组件，非官方的，源代码提供下载。</p>
<p style="text-indent: 2em;"><a href="http://www.merhl.com/flex2_samples/filterExplorer/"><font color="#ffbc00">Flex 2 Filter Explorer</font></a>：用来调节各种滤镜（filter），非官方的，源代码提供下载。</p>
<p style="text-indent: 2em;">3. Blogs</p>
<p style="text-indent: 2em;"><a href="http://weblogs.macromedia.com/mxna/index.cfm"><font color="#ffbc00">MXNA</font></a>：这个不用我说了吧，虽说这不是一个Blog，但是它聚合了所有优秀的Blog，所以把它放在Blog一栏，下面所有的Blog都在这个聚合中。</p>
<p style="text-indent: 2em;">Alex Uhlmann：<a href="http://weblogs.macromedia.com/auhlmann/"><font color="#ffbc00">http://weblogs.macromedia.com/auhlmann/</font></a></p>
<p style="text-indent: 2em;">Christophe Coenraets：<a href="http://coenraets.org/"><font color="#ffbc00">http://coenraets.org/</font></a> 特别推荐</p>
<p style="text-indent: 2em;">Code Slinger：<a href="http://blogs.digitalprimates.net/codeSlinger/"><font color="#ffbc00">http://blogs.digitalprimates.net/codeSlinger/</font></a></p>
<p style="text-indent: 2em;">Deitte：<a href="http://www.deitte.com/"><font color="#ffbc00">http://www.deitte.com/</font></a></p>
<p style="text-indent: 2em;">Doug mccune：<a href="http://dougmccune.com/blog/"><font color="#ffbc00">http://dougmccune.com/blog/</font></a> 特别推荐</p>
<p style="text-indent: 2em;">Flex Doc Team：<a href="http://blogs.adobe.com/flexdoc/"><font color="#ffbc00">http://blogs.adobe.com/flexdoc/</font></a></p>
<p style="text-indent: 2em;">Kuwamoto：<a href="http://kuwamoto.org/"><font color="#ffbc00">http://kuwamoto.org/</font></a> 特别推荐</p>
<p style="text-indent: 2em;">Macromedia Consulting：<a href="http://weblogs.macromedia.com/mc/"><font color="#ffbc00">http://weblogs.macromedia.com/mc/</font></a></p>
<p style="text-indent: 2em;">Matt Chotin：<a href="http://weblogs.macromedia.com/mchotin/"><font color="#ffbc00">http://weblogs.macromedia.com/mchotin/</font></a> 特别推荐</p>
<p style="text-indent: 2em;">Peter Ent：<a href="http://weblogs.macromedia.com/pent/"><font color="#ffbc00">http://weblogs.macromedia.com/pent/</font></a> 特别推荐</p>
<p style="text-indent: 2em;">Quietly Scheming：<a href="http://www.quietlyscheming.com/blog/"><font color="#ffbc00">http://www.quietlyscheming.com/blog/</font></a> 特别推荐</p>
<p style="text-indent: 2em;">ScaleNine Blog：<a href="http://www.scalenine.com/blog/index.php"><font color="#ffbc00">http://www.scalenine.com/blog/index.php</font></a> 特别推荐</p>
<p style="text-indent: 2em;">Steven Webster：<a href="http://weblogs.macromedia.com/swebster/"><font color="#ffbc00">http://weblogs.macromedia.com/swebster/</font></a></p>
<p style="text-indent: 2em;">EverythingFlex：<a href="http://blog.everythingflex.com/"><font color="#ffbc00">http://blog.everythingflex.com/</font></a> 特别推荐</p>
<p style="text-indent: 2em;">Alex&#8217;s Flex Closet：<a href="http://blogs.adobe.com/aharui/"><font color="#ffbc00">http://blogs.adobe.com/aharui/</font></a> 特别推荐</p>
<p style="text-indent: 2em;">4. 邮件列表</p>
<p style="text-indent: 2em;">FlexCoders：<a href="http://tech.groups.yahoo.com/group/flexcoders/"><font color="#ffbc00">http://tech.groups.yahoo.com/group/flexcoders/</font></a></p>
<p style="text-indent: 2em;">Flex Components：<a href="http://www.adobe.com/go/flexcomponents"><font color="#ffbc00">http://www.adobe.com/go/flexcomponents</font></a> 非高级开发者最好别加入</p>
<p style="text-indent: 2em;">上面是两个比较有名的邮件列表，建议大家提问之前先搜索一下邮件存档，一般都能找到答案，找不到再提问。更多邮件列表请看这里：<a href="http://flex.org/community/"><font color="#ffbc00">http://flex.org/community/</font></a></p>
<p style="text-indent: 2em;">5.Cairngorm 相关</p>
<p style="text-indent: 2em;"><a href="http://cairngormdocs.org/"><font color="#ffbc00">Cairngorm Documentation Group</font></a> 这个里面收集了基本上所有关于Cairngorm的资料</p>
<p style="text-indent: 2em;">二、国内站点</p>
<p style="text-indent: 2em;">1.论坛</p>
<p style="text-indent: 2em;"><a href="http://www.riachina.com/"><font color="#ffbc00">RIACHINA</font></a>：前身是RIACN，国内最好的Flex论坛之一。我最初知道Flex从这里开始，对这个站挺有感情，饮水思源，把它排第一。</p>
<p style="text-indent: 2em;"><a href="http://www.anyflex.cn/bbs/index.php"><font color="#ffbc00">AnyFlex</font></a>：国内最好的Flex论坛之一，成立的时间比较早，而且论坛FTP中有很多好的资料。</p>
<p style="text-indent: 2em;"><a href="http://groups.google.com/group/riadev"><font color="#ffbc00">RIADev</font></a>：Google网上论坛，d.CAT前辈主持的，一般小问题都能解决。</p>
<p style="text-indent: 2em;"><a href="http://www.flexcoders.cn/"><font color="#ffbc00">FlexCoders.cn</font></a>：刚起步的论坛，不过看域名觉得挺有前途，呵呵。</p>
<p style="text-indent: 2em;">2.Blogs</p>
<p style="text-indent: 2em;"><a href="http://www.zhuoqun.net/"><font color="#ffbc00">Dreamer's Blog</font></a>：就是本站。我翻译了国外Flex Blog上的大量优秀文章，自认为是国内中文资料最多的站点之一。</p>
<p style="text-indent: 2em;"><a href="http://blog.ezse.com/"><font color="#ffbc00">Y.X.Shawn</font></a>：对Flex研究很深入，自己写一些开源的组件。</p>
<p style="text-indent: 2em;"><a href="http://ria.richtechmedia.com/"><font color="#ffbc00">d.CAT</font></a>：高级开发者，台湾的，为数不多的华语高级开发者，他还做过一个类似Caringorm的架构。</p>
<p style="text-indent: 2em;"><a href="http://www.k-zone.cn/"><font color="#ffbc00">Kenshin</font></a>：很早就开始研究Flex了，自己开发过很多东西。</p>
<p style="text-indent: 2em;">3.Cairngorm</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;  没有。不过我翻译过一个关于Cairngorm 小文档，大概30页左右，或许对你有帮助。您可以在<a href="http://www.anyflex.cn/bbs/index.php"><font color="#ffbc00">AnyFlex</font></a> 论坛下载到</p>
<p style="text-indent: 2em;">友情提示：上面这些站点中，资源类的更新不快，不用天天看；Blog和MXNA值得天天看，当然您也可以关注本站，因为我会把MXNA上的关于Flex的内容整理过来；有问题请先去邮件列表或者论坛中搜索，基本上都能搜索到。</p>
</div>
<p>补充</p>
<p>优秀的Flex 网站：<br />
1：<a href="http://www.scalenine.com/" target="_blank"><font color="#336699">http://www.scalenine.com/</font></a><br />
2：<a href="http://www.augitaly.com/flexgala/" target="_blank"><font color="#336699">http://www.augitaly.com/flexgala/</font></a> <br />
3：<a href="http://www.adobe.com/devnet/flex/quickstart/your_first_application/" target="_blank"><font color="#336699">http://www.adobe.com/devnet/flex/quickstart/your_first_application/</font></a> <br />
4：<a href="http://www.onflex.org/ted/" target="_blank"><font color="#336699">http://www.onflex.org/ted/</font></a> <br />
5：<a href="http://www.everythingflex.com/blog/" target="_blank"><font color="#336699">http://www.everythingflex.com/blog/</font></a> <br />
6：<a href="http://www.flex.org/" target="_blank"><font color="#336699">http://www.flex.org/</font></a> <br />
7：<a href="http://www.cflex.net/" target="_blank"><font color="#336699">http://www.cflex.net/</font></a><br />
8：ADOBE <a href="http://www.adobe.com/cfusion/exchange/index.cfm?view=sn610#loc=en_us&amp;view=sn610&amp;viewname=flex%20exchange" target="_blank"><font color="#336699">官方实例下载</font></a> </p>
<p><a href="http://www.scalenine.com/themes/shadow/shadow.html"><font color="#336699">http://www.scalenine.com/themes/shadow/shadow.html</font></a></p>
</div>
<img src ="http://www.blogjava.net/sealyu/aggbug/286006.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2009-07-09 09:34 <a href="http://www.blogjava.net/sealyu/archive/2009/07/09/286006.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Cairngorm简介（转）</title><link>http://www.blogjava.net/sealyu/archive/2009/07/06/285718.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Mon, 06 Jul 2009 14:01:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2009/07/06/285718.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/285718.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2009/07/06/285718.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/285718.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/285718.html</trackback:ping><description><![CDATA[<div><strong>什么是Cairngorm？</strong></div>
<div>&nbsp;</div>
<div>Cairngorm（中文名：&#8220;烟水晶&#8221;？）是一个轻量级的Flex RIA程序开发框架，从而使程序可扩展性、可维护性都大大提高，其本身并不是一个完整的企业应用，它只是提供了一个开发骨架，Adobe称之为体系。</div>
<div> <a href="http://www.soave.com.cn/image.axd?picture=Cairngorm%e6%b5%81%e7%a8%8b%e5%9b%be.png" target="_blank"><br />
</a></div>
<div>&nbsp;</div>
<div><strong>Cairngorm体系</strong>
<div>&nbsp;</div>
主要包括以下几个部分：</div>
<div>&nbsp;</div>
<div><font style="color: #5000ff;">1、VO（Value Object）</font></div>
<div>&nbsp;</div>
<div>IValueObject 和 ValueObject 只是为了提高VO类的可读性，表示该类是一个ValueObject类，其它没有任何实际作用。其可能是为将来而设计的，我们在应用过程中不需要实现任何接口函数。</div>
<div>&nbsp;</div>
<div><font style="color: #5000ff;">2、Model</font></div>
<div>&nbsp;</div>
<div>定义了ModelLocator接口，我们只需要实现该接口，把所需要绑定的数据保存在这里。通常我们都采用单例模式（Singleton
Pattern）来实现，并按照项目模块进行分类，避免把整个项目的所有数据都保存在一个类文件中。换句话说，ModelLocator是整个系统的数据
中心。 </div>
<div>&nbsp;</div>
<div>&nbsp;<font style="color: #5000ff;">3、View</font> </div>
<div>&nbsp;</div>
<div>&nbsp;有ViewHelper.as 和 ViewLocator.as，在Cairngorm2.2.1版本中已被废除。</div>
<div>&nbsp;</div>
<div>&nbsp;<font style="color: #5000ff;">4、Commands </font></div>
<div>&nbsp;</div>
<div>定义了ICommand接口，该接口定义了一个唯一需要实现的方法execute()，这其实就是典型的命令模式，我们只要实现此接口，并不需要关心其具体实现方式。</div>
<div>&nbsp;</div>
<div>&nbsp;<font style="color: #5000ff;">5、Control</font></div>
<div>&nbsp;</div>
<div>&nbsp;含三个基类：CairngormEvent、CairngormEventDispatcher和FrontController。
<p>（1）CairngormEvent：</p>
<p>继承flash.events.Event，其包含一个data成员，用来传递参数数据之用。</p>
<p>（2）CairngormEventDispatcher：</p>
<p>采用单例模式(Singleton Pattern)，用来广播用户发起的自定义动作事件。</p>
<p>（3）FrontController：</p>
<p>相当于控制中心，在这里你要做的工作是将事件（CairngormEvent）和命令（Command）之间的映射关系注册在它的<br />
成员commands（Dictionary类型）中，通过下面的类似方法进行注册：<br />
addCommand( GetProductsEvent.EVENT_GET_PRODUCTS, GetProductsCommand );</p>
<p>以后，凡是CairngormEventDispatcher广播出来的事件，首先都会在这里查找，找到对应的event对应的command后，<br />
便执行Command的execute()方法。</p>
<p><br />
FrontController必须要在你的系统中实例化，具体的实例化方法如下：</p>
</div>
<div>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 98%;">
<div><span style="color: #008080;">1</span><img alt="" src="http://www.soave.com.cn/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">mx:Application </span><span style="color: #ff0000;">xmlns:control</span><span style="color: #0000ff;">="com.domain.projectname.control.ShopController"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">2</span><span style="color: #000000;"><img alt="" src="http://www.soave.com.cn/Images/OutliningIndicators/None.gif" align="top" /> ...<br />
</span><span style="color: #008080;">3</span><span style="color: #000000;"><img alt="" src="http://www.soave.com.cn/Images/OutliningIndicators/None.gif" align="top" /> </span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">control:ShopController </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="controller"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">4</span><span style="color: #000000;"><img alt="" src="http://www.soave.com.cn/Images/OutliningIndicators/None.gif" align="top" /> ...<br />
</span><span style="color: #008080;">5</span><span style="color: #000000;"><img alt="" src="http://www.soave.com.cn/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">mx:Application</span><span style="color: #0000ff;">&gt;</span></div>
</div>
</div>
<div>&nbsp;</div>
<div>&nbsp;<font style="color: #5000ff;">6、Business </font></div>
<div>&nbsp;</div>
<div>&nbsp;IServiceLocator接口：
<p>提供了HTTPService、WebSercice、RemoteObject三种RPC服务。使用时候，将需要的RPC服务登记在该接口中，<br />
以mxml形式采用单例模式（Singleton Pattern）实现IServiceLocator，如下面使用例子：</p>
</div>
<div>&nbsp;
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 98%;">
<div><span style="color: #008080;">1</span><img alt="" src="http://www.soave.com.cn/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">cairngorm:ServiceLocator<br />
</span><span style="color: #008080;">2</span><span style="color: #800000;"><img alt="" src="http://www.soave.com.cn/Images/OutliningIndicators/None.gif" align="top" /> </span><span style="color: #ff0000;">xmlns:mx</span><span style="color: #0000ff;">="http://www.adobe.com/2006/mxml"</span><span style="color: #ff0000;"> <br />
</span><span style="color: #008080;">3</span><span style="color: #ff0000;"><img alt="" src="http://www.soave.com.cn/Images/OutliningIndicators/None.gif" align="top" /> xmlns:cairngorm</span><span style="color: #0000ff;">="http://www.adobe.com/2006/cairngorm"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">4</span><span style="color: #000000;"><img alt="" src="http://www.soave.com.cn/Images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080;">5</span><span style="color: #000000;"><img alt="" src="http://www.soave.com.cn/Images/OutliningIndicators/None.gif" align="top" /> </span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">mx:RemoteObject </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="productService"</span><span style="color: #ff0000;"> destination</span><span style="color: #0000ff;">="productServiceImpl"</span><span style="color: #ff0000;"> showBusyCursor</span><span style="color: #0000ff;">="true"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">6</span><span style="color: #000000;"><img alt="" src="http://www.soave.com.cn/Images/OutliningIndicators/None.gif" align="top" /> </span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">mx:RemoteObject</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">7</span><span style="color: #000000;"><img alt="" src="http://www.soave.com.cn/Images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080;">8</span><span style="color: #000000;"><img alt="" src="http://www.soave.com.cn/Images/OutliningIndicators/None.gif" align="top" /> </span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">mx:RemoteObject </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="creditCardService"</span><span style="color: #ff0000;"> destination</span><span style="color: #0000ff;">="creditCardServiceImpl"</span><span style="color: #ff0000;"> showBusyCursor</span><span style="color: #0000ff;">="true"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">9</span><span style="color: #000000;"><img alt="" src="http://www.soave.com.cn/Images/OutliningIndicators/None.gif" align="top" /> </span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">mx:RemoteObject</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">10</span><span style="color: #000000;"><img alt="" src="http://www.soave.com.cn/Images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080;">11</span><span style="color: #000000;"><img alt="" src="http://www.soave.com.cn/Images/OutliningIndicators/None.gif" align="top" /> </span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">mx:HTTPService </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="XXXService"</span><span style="color: #ff0000;"> url</span><span style="color: #0000ff;">="URL"</span><span style="color: #ff0000;"> showBusyCursor</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;"> useProxy</span><span style="color: #0000ff;">="false"</span><span style="color: #ff0000;"> resultFormat</span><span style="color: #0000ff;">="e4x"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">12</span><span style="color: #000000;"><img alt="" src="http://www.soave.com.cn/Images/OutliningIndicators/None.gif" align="top" /> </span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">mx:HTTPService</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">13</span><span style="color: #000000;"><img alt="" src="http://www.soave.com.cn/Images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080;">14</span><span style="color: #000000;"><img alt="" src="http://www.soave.com.cn/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">cairngorm:ServiceLocator</span><span style="color: #0000ff;">&gt;</span></div>
</div>
</div>
<div>&nbsp;</div>
<div>&nbsp;需要在系统中实例化，具体的实例化方法如下：
<div>&nbsp;</div>
<div>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 98%;">
<div><span style="color: #008080;">1</span><img alt="" src="http://www.soave.com.cn/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">mx:Application </span><span style="color: #ff0000;">xmlns:business</span><span style="color: #0000ff;">="com.adobe.cairngorm.samples.store.business.*"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">2</span><span style="color: #000000;"><img alt="" src="http://www.soave.com.cn/Images/OutliningIndicators/None.gif" align="top" /> ...<br />
</span><span style="color: #008080;">3</span><span style="color: #000000;"><img alt="" src="http://www.soave.com.cn/Images/OutliningIndicators/None.gif" align="top" /> </span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">business:Services </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="services"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">4</span><span style="color: #000000;"><img alt="" src="http://www.soave.com.cn/Images/OutliningIndicators/None.gif" align="top" /> ...<br />
</span><span style="color: #008080;">5</span><span style="color: #000000;"><img alt="" src="http://www.soave.com.cn/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">mx:Application</span><span style="color: #0000ff;">&gt;</span></div>
</div>
</div>
<div>&nbsp;</div>
</div>
<div>在某个Delegate类中的使用方法：</div>
<div>&nbsp;</div>
<div>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 98%;">
<div><span style="color: #008080;">1</span><img alt="" src="http://www.soave.com.cn/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000;">this.service = ServiceLocator.getInstance().getRemoteObject( "productService" );</span></div>
</div>
</div>
<div>&nbsp;</div>
<div>之后，就可以进行相关的函数调用了。</div>
<div>&nbsp;</div>
<div>后记：</div>
<div>&nbsp;</div>
<div>发现《基于Cairngorm的Flex应用程序设计》中文版电子书，顺便提供下载：<a href="http://www.soave.com.cn/file.axd?file=%e5%9f%ba%e4%ba%8eCairngorm%e7%9a%84Flex%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e8%ae%be%e8%ae%a1.pdf" rel="enclosure"><font color="#800080">基于Cairngorm的Flex应用程序设计.pdf (1.00 mb)</font></a></div>
<div>&nbsp;</div>
<div>转自：<a href="http://www.soave.com.cn/post/2008/06/what-is-cairngorm.aspx">http://www.soave.com.cn/post/2008/06/what-is-cairngorm.aspx</a><br />
<br />
<br />
<br />
<h2><a id="ctl10_TitleUrl" href="http://www.cnblogs.com/xxcainiao/archive/2008/12/16/1356113.html">学习Cairngorm站点、文章收集.</a>
</h2>
<p>1：<a href="http://www.davidtucker.net/category/cairngorm/">http://www.davidtucker.net/category/cairngorm/</a>&nbsp;&nbsp; <strong>入门强烈推荐</strong></p>
<p><strong>*<a href="http://www.cairngormdocs.org/tools/CairngormDiagramExplorer.swf">http://www.cairngormdocs.org/tools/CairngormDiagramExplorer.swf</a>&nbsp;&nbsp;&nbsp;&nbsp; <font color="#810081"><span style="color: #000000;"><strong><font style="color: #000000;" color="#810081">cairngorm图解法表示</font></strong></span></font></strong></p>
<p><font face="Verdana"><strong>&nbsp; </strong><a href="http://opensource.adobe.com/wiki/display/cairngorm/Cairngorm">http://opensource.adobe.com/wiki/display/cairngorm/Cairngorm</a>&nbsp;<strong>推荐</strong></font></p>
<p>2：<a href="http://opensource.adobe.com/wiki/display/cairngorm/Developer+Documentation">http://opensource.adobe.com/wiki/display/cairngorm/Developer+Documentation</a></p>
<p>3：<a href="http://www.adobe.com/devnet/flex/articles/graduating_pt1.html">http://www.adobe.com/devnet/flex/articles/graduating_pt1.html</a></p>
<p>4：<a href="http://www.adobe.com/devnet/flex/articles/cairngorm_pt1.html">http://www.adobe.com/devnet/flex/articles/cairngorm_pt1.html</a></p>
<p>5：<a href="http://jessewarden.com/2007/08/10-tips-for-working-with-cairngorm.html">http://jessewarden.com/2007/08/10-tips-for-working-with-cairngorm.html</a></p>
<p>6：<a href="http://www.soave.com.cn/post/2008/08/29/Cairngorm-WebService-and-HTTPService.aspx">Cairngorm学习——使用WebService和HTTPService服务</a></p>
<p>7:AIR也可以Cairngorm&nbsp;&nbsp; --&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.ericfeminella.com/blog/2007/07/16/air-cairngorm-air-extensions-for-cairngorm/">http://www.ericfeminella.com/blog/2007/07/16/air-cairngorm-air-extensions-for-cairngorm/</a></p>
<hr />
<p>实例：<a href="http://www.duzengqiang.com/blog/article.asp?id=198">http://www.duzengqiang.com/blog/article.asp?id=198</a>&nbsp;&nbsp;&nbsp;&nbsp; Flex Example: HTTPService &amp; Cairngorm 2.2</p>
<br />
</div>
<img src ="http://www.blogjava.net/sealyu/aggbug/285718.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2009-07-06 22:01 <a href="http://www.blogjava.net/sealyu/archive/2009/07/06/285718.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Flex效果 </title><link>http://www.blogjava.net/sealyu/archive/2009/05/09/269707.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Fri, 08 May 2009 16:57:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2009/05/09/269707.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/269707.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2009/05/09/269707.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/269707.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/269707.html</trackback:ping><description><![CDATA[<div class="cnt" id="blog_text">
<p><span style="font-size: small">1.旋转 </span></p>
<p><span style="font-size: small; line-height: 1.3em">效果：</span><a href="http://www.alex-uhlmann.de/flash/adobe/blog/distortionEffects/effectCube/" target="_blank"><span style="font-size: small; line-height: 1.3em">http://www.alex-uhlmann.de/flash/adobe/blog/distortionEffects/effectCube/</span></a><span style="font-size: small"> </span></p>
<p><span style="font-size: small; line-height: 1.3em">代码：</span><a href="http://weblogs.macromedia.com/auhlmann/archives/DistortionEffects.zip" target="_blank"><span style="font-size: small; line-height: 1.3em">http://weblogs.macromedia.com/auhlmann/archives/DistortionEffects.zip</span></a><span style="font-size: small"> </span></p>
<p><span style="font-size: small; line-height: 1.3em">2.画布按钮 </span></p>
<p><a href="http://dougmccune.com/blog/2007/06/01/new-component-canvasbutton-added-to-flexlib/" target="_blank"><span style="font-size: small; line-height: 1.3em">http://dougmccune.com/blog/2007/06/01/new-component-canvasbutton-added-to-flexlib/</span></a><span style="font-size: small"> </span></p>
<p><span style="font-size: small; line-height: 1.3em">3.鱼眼工具条 </span></p>
<p><span style="font-size: small; line-height: 1.3em">效果：</span><a href="http://dev.getoutsmart.com/labs/dock/" target="_blank"><span style="font-size: small; line-height: 1.3em">http://dev.getoutsmart.com/labs/dock/</span></a><span style="font-size: small"> </span></p>
<p><span style="font-size: small; line-height: 1.3em">代码：</span><a href="http://dev.getoutsmart.com/labs/dock/dockdemo.zip" target="_blank"><span style="font-size: small; line-height: 1.3em">http://dev.getoutsmart.com/labs/dock/dockdemo.zip</span></a><span style="font-size: small"> </span></p>
<p><span style="font-size: small; line-height: 1.3em">4.窗口 </span></p>
<p><a href="http://www.returnundefined.com/flexmdi/explorer/" target="_blank"><span style="font-size: small; line-height: 1.3em">http://www.returnundefined.com/flexmdi/explorer/</span></a><span style="font-size: small"> </span></p>
<p><a href="http://window.diaztorres.com/bin-release/test_window.html" target="_blank"><span style="font-size: small; line-height: 1.3em">http://window.diaztorres.com/bin-release/test_window.html</span></a><span style="font-size: small"> </span></p>
<p><span style="font-size: small; line-height: 1.3em">5.切换效果 </span></p>
<p><a href="http://blogs.digitalprimates.net/codeSlinger/samples/carousel/CarouselTest.html" target="_blank"><span style="font-size: small; line-height: 1.3em">http://blogs.digitalprimates.net/codeSlinger/samples/carousel/CarouselTest.html</span></a><span style="font-size: small"> </span></p>
<p><span style="font-size: small; line-height: 1.3em">6.图片展示</span><span style="font-size: small"> </span></p>
<p><span style="font-size: small; line-height: 1.3em">效果：<a href="http://flex.diaztorres.com/samples/aladinotest/aladino_test.html" target="_blank">http://flex.diaztorres.com/samples/aladinotest/aladino_test.html</a></span><span style="font-size: small"> </span></p>
<p><span style="font-size: small; line-height: 1.3em">代码：<a href="http://www.madeinflex.com/img/entries/2008/01/aladino.zip" target="_blank">http://www.madeinflex.com/img/entries/2008/01/aladino.zip</a></span><span style="font-size: small"> </span></p>
<p><span style="font-size: small; line-height: 1.3em">7.自定义载入进度条</span><span style="font-size: small"> </span></p>
<p><span style="font-size: small; line-height: 1.3em"><a href="http://blog.diaztorres.com/2007/05/mipreloader/mipreloaderdemo.html" target="_blank">http://blog.diaztorres.com/2007/05/mipreloader/mipreloaderdemo.html</a></span></p>
<p><span style="font-size: small">8.Flex Mac弹出窗口</span></p>
<p><a href="http://blog.xsive.co.nz/archives/244"><span style="font-size: small">http://blog.xsive.co.nz/archives/244</span></a></p>
<p><span style="font-size: small">9.果冻特效弹出窗口 </span></p>
<p><a href="http://blog.sban.com.cn/2008/04/01/jelly-effect-alert-window.html"><span style="font-size: small">http://blog.sban.com.cn/2008/04/01/jelly-effect-alert-window.html</span></a></p>
<p><span style="font-size: small">10.Alert弹出效果</span></p>
<p><a href="http://www.cnblogs.com/taobataoma/archive/2008/01/13/1037082.html"><span style="font-size: small">http://www.cnblogs.com/taobataoma/archive/2008/01/13/1037082.html</span></a></p>
<p><span style="font-size: small">11.自定义ToolTip</span></p>
<p><span style="font-size: small">图片：</span><a href="http://everythingflex.com/flex2/ImageToolTip/Index.html"><span style="font-size: small">http://everythingflex.com/flex2/ImageToolTip/Index.html</span></a></p>
<p><span style="font-size: small">视频：</span><a href="http://labs.flexcoders.nl/samples/ToolTip/video/002/"><span style="font-size: small">http://labs.flexcoders.nl/samples/ToolTip/video/002/</span></a></p>
<p><span style="font-size: small">弹性：</span><a href="http://labs.flexcoders.nl/samples/ToolTip/spring/001/"><span style="font-size: small">http://labs.flexcoders.nl/samples/ToolTip/spring/001/</span></a><br />
<br />
12. http://flanture.blogspot.com/2008/05/simple-flex-effects-example.html<br />
13.果冻效果： http://blog.sban.com.cn/2008/04/01/jelly-effect-alert-window.html<br />
14.BOOK：http://www.quietlyscheming.com/blog/components/flexbook/<br />
</p>
<br />
<br />
<p><strong>1:聚光灯效果：</strong></p>
<p>&nbsp;实例：<a href="http://www.rphelan.com/flex/SpotlightDemo/SpotlightDemo.html"><font color="#0696b9">http://www.rphelan.com/flex/SpotlightDemo/SpotlightDemo.html</font></a></p>
<ul>
    <li>ambientColor - color to apply to all pixels of the image
    <li>angle - angle at which the spotlight is projected (in degrees)
    <li>azimuth - angle between the image plane and the spotlight (in degrees)
    <li>coneAngle - angle of the spotlight's "opening" (in degrees)
    <li>distance - distance from the spotlight to the center point
    <li>intensity - intensity of the spotlight
    <li>position - x, y, z position of the spotlight
    <li>spotColor - color of the spotlight </li>
</ul>
<p>源文件：<a href="http://www.rphelan.com/flex/SpotlightDemo/srcview/index.html"><font color="#0696b9">http://www.rphelan.com/flex/SpotlightDemo/srcview/index.html</font></a></p>
<p><strong>2:放大镜效果：</strong></p>
<p>&nbsp;实例：<a href="http://www.rphelan.com/flex/MagnifyDemo/MagnifyDemo.html"><font color="#0696b9">http://www.rphelan.com/flex/MagnifyDemo/MagnifyDemo.html</font></a></p>
<ul>
    <li>center ([0-2048, 0-2048]) - the center coordinates of the magnified area
    <li>outerRadius (0-500) - the radius of the magnified part of the image
    <li>innerRadius (0-500) - the radius of the <em>fully </em>magnified part of the image
    <li>magnification (1-50) - the amount to magnify the image by (e.g. set to 2 for a 2x magnification) </li>
</ul>
<p>源文件：<a href="http://www.rphelan.com/flex/MagnifyDemo/srcview/index.html"><font color="#0696b9">http://www.rphelan.com/flex/MagnifyDemo/srcview/index.html</font></a></p>
<p><strong>3：缩放模糊效果：</strong></p>
<p>实例：<a href="http://www.rphelan.com/flex/ZoomBlurDemo/ZoomBlurDemo.html"><font color="#0696b9">http://www.rphelan.com/flex/ZoomBlurDemo/ZoomBlurDemo.html</font></a></p>
<ul>
    <li>amount (0 - 0.5) - the amount of blur to apply
    <li>center ([0 - 2048, 0 - 2048]) - the focal point of the blur </li>
</ul>
<p>源文件：<a href="http://www.rphelan.com/flex/ZoomBlurDemo/srcview/index.html"><font color="#0696b9">http://www.rphelan.com/flex/ZoomBlurDemo/srcview/index.html</font></a></p>
<p><strong>4：浮雕效果：</strong></p>
<p>实例：<a href="http://www.rphelan.com/flex/SharpenDemo/SharpenDemo.html"><font color="#0696b9">http://www.rphelan.com/flex/SharpenDemo/SharpenDemo.html</font></a></p>
<ul>
    <li>amount (0 - 20) - the amount to sharpen the image by
    <li>radius (0 - 1) - pixel distance to sample from </li>
</ul>
<p>源文件：<a href="http://www.rphelan.com/flex/SharpenDemo/srcview/index.html"><font color="#0696b9">http://www.rphelan.com/flex/SharpenDemo/srcview/index.html</font></a></p>
<p><strong>5：水波效果：</strong></p>
<p>实例：<a href="http://www.rphelan.com/flex/WaveReflectionDemo/WaveReflectionDemo.html"><font color="#0696b9">http://www.rphelan.com/flex/WaveReflectionDemo/WaveReflectionDemo.html</font></a></p>
</div>
<img src ="http://www.blogjava.net/sealyu/aggbug/269707.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2009-05-09 00:57 <a href="http://www.blogjava.net/sealyu/archive/2009/05/09/269707.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Flex-元数据标签(转)</title><link>http://www.blogjava.net/sealyu/archive/2009/05/06/269289.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Wed, 06 May 2009 12:31:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2009/05/06/269289.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/269289.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2009/05/06/269289.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/269289.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/269289.html</trackback:ping><description><![CDATA[<p>什么是元数据标签呢？在Flex经常用到的绑定数据标签[Bindable]就是其中一种。<br />
那马元数据标签是干嘛的呢？它在代码中的作用就是向编译器提供如何编译程序的信息。实际上，实际编译过程中，元数据标签并没有被编译到生成的SWF中，而只是告诉编译器如何生成SWF文件。<br />
PS:并不是只有Flex中可以使用元数据标签，安装Flex SDK后再Flash CS4中也可以使用。<br />
下边，列一下几个元数据标签：<br />
1.[Bindable]用来绑定数据类型，类，以及函数。<br />
用法：</p>
<div class="syntaxhighlighter " id="highlighter_706349">
<div class="bar">
<div class="toolbar"><a class="item viewSource" title="view source" style="width: 16px; height: 16px" href="http://nwhy.org/flash-metadata-tag.html#viewSource" highlighterid="highlighter_706349" commandname="viewSource">view source</a><a class="item printSource" title="print" style="width: 16px; height: 16px" href="http://nwhy.org/flash-metadata-tag.html#printSource" highlighterid="highlighter_706349" commandname="printSource">print</a><a class="item about" title="?" style="width: 16px; height: 16px" href="http://nwhy.org/flash-metadata-tag.html#about" highlighterid="highlighter_706349" commandname="about">?</a></div>
</div>
<div class="lines">
<div class="line alt1"><code class="number">1.</code><span class="content"><span class="block" style="margin-left: 0px"><code class="plain">[Bindable] </code></span></span></div>
<div class="line alt2"><code class="number">2.</code><span class="content"><span class="block" style="margin-left: 0px"><code class="keyword">private</code> <code class="keyword">var</code> <code class="plain">str:String=</code><code class="string">"绑定的字符串"</code><code class="plain">;</code></span></span></div>
</div>
</div>
<p>2.[Embed]用来导入图片。<br />
用法：</p>
<div class="syntaxhighlighter " id="highlighter_293337">
<div class="bar">
<div class="toolbar"><a class="item viewSource" title="view source" style="width: 16px; height: 16px" href="http://nwhy.org/flash-metadata-tag.html#viewSource" highlighterid="highlighter_293337" commandname="viewSource">view source</a><a class="item printSource" title="print" style="width: 16px; height: 16px" href="http://nwhy.org/flash-metadata-tag.html#printSource" highlighterid="highlighter_293337" commandname="printSource">print</a><a class="item about" title="?" style="width: 16px; height: 16px" href="http://nwhy.org/flash-metadata-tag.html#about" highlighterid="highlighter_293337" commandname="about">?</a></div>
</div>
<div class="lines">
<div class="line alt1"><code class="number">1.</code><span class="content"><span class="block" style="margin-left: 0px"><code class="plain">[Embed(source=</code><code class="string">'_f.png'</code><code class="plain">)]</code><code class="comments">//绑定图片_f.png给icon类 </code></span></span></div>
<div class="line alt2"><code class="number">2.</code><span class="content"><span class="block" style="margin-left: 0px"><code class="keyword">private</code> <code class="keyword">var</code> <code class="plain">icon:Class;</code></span></span></div>
</div>
</div>
<p><br />
3.[DefaultProperty]用来将一个单一属性设定为某个类的默认属性。<br />
用法：</p>
<div class="syntaxhighlighter " id="highlighter_610970">
<div class="bar">
<div class="toolbar"><a class="item viewSource" title="view source" style="width: 16px; height: 16px" href="http://nwhy.org/flash-metadata-tag.html#viewSource" highlighterid="highlighter_610970" commandname="viewSource">view source</a><a class="item printSource" title="print" style="width: 16px; height: 16px" href="http://nwhy.org/flash-metadata-tag.html#printSource" highlighterid="highlighter_610970" commandname="printSource">print</a><a class="item about" title="?" style="width: 16px; height: 16px" href="http://nwhy.org/flash-metadata-tag.html#about" highlighterid="highlighter_610970" commandname="about">?</a></div>
</div>
<div class="lines">
<div class="line alt1"><code class="number">1.</code><span class="content"><span class="block" style="margin-left: 0px"><code class="plain">[DefaultProperty(</code><code class="string">"defaultLabel"</code><code class="plain">)] </code></span></span></div>
<div class="line alt2"><code class="number">2.</code><span class="content"><span class="block" style="margin-left: 0px"><code class="keyword">public</code> <code class="keyword">class</code> <code class="plain">Cexp{ </code></span></span></div>
<div class="line alt1"><code class="number">3.</code><span class="content"><code class="spaces">&nbsp;&nbsp;</code><span class="block" style="margin-left: 16px"><code class="keyword">public</code> <code class="keyword">function</code> <code class="plain">set defaultLabel(value:String):</code><code class="keyword">void</code><code class="plain">{ </code></span></span></div>
<div class="line alt2"><code class="number">4.</code><span class="content"><code class="spaces">&nbsp;&nbsp;&nbsp;</code><span class="block" style="margin-left: 24px"><code class="keyword">if</code><code class="plain">(value!=</code><code class="keyword">null</code><code class="plain">) </code></span></span></div>
<div class="line alt1"><code class="number">5.</code><span class="content"><code class="spaces">&nbsp;&nbsp;&nbsp;</code><span class="block" style="margin-left: 24px"><code class="keyword">this</code><code class="plain">._v=value; </code></span></span></div>
<div class="line alt2"><code class="number">6.</code><span class="content"><code class="spaces">&nbsp;</code><span class="block" style="margin-left: 8px"><code class="plain">} </code></span></span></div>
<div class="line alt1"><code class="number">7.</code><span class="content"><span class="block" style="margin-left: 0px"><code class="plain">}</code></span></span></div>
</div>
</div>
<p>4.[Event]用来声明分派给自定义类的事件。<br />
用法很简单：</p>
<div class="syntaxhighlighter " id="highlighter_986230">
<div class="bar">
<div class="toolbar"><a class="item viewSource" title="view source" style="width: 16px; height: 16px" href="http://nwhy.org/flash-metadata-tag.html#viewSource" highlighterid="highlighter_986230" commandname="viewSource">view source</a><a class="item printSource" title="print" style="width: 16px; height: 16px" href="http://nwhy.org/flash-metadata-tag.html#printSource" highlighterid="highlighter_986230" commandname="printSource">print</a><a class="item about" title="?" style="width: 16px; height: 16px" href="http://nwhy.org/flash-metadata-tag.html#about" highlighterid="highlighter_986230" commandname="about">?</a></div>
</div>
<div class="lines">
<div class="line alt1"><code class="number">1.</code><span class="content"><span class="block" style="margin-left: 0px"><code class="plain">[Event(name=</code><code class="string">"eventName"</code><code class="plain">,type=</code><code class="string">"eventType"</code><code class="plain">] </code></span></span></div>
<div class="line alt2"><code class="number">2.</code><span class="content"><span class="block" style="margin-left: 0px"><code class="comments">//然后就是自己event处理函数了</code></span></span></div>
</div>
</div>
<p>5.[Effect]定义一个自定义效果</p>
<div class="syntaxhighlighter " id="highlighter_540590">
<div class="bar">
<div class="toolbar"><a class="item viewSource" title="view source" style="width: 16px; height: 16px" href="http://nwhy.org/flash-metadata-tag.html#viewSource" highlighterid="highlighter_540590" commandname="viewSource">view source</a><a class="item printSource" title="print" style="width: 16px; height: 16px" href="http://nwhy.org/flash-metadata-tag.html#printSource" highlighterid="highlighter_540590" commandname="printSource">print</a><a class="item about" title="?" style="width: 16px; height: 16px" href="http://nwhy.org/flash-metadata-tag.html#about" highlighterid="highlighter_540590" commandname="about">?</a></div>
</div>
<div class="lines">
<div class="line alt1"><code class="number">1.</code><span class="content"><span class="block" style="margin-left: 0px"><code class="plain">[Effect(name=</code><code class="string">"eventEffectName"</code><code class="plain">,event=</code><code class="string">"eventName"</code><code class="plain">] </code></span></span></div>
<div class="line alt2"><code class="number">2.</code><span class="content"><span class="block" style="margin-left: 0px"><code class="comments">//eventEffectName效果，eventName出发效果的事件。</code></span></span></div>
</div>
</div>
<p>6.[ArrayElementType]定义数组元素的数据类型</p>
<div class="syntaxhighlighter " id="highlighter_617025">
<div class="bar">
<div class="toolbar"><a class="item viewSource" title="view source" style="width: 16px; height: 16px" href="http://nwhy.org/flash-metadata-tag.html#viewSource" highlighterid="highlighter_617025" commandname="viewSource">view source</a><a class="item printSource" title="print" style="width: 16px; height: 16px" href="http://nwhy.org/flash-metadata-tag.html#printSource" highlighterid="highlighter_617025" commandname="printSource">print</a><a class="item about" title="?" style="width: 16px; height: 16px" href="http://nwhy.org/flash-metadata-tag.html#about" highlighterid="highlighter_617025" commandname="about">?</a></div>
</div>
<div class="lines">
<div class="line alt1"><code class="number">1.</code><span class="content"><span class="block" style="margin-left: 0px"><code class="plain">[ArrayElementType(</code><code class="string">"String"</code><code class="plain">)] </code></span></span></div>
<div class="line alt2"><code class="number">2.</code><span class="content"><span class="block" style="margin-left: 0px"><code class="keyword">public</code> <code class="keyword">var</code> <code class="plain">aryString:Array; </code></span></span></div>
<div class="line alt1"><code class="number">3.</code><span class="content"><span class="block" style="margin-left: 0px"><code class="plain">[ArrayElementType(</code><code class="string">"Number"</code><code class="plain">)] </code></span></span></div>
<div class="line alt2"><code class="number">4.</code><span class="content"><span class="block" style="margin-left: 0px"><code class="keyword">public</code> <code class="keyword">var</code> <code class="plain">aryOfNumber:Array;</code></span></span></div>
</div>
</div>
<img src ="http://www.blogjava.net/sealyu/aggbug/269289.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2009-05-06 20:31 <a href="http://www.blogjava.net/sealyu/archive/2009/05/06/269289.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pyamf小实例(转)</title><link>http://www.blogjava.net/sealyu/archive/2009/05/01/268558.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Fri, 01 May 2009 15:36:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2009/05/01/268558.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/268558.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2009/05/01/268558.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/268558.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/268558.html</trackback:ping><description><![CDATA[这两天在学习Google AppEngine的时候， 需要写一个小程序，就是简单的从数据库里读出数据，然后显示出来。
<br />
界面使用flex的，所以数据通信是想到了用amf,搜索到了两个python的开源产品--pyAmf和Django Amf,后来看到Django Amf更新的并不频繁，所以最后选了pyAmf。
<br />
<br />
pyAmf还有一个优点是官方网站推荐了几篇django与flex通信的文章里有一篇是中文的，哈哈。。。我喜欢中文。。。链接见
<br />
<a href="http://blog.eshangrao.com/index.php/2008/02/16/447-flexpyamfdjango" target="_blank">http://blog.eshangrao.com/index.php/2008/02/16/447-flexpyamfdjango</a>
<br />
<br />
我的程序参考的也就是这篇文章，但代码写完后，程序并没有通过，而是一直报找不到服务，折腾了两天终于搞出来了。
<br />
<br />
Django 服务端，
<br />
<br />
1. 新建立一个工程testAMF,然后建立一个app--dailystory.
<br />
<br />
2. 修改settings.py
<br />
&nbsp;&nbsp; 将dailystory添加到INSTALLED_APPS中。
<br />
&nbsp;&nbsp; 配置数据库。
<br />
<br />
3. 工程目录中( whatidisplay 文件夹里 )的urls.py 的相关代码如下:
<br />
<div>
<div>
<div>Python代码 <embed src="http://yimogod.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=from%20django.conf.urls.defaults%20import%20*%0Aimport%20settings%0A%0Aurlpatterns%20%3D%20patterns(''%2C%0A%20%20%20%20(r'%5Edailystory%2F'%2C%20include('testAMF.dailystory.urls'))%2C%0A%20%20%20%20(r'%5Eadmin%2F'%2C%20include('django.contrib.admin.urls'))%2C%0A%20%20%20%20)%0A" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></div>
</div>
<ol start="1">
    <li>from&nbsp;django.conf.urls.defaults&nbsp;import&nbsp;*&nbsp;&nbsp;</li>
    <li>import&nbsp;settings&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>urlpatterns&nbsp;=&nbsp;patterns('',&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;(r'^dailystory/',&nbsp;include('testAMF.dailystory.urls')),&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;(r'^admin/',&nbsp;include('django.contrib.admin.urls')),&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="python">from django.conf.urls.defaults import *
import settings
urlpatterns = patterns('',
(r'^dailystory/', include('testAMF.dailystory.urls')),
(r'^admin/', include('django.contrib.admin.urls')),
)
</pre>
<br />
<br />
4. 在dailystory文件夹中添加一个urls.py文件
<br />
<div>
<div>
<div>Python代码 <embed src="http://yimogod.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=from%20django.conf.urls.defaults%20import%20*%0A%0Aurlpatterns%20%3D%20patterns(''%2C%0A%20%20%20%20(r'%5Egateway%2F%24'%2C%20'testAMF.dailystory.amfgateway.storyGateway')%2C%0A%20%20%20%20(r'%5E(.*)%24'%2C%20'django.views.static.serve'%2C%20%7B'document_root'%3A'dailystory%2Fflex'%7D)%2C%0A%20%20%20%20)%0A" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></div>
</div>
<ol start="1">
    <li>from&nbsp;django.conf.urls.defaults&nbsp;import&nbsp;*&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>urlpatterns&nbsp;=&nbsp;patterns('',&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;(r'^gateway/$',&nbsp;'testAMF.dailystory.amfgateway.storyGateway'),&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;(r'^(.*)$',&nbsp;'django.views.static.serve',&nbsp;{'document_root':'dailystory/flex'}),&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="python">from django.conf.urls.defaults import *
urlpatterns = patterns('',
(r'^gateway/$', 'testAMF.dailystory.amfgateway.storyGateway'),
(r'^(.*)$', 'django.views.static.serve', {'document_root':'dailystory/flex'}),
)
</pre>
<br />
<br />
5. 修改dailystory文件夹中的models.py 文件
<br />
<div>
<div>
<div>Python代码 <embed src="http://yimogod.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=from%20django.db%20import%20models%0A%0Aclass%20DailyStory(models.Model)%3A%0A%20%20%20%20content%20%3D%20models.TextField()%0A%0A%20%20%20%20def%20__unicode__(self)%3A%0A%20%20%20%20%20%20%20%20return%20self.title%0A%0A%20%20%20%20class%20Admin%3A%0A%20%20%20%20%20%20%20%20pass%0A" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></div>
</div>
<ol start="1">
    <li>from&nbsp;django.db&nbsp;import&nbsp;models&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>class&nbsp;DailyStory(models.Model):&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;content&nbsp;=&nbsp;models.TextField()&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;__unicode__(self):&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;self.title&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;Admin:&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pass&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="python">from django.db import models
class DailyStory(models.Model):
content = models.TextField()
def __unicode__(self):
return self.title
class Admin:
pass
</pre>
<br />
6. 在dailystory文件夹中添加一个amfgateway.py文件
<br />
<div>
<div>
<div>Python代码 <embed src="http://yimogod.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=from%20pyamf.remoting.gateway.django%20import%20DjangoGateway%0Afrom%20dailystory.models%20import%20DailyStory%0A%0Adef%20getDailyStory(request)%3A%0A%20%20%20%20return%20DailyStory.objects.all()%0A%0A%0AstoryGateway%20%3D%20DjangoGateway(%7B%0A%20%20%20%20'dailystory.getDailyStory'%3A%20getDailyStory%2C%0A%20%7D)%0A" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></div>
</div>
<ol start="1">
    <li>from&nbsp;pyamf.remoting.gateway.django&nbsp;import&nbsp;DjangoGateway&nbsp;&nbsp;</li>
    <li>from&nbsp;dailystory.models&nbsp;import&nbsp;DailyStory&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>def&nbsp;getDailyStory(request):&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;DailyStory.objects.all()&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>storyGateway&nbsp;=&nbsp;DjangoGateway({&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;'dailystory.getDailyStory':&nbsp;getDailyStory,&nbsp;&nbsp;</li>
    <li>&nbsp;})&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="python">from pyamf.remoting.gateway.django import DjangoGateway
from dailystory.models import DailyStory
def getDailyStory(request):
return DailyStory.objects.all()
storyGateway = DjangoGateway({
'dailystory.getDailyStory': getDailyStory,
})
</pre>
<br />
Django的服务端就大功告成了
<br />
<br />
<br />
Flex端更简单
<br />
<div>
<div>
<div>Java代码 <embed src="http://yimogod.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3Cmx%3AApplication%20xmlns%3Amx%3D%22http%3A%2F%2Fwww.adobe.com%2F2006%2Fmxml%22%0A%09layout%3D%22absolute%22%20creationComplete%3D%22initApp()%3B%22%3E%0A%09%0A%09%3Cmx%3AScript%3E%0A%09%09%3C!%5BCDATA%5B%0A%09%09%09import%20flash.events.NetStatusEvent%3B%0A%09%09%09%0A%09%09%09import%20mx.collections.ArrayCollection%3B%0A%09%09%09import%20mx.rpc.AsyncToken%3B%0A%09%09%09import%20mx.rpc.AsyncResponder%3B%0A%09%09%09import%20mx.rpc.events.FaultEvent%3B%0A%09%09%09import%20mx.rpc.events.ResultEvent%3B%09%09%09%0A%09%09%09%0A%09%09%09private%20function%20initApp()%3Avoid%0A%09%09%09%7B%0A%20%20%20%20%09%09%09%0A%20%20%20%20%09%09%09%20%20%20%20var%20token%3AAsyncToken%3DdjangoService.getDailyStory()%3B%0A%09%09%09%20%20%20%20token.addResponder(new%20AsyncResponder(onGetDailyStory%2CfaultHandler))%3B%0A%09%09%09%7D%0A%09%09%09%0A%09%09%09private%20function%20onGetDailyStory(re%3AResultEvent%2C%20token%3AObject%3Dnull)%3Avoid%0A%09%09%09%7B%0A%09%09%09%20%20%20%20var%20stories%3AArray%20%3D%20re.result%20as%20Array%3B%0A%09%09%09%20%20%20%20var%20storyCollection%3AArrayCollection%20%3D%20new%20ArrayCollection(stories)%3B%0A%09%09%09%20%20%20%20yesterdayStory.text%20%3D%20storyCollection.getItemAt(0).content%3B%0A%09%09%09%7D%0A%09%09%09%0A%09%09%09private%20function%20faultHandler(fe%3AFaultEvent%2C%20token%3AObject%3Dnull)%3Avoid%0A%09%09%09%7B%0A%09%09%09%20%20%20%20trace(fe.fault.faultDetail)%3B%0A%09%09%09%7D%0A%09%09%5D%5D%3E%0A%09%3C%2Fmx%3AScript%3E%0A%09%0A%09%3Cmx%3ARemoteObject%0A%09%09id%3D%22djangoService%22%0A%09%09destination%3D%22dailystory%22%0A%09%09showBusyCursor%3D%22true%22%3E%0A%09%3C%2Fmx%3ARemoteObject%3E%0A%09%0A%09%3Cmx%3ATextArea%20id%3D%22yesterdayStory%22%20x%3D%22582%22%20y%3D%22130%22%20height%3D%22118%22%20width%3D%22242%22%2F%3E%0A%3C%2Fmx%3AApplication%3E%0A" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></div>
</div>
<ol start="1">
    <li>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="utf-8"?&gt;&nbsp;&nbsp;</li>
    <li>&lt;mx:Application&nbsp;xmlns:mx="http://www.adobe.com/2006/mxml"&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;layout="absolute"&nbsp;creationComplete="initApp();"&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;mx:Script&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;![CDATA[&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;import&nbsp;flash.events.NetStatusEvent;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;import&nbsp;mx.collections.ArrayCollection;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;import&nbsp;mx.rpc.AsyncToken;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;import&nbsp;mx.rpc.AsyncResponder;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;import&nbsp;mx.rpc.events.FaultEvent;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;import&nbsp;mx.rpc.events.ResultEvent;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;function&nbsp;initApp():void&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;token:AsyncToken=djangoService.getDailyStory();&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;token.addResponder(new&nbsp;AsyncResponder(onGetDailyStory,faultHandler));&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;function&nbsp;onGetDailyStory(re:ResultEvent,&nbsp;token:Object=null):void&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;stories:Array&nbsp;=&nbsp;re.result&nbsp;as&nbsp;Array;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;storyCollection:ArrayCollection&nbsp;=&nbsp;new&nbsp;ArrayCollection(stories);&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yesterdayStory.text&nbsp;=&nbsp;storyCollection.getItemAt(0).content;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;function&nbsp;faultHandler(fe:FaultEvent,&nbsp;token:Object=null):void&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trace(fe.fault.faultDetail);&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]]&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/mx:Script&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;mx:RemoteObject&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id="djangoService"&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;destination="dailystory"&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showBusyCursor="true"&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/mx:RemoteObject&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;mx:TextArea&nbsp;id="yesterdayStory"&nbsp;x="582"&nbsp;y="130"&nbsp;height="118"&nbsp;width="242"/&gt;&nbsp;&nbsp;</li>
    <li>&lt;/mx:Application&gt;&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="java">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute" creationComplete="initApp();"&gt;
&lt;mx:Script&gt;
&lt;![CDATA[
import flash.events.NetStatusEvent;
import mx.collections.ArrayCollection;
import mx.rpc.AsyncToken;
import mx.rpc.AsyncResponder;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
private function initApp():void
{
var token:AsyncToken=djangoService.getDailyStory();
token.addResponder(new AsyncResponder(onGetDailyStory,faultHandler));
}
private function onGetDailyStory(re:ResultEvent, token:Object=null):void
{
var stories:Array = re.result as Array;
var storyCollection:ArrayCollection = new ArrayCollection(stories);
yesterdayStory.text = storyCollection.getItemAt(0).content;
}
private function faultHandler(fe:FaultEvent, token:Object=null):void
{
trace(fe.fault.faultDetail);
}
]]&gt;
&lt;/mx:Script&gt;
&lt;mx:RemoteObject
id="djangoService"
destination="dailystory"
showBusyCursor="true"&gt;
&lt;/mx:RemoteObject&gt;
&lt;mx:TextArea id="yesterdayStory" x="582" y="130" height="118" width="242"/&gt;
&lt;/mx:Application&gt;
</pre>
<br />
<br />
然后需要在于与上述flex文件同目录中新建一个services-config.xml
<br />
<div>
<div>
<div>Xml代码 <embed src="http://yimogod.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A%3Cservices-config%3E%0A%20%20%20%20%3Cservices%3E%0A%20%20%20%20%20%20%20%20%3Cservice%20id%3D%22dailyStoryService%22%20class%3D%22flex.messaging.services.RemotingService%22%20messageTypes%3D%22flex.messaging.messages.RemotingMessage%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cdestination%20id%3D%22dailystory%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cchannels%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cchannel%20ref%3D%22dailyStoryChannel%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fchannels%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cproperties%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Csource%3E*%3C%2Fsource%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fproperties%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fdestination%3E%0A%20%20%20%20%20%20%20%20%3C%2Fservice%3E%0A%20%20%20%20%3C%2Fservices%3E%0A%20%20%20%20%3Cchannels%3E%0A%20%20%20%20%20%20%20%20%3Cchannel-definition%20id%3D%22dailyStoryChannel%22%20class%3D%22mx.messaging.channels.AMFChannel%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cendpoint%20uri%3D%22http%3A%2F%2Flocalhost%3A8080%2Fdailystory%2Fgateway%2F%22%20class%3D%22flex.messaging.endpoints.AMFEndpoint%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fchannel-definition%3E%0A%20%20%20%20%3C%2Fchannels%3E%0A%3C%2Fservices-config%3E%0A" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></div>
</div>
<ol start="1">
    <li>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;&nbsp;&nbsp;</li>
    <li>&lt;services-config&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;services&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;service&nbsp;id="dailyStoryService"&nbsp;class="flex.messaging.services.RemotingService"&nbsp;messageTypes="flex.messaging.messages.RemotingMessage"&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;destination&nbsp;id="dailystory"&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;channels&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;channel&nbsp;ref="dailyStoryChannel"/&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/channels&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;properties&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;source&gt;*&lt;/source&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/properties&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/destination&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/service&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/services&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;channels&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;channel-definition&nbsp;id="dailyStoryChannel"&nbsp;class="mx.messaging.channels.AMFChannel"&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;endpoint&nbsp;uri="http://localhost:8080/dailystory/gateway/"&nbsp;class="flex.messaging.endpoints.AMFEndpoint"/&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/channel-definition&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/channels&gt;&nbsp;&nbsp;</li>
    <li>&lt;/services-config&gt;&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;services-config&gt;
&lt;services&gt;
&lt;service id="dailyStoryService" class="flex.messaging.services.RemotingService" messageTypes="flex.messaging.messages.RemotingMessage"&gt;
&lt;destination id="dailystory"&gt;
&lt;channels&gt;
&lt;channel ref="dailyStoryChannel"/&gt;
&lt;/channels&gt;
&lt;properties&gt;
&lt;source&gt;*&lt;/source&gt;
&lt;/properties&gt;
&lt;/destination&gt;
&lt;/service&gt;
&lt;/services&gt;
&lt;channels&gt;
&lt;channel-definition id="dailyStoryChannel" class="mx.messaging.channels.AMFChannel"&gt;
&lt;endpoint uri="http://localhost:8080/dailystory/gateway/" class="flex.messaging.endpoints.AMFEndpoint"/&gt;
&lt;/channel-definition&gt;
&lt;/channels&gt;
&lt;/services-config&gt;
</pre>
<br />
<br />
在编译时注意添加编译参数-services services-config.xml
<br />
<br />
然后将编译后生成的在bin-debug文件夹中的文件复制到whatidisplay"dailystory"flex文件夹里
<br />
<br />
运行django服务器
<br />
<div>
<div>
<div>Java代码 <embed src="http://yimogod.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=manage.py%20runserver%208080" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></div>
</div>
<ol start="1">
    <li>manage.py&nbsp;runserver&nbsp;8080&nbsp;&nbsp;</li>
</ol>
</div>
<br />
访问<a href="http://localhost:8080/dailystory/DailyStory.html" target="_blank">http://localhost:8080/dailystory/DailyStory.html</a>
<br />
<br />
<br />
<br />
这里与我参考的文章不同的有两点，估计是pyAMF的更新造成的。我用的pyamf版本是0.3.1.
<br />
第一个是在amfgateway.py文件中
<br />
<div>
<div>
<div>Java代码 <embed src="http://yimogod.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=storyGateway%20%3D%20DjangoGateway(%7B%0A%20%20%20%20'dailystory.getDailyStory'%3A%20getDailyStory%2C%0A%20%7D)%0A" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></div>
</div>
<ol start="1">
    <li>storyGateway&nbsp;=&nbsp;DjangoGateway({&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;'dailystory.getDailyStory':&nbsp;getDailyStory,&nbsp;&nbsp;</li>
    <li>&nbsp;})&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="java">storyGateway = DjangoGateway({
'dailystory.getDailyStory': getDailyStory,
})
</pre>
<br />
我在给DjangoGateway赋值时使用了<span style="color: blue;">appName.method</span>--即<span style="color: blue;">dailystory.getDailyStory</span>
<br />
据官方说这可能是个bug;)具体参看<a href="http://www.pyamf.org/wiki/DjangoHowto" target="_blank">http://www.pyamf.org/wiki/DjangoHowto</a>中的May be some problems here
<br />
<br />
另外一处是 <span style="color: blue;">services-config.xml</span> 文件中，我的<span style="color: blue;">destination id</span> 给的就是django中App的名字。如果起其他名字的话，最后flex总是得不到服务。很奇怪。
<br />
<img src ="http://www.blogjava.net/sealyu/aggbug/268558.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2009-05-01 23:36 <a href="http://www.blogjava.net/sealyu/archive/2009/05/01/268558.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Django+Flex+AMF</title><link>http://www.blogjava.net/sealyu/archive/2009/05/01/268539.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Fri, 01 May 2009 11:19:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2009/05/01/268539.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/268539.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2009/05/01/268539.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/268539.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/268539.html</trackback:ping><description><![CDATA[<h1><a href="http://gain-loss.org/?p=143" rel="bookmark">pyamf与django整合，机制及源码分析</a></h1>
<p>开始研究pyamf的用处了。<br />
pyamf（http://www.pyamf.org）是一个很好的amf中间件，能跟django, twisted, google app
engine等流行框架整合。现在我要做的就是pyamf结合django 1.0。据说flex通过amf做PRC调用似乎节省掉很多带宽。<br />
下载<br />
去官网找到svn地址，checkout下来之后install，很简单。python真是一种很简洁很强大的语言，和flex很配啊。<br />
处理机制<br />
既然跟django结合，就应该有一套处理request，response的机制。pyamf里对应的就是
pyamf.remoting.gateway.django模块。打开能看到有一个类class
DjangoGateway(gateway.BaseGateway)，它就是整个处理流程的主干。class
document很好的解释了它在django中的用法。仅仅需要在views.py中建立一个DjangoGateway实例，这个实例是urlmap
对应的处理函数，它把从django底层传递过来的request（其实是AMF编码过的）解码，并映射相应的python对象，然后执行注册的RPC方
法（就是flex调用amf过程中看到的方法调用）返回一个response，最后用AMF机制编码这个response，返回给django。这样
django再通过层层处理返回这个AMF信息给flex。如此便是一个完整的amf
PRC调用过程。很多的server基本上都是基于类似的机制，通过中间件层层过滤request和response，达到隔离底层处理的目的。最后我们
能看到，django内部处理amf的调用是如此之简单。<br />
DjangoGateway有两个方法很重要，一个是__call__（python的特殊名字方法，自己定义的方法不能用这些名字哦，__call__
使得对象能像方法那样用，比如有对象a，执行a()相当于执行a.__call__()。也许可以猜到了，没错，在django里urlmap需要有一个
对应的处理函数，__call__就是起这个处理函数的作用）。还有一个就是getResponse方法。它的作用是处理解码后的request，这是一
些很普通的方法调用，因为request已经AMF解码了，它会寻找合适的PRC方法（选择的依据就是AMF指定的方法名，也就是flex调用amf
url时的方法名）来处理request。我把这两个方法贴上来了。里面重点扯了一下__call__加深印象。</p>
<p>    def getResponse(self, http_request, request):<br />
"""<br />
Processes the AMF request, returning an AMF response.<br />
&nbsp;<br />
@param http_request: The underlying HTTP Request.<br />
[...]</p>
<p><br />
</p>
<p><br />
</p>
<div>以下示例使用的Django和PyAMF版本是从SVN下载的最新版本，版本号分别是:9084和1699。</div>
<div>Django的安装和配置可以从前面的文章找到，PyAMF的安装也是很简单：sudo python setup.py install。</div>
<div>首先在urls.py中增加一行：</div>
<div>(r^'gateway$', 'project.application.amfgateway.gw'),</div>
<div>在application的目录下创建afmgateway.py：</div>
<div>#coding=utf-8</div>
<div>from pyamf.remoting.gateway.django import DjangoGateway</div>
<div>import project.application.views as views</div>
<div><br />
</div>
<div>services = {</div>
<div>&nbsp;&nbsp; &nbsp;'echo' = views.echo,</div>
<div>}</div>
<div><br />
</div>
<div>gw = DjangoGateway(services)</div>
<div>在views.py文件增加如下函数:</div>
<div>def echo(request, data):</div>
<div>&nbsp;&nbsp; &nbsp;return data</div>
<div>在Flex里面连接的办法很普通：</div>
<div>var gateway : NetConnection = new NetConnection();</div>
<div>gateway.connect("http://yousite/gateway");</div>
<div>var resonder : Responder = new Responder(onResult, onFault);</div>
<div>gateway.call("echo", responder, "hello");</div>
<div><br />
</div>
<div>其实一切都很简单吧，我调试的时候却费了好多时间，只是在urls.py的映射中写成了</div>
r^'gateway/$'
<img src ="http://www.blogjava.net/sealyu/aggbug/268539.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2009-05-01 19:19 <a href="http://www.blogjava.net/sealyu/archive/2009/05/01/268539.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Flex Builder 3 下载安装与注册码(转)</title><link>http://www.blogjava.net/sealyu/archive/2009/04/30/268443.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Thu, 30 Apr 2009 15:18:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2009/04/30/268443.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/268443.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2009/04/30/268443.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/268443.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/268443.html</trackback:ping><description><![CDATA[<h2><font size="2">Flex Builder 3 正式版，发布于中国时间 2008 年 2 月 25 日；<br />
<br />
下载地址一：<br />
</font><a target="_blank" href="http://download.macromedia.com/pub/flex/flex_builder/FB3_win.exe"><font size="2">http://download.macromedia.com/pub/<span href="http://hi.baidu.com/%B2%DD%B2%DD%CE%C2%C5%AF%B5%C4%D0%A1%CE%D1/blog/item/e2146c44026ddf84b3b7dc4e.html/cmtid/tag.php?name=flex">flex</span>/<span href="http://hi.baidu.com/%B2%DD%B2%DD%CE%C2%C5%AF%B5%C4%D0%A1%CE%D1/blog/item/e2146c44026ddf84b3b7dc4e.html/cmtid/tag.php?name=flex">flex</span>_builder/FB3_win.exe</font></a><br />
<font size="2">大小： 424 MB ；未进行压缩的 Flex Builder 3 安装文件<br />
不用注册登录，可以直接下载。<br />
<br />
</font><a target="_blank" href="http://trials.adobe.com/Applications/Flex/FlexBuilder/3/FB3_WWEJ.exe"><font color="#800080" size="2">下载地址二：</font></a></h2>
<h2><a target="_blank" href="http://trials.adobe.com/Applications/.../FB3_WWEJ.exe"><font size="2">http://t<span href="http://hi.baidu.com/%B2%DD%B2%DD%CE%C2%C5%AF%B5%C4%D0%A1%CE%D1/blog/item/e2146c44026ddf84b3b7dc4e.html/cmtid/tag.php?name=ria">ria</span>ls.adobe.com/Applications/.../FB3_WWEJ.exe</font></a><a target="_blank" href="http://trials.adobe.com/Applications/Flex/FlexBuilder/3/FB3_WWEJ.exe"><br />
<font size="2">大小：　385.84 MB　；　已经压缩的 Flex Builder 3 安装文件<br />
需要注册登录，才可下载。</font></a></h2>
<p>Flex builder 3.0注册码（已经试过的，可用的）：</p>
<p>1377-4168-2018-0771-2432-1495</p>
<p>1377-4760-3354-0772-2773-8996</p>
<p>1377-4165-2080-7265-7813-8901</p>
<p>1377-4964-5021-8182-2399-8235</p>
<p>Flex builder 中要进行调试，就必须安装含debug的flash player版本。下载链接地址：</p>
<p><strong>Adobe Flash Player 9 — Debugger Versions (aka debug players or content debuggers) for Flex and Flash Developers</strong></p>
<p style="text-indent: 2em;"><strong>12/3/2007</strong> Updated
debugger versions of Flash Player 9 (aka debug players or content
debuggers) are available for Flex Builder 2 users and Flash CS3
Professional users. These new players are version 9.0.r115.</p>
<p style="text-indent: 2em;"><a href="http://download.macromedia.com/pub/flashplayer/updaters/9/flashplayer_9_ax_debug.exe"><font color="#1b8cba">Download the Windows Flash Player 9 ActiveX control content debugger (for IE)</font></a> (EXE, 1.59 MB)</p>
<p style="text-indent: 2em;"><a href="http://download.macromedia.com/pub/flashplayer/updaters/9/flashplayer_9_plugin_debug.exe"><font color="#1b8cba">Download the Windows Flash Player 9 Plugin content debugger (for Netscape-compatible browsers)</font></a> (EXE, 1.56 MB)</p>
<p style="text-indent: 2em;"><a href="http://download.macromedia.com/pub/flashplayer/updaters/9/sa_flashplayer_9_debug.exe"><font color="#1b8cba">Download the Windows Flash Player 9 Projector content debugger</font></a> (EXE, 3.69 MB)</p>
<p style="text-indent: 2em;"><a href="http://download.macromedia.com/pub/flashplayer/updaters/9/flashplayer_9_plugin_debug_ub.dmg"><font color="#1b8cba">Download the Macintosh Flash Player 9 Plugin content debugger (Intel-based Macs)</font></a> (DMG, 5.35 MB)</p>
<p style="text-indent: 2em;"><a href="http://download.macromedia.com/pub/flashplayer/updaters/9/flashplayer_9_plugin_debug.dmg"><font color="#1b8cba">Download the Macintosh Flash Player 9 Plugin content debugger (PowerPC-based Macs)</font></a> (DMG, 2.41 MB)</p>
<p style="text-indent: 2em;"><a href="http://download.macromedia.com/pub/flashplayer/updaters/9/sa_flashplayer_9_debug.app.zip"><font color="#1b8cba">Download the Macintosh Flash Player 9 Projector content debugger</font></a> (ZIP, 4.81 MB)</p>
<p style="text-indent: 2em;"><strong>12/3/2007</strong> Updated Linux
debugger versions (aka debug players or content debuggers) of Flash
Player 9 are now available. Additionally, the Linux standalone player
(projector) is available for developers who wish to publish projectors
on Linux operating systems.</p>
<p style="text-indent: 2em;"><a href="http://download.macromedia.com/pub/flashplayer/updaters/9/flash_player_9_linux_dev.tar.gz"><font color="#1b8cba">Download the Linux debugger and standalone players </font></a>(TAR.GZ, 9.29 MB)</p>
<img src ="http://www.blogjava.net/sealyu/aggbug/268443.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2009-04-30 23:18 <a href="http://www.blogjava.net/sealyu/archive/2009/04/30/268443.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Flex翻页效果</title><link>http://www.blogjava.net/sealyu/archive/2009/04/28/267831.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Tue, 28 Apr 2009 01:30:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2009/04/28/267831.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/267831.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2009/04/28/267831.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/267831.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/267831.html</trackback:ping><description><![CDATA[演示：<a href="http://demo.quietlyscheming.com/book/app.html"><font color="#334422">http://demo.quietlyscheming.com/book/app.html</font><img id="snap_com_shot_link_icon" class="snap_preview_icon" style="border: 0pt none ; margin: 0pt ! important; padding: 1px 0pt 0pt; max-height: 2000px; max-width: 2000px; min-width: 0px; min-height: 0px; font-style: normal; font-weight: normal; font-family: &quot;trebuchet ms&quot;,arial,helvetica,sans-serif; float: none; position: static; left: auto; top: auto; line-height: normal; background-image: url(http://i.ixnp.com/images/v3.78/theme/green/palette.gif); background-color: transparent; visibility: visible; width: 14px; height: 12px; background-position: -855px 0pt; background-repeat: no-repeat; text-decoration: none; vertical-align: top; display: inline;" src="http://i.ixnp.com/images/v3.78/t.gif"  alt="" /></a><br />
代码下载：<a href="http://demo.quietlyscheming.com/source/Book.zip"><font color="#334422">http://demo.quietlyscheming.com/source/Book.zip</font><img id="snap_com_shot_link_icon" class="snap_preview_icon" style="border: 0pt none ; margin: 0pt ! important; padding: 1px 0pt 0pt; max-height: 2000px; max-width: 2000px; min-width: 0px; min-height: 0px; font-style: normal; font-weight: normal; font-family: &quot;trebuchet ms&quot;,arial,helvetica,sans-serif; float: none; position: static; left: auto; top: auto; line-height: normal; background-image: url(http://i.ixnp.com/images/v3.78/theme/green/palette.gif); background-color: transparent; visibility: visible; width: 14px; height: 12px; background-position: -855px 0pt; background-repeat: no-repeat; text-decoration: none; vertical-align: top; display: inline;" src="http://i.ixnp.com/images/v3.78/t.gif"  alt="" /></a><br />
<img src ="http://www.blogjava.net/sealyu/aggbug/267831.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2009-04-28 09:30 <a href="http://www.blogjava.net/sealyu/archive/2009/04/28/267831.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Flex+PyAmf+Django+MySQL（转）</title><link>http://www.blogjava.net/sealyu/archive/2009/01/10/250804.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Sat, 10 Jan 2009 05:51:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2009/01/10/250804.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/250804.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2009/01/10/250804.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/250804.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/250804.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: v":* {behavior:url(#default#VML);}o":* {behavior:url(#default#VML);}w":* {behavior:url(#default#VML);}.shape {behavior:url(#default#VML);}Normal07.8 磅02falsefalsefalseMicro...&nbsp;&nbsp;<a href='http://www.blogjava.net/sealyu/archive/2009/01/10/250804.html'>阅读全文</a><img src ="http://www.blogjava.net/sealyu/aggbug/250804.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2009-01-10 13:51 <a href="http://www.blogjava.net/sealyu/archive/2009/01/10/250804.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Trying on clothes in 3D: We have a long way to go.</title><link>http://www.blogjava.net/sealyu/archive/2008/12/24/248052.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Wed, 24 Dec 2008 05:36:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/12/24/248052.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/248052.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/12/24/248052.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/248052.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/248052.html</trackback:ping><description><![CDATA[<p>By Joshua Koopferstock &amp; Christian Laforte</p>
<p>For you technology lovers who are still kids at heart, Disneyland has recently opened up the <a href="http://www.disneylandevent.com/tsm/27-dreamhome.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.disneylandevent.com');">Innoventions Dream Home</a>,
showcasing cool high tech integration in a futuristic home. What caught
my attention was one invention called the Magic Mirror. Getting its
name from the mirror in Snow White, this Magic Mirror does not tell you
&#8220;who is the fairest of them all&#8221; (for that you&#8217;ll still need <a href="http://www.hotornot.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.hotornot.com');">HotOrNot.com</a>).
What it does do is allow you to virtually try on clothes in your
wardrobe. In fact, the Magic Mirror is not a mirror at all; it is a
large display monitor with a video camera next to it.</p>
<p style="text-align: center;"><em><img src="http://www.cepro.com/images/slideshow/MagicMirror3.jpg" alt="Magic Mirror" width="432" height="340" /></em></p>
<p style="text-align: center;"><em>Trying on a dress in the Magic Mirror. Photo: <a href="http://www.cepro.com/slideshow/image/2951/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.cepro.com');">cepro.com</a></em></p>
<p>While the concept is neat and would probably be even more useful in
the department store dressing room than the bedroom, by the looks of it
in the video below,
the concept is still far from the realism necessary for a technology
like this to take off. A few years back, it was thought that by today,
virtual clothes shopping would be mainstream, and companies like <a href="http://www.mvm.com/en/index.php" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.mvm.com');">My Virtual Model</a> had signed contracts with major apparel retailers to integrate their technology into online stores.</p>
<p>It turns out that the technology wasn&#8217;t ready, and by the looks of this Magic Mirror, it still has a long way to go.</p>
<p align="center"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" width="425" height="344"><embed type="application/x-shockwave-flash" src="http://www.youtube.com/v/tu3N1N7Y6lg&amp;hl=en&amp;fs=1" allowfullscreen="true" width="425" height="344"></object></p>
<p><strong>Here&#8217;s how I think they do it:</strong></p>
<p>The dress moves roughly according to the orientation of the head, so
they are most likely using a simple real-time head tracker and applying
the pose of the head to the top of the dress. The bottom seems to be
animated randomly, or maybe through <a href="http://en.wikipedia.org/wiki/Secondary_animation" onclick="javascript:pageTracker._trackPageview('/outbound/article/en.wikipedia.org');">secondary animation</a>.</p>
<p>Later this week I&#8217;ll post on a face tracking algorithm that could make this easily possible.</p>
<p><strong>How could we do it better?</strong></p>
<p>One imperfection is very noticeable: the dress doesn&#8217;t follow the
shoulders and hips properly. Part of it may be anatomical (this is a
guy after all), but I think this problem should be easily solved by
tracking the silhouette (using background subtraction) and identifying
the shoulders and hips using simple heuristics, e.g. areas of low
curvature and roughly horizontal or vertical slopes. This would
immediately improve the realism of this solution.</p>
<p>Another improvement would be to track features on the user&#8217;s
T-shirt, so we can have a better estimate of the body pose, its size
and maybe even the person&#8217;s sex. I&#8217;d start my search with <a href="http://movement.stanford.edu/automatic-nr-modeling/" onclick="javascript:pageTracker._trackPageview('/outbound/article/movement.stanford.edu');"><em>Automatic Non-Rigid 3D Modeling from Video</em></a>
(Torresani and Hertzmann, 2004), since I remember being impressed with
the results way back then: it handles occlusions and variations in
illumination very nicely. In the picture below, you can see one of the
researchers moving his hands in front of his T-shirt&#8230; the algorithm can
still capture a 3D representation of the deforming T-shirt. Doing this
in real-time may be challenging, but fast GPUs and multi-core systems
should make it possible.</p>
<p><img src="http://movement.stanford.edu/automatic-nr-modeling/robust_hrishi.jpg" alt="" /></p>
<p><strong>Still a Long Way to Go</strong></p>
<p>With the method that we have suggested, there is one major sticking
point that we have not addressed: content creation.&nbsp; Assuming you have
the ability to accurately track a person and render the image in real
time, you still need a way to create the clothes in 3D.&nbsp; This is not a
simple task, as clothes can be highly variable in elasticity,
reflectiveness, etc., which would make automation of the modeling
process complex.</p>
<p>Before we see these Magic Mirrors in department stores like Sears or
Macy&#8217;s that have hundreds of thousands of different apparel items each
year, a method for automatic creation of clothing content will have to
be developed.&nbsp; And while automatic 3D content creation is going to take
great strides in the next couple of years, the quality of 3D
reconstruction needed for clothing is still a long way off.</p>
<p>
<script type="text/javascript">digg_url = 'http://www.enlighten3d.com/?p=98';</script>
<iframe src="http://digg.com/tools/diggthis.php?u=http%3A//www.enlighten3d.com/%3Fp%3D98&amp;t=Trying%20on%20clothes%20in%203D%3A%20We%20have%20a%20long%20way%20to%20go.%20%7C%20ENLIGHTEN3D" scrolling="no" width="52" frameborder="0" height="80"><br />
</iframe><br />
</p>
<img src ="http://www.blogjava.net/sealyu/aggbug/248052.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-12-24 13:36 <a href="http://www.blogjava.net/sealyu/archive/2008/12/24/248052.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pv3d新版本的渲染层机制（转）</title><link>http://www.blogjava.net/sealyu/archive/2008/12/06/244819.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Sat, 06 Dec 2008 15:39:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/12/06/244819.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/244819.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/12/06/244819.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/244819.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/244819.html</trackback:ping><description><![CDATA[<p><span style="color: #0099cc;"><a>http://kevincao.com/2008/11/05/experiment02-earth-fire/</a><br />
主要演示了pv3d新版本的渲染层机制的一些知识点，和BitmapEffectLayer。以下是主要代码：</span></p>
<p><span style="color: #0099cc;">public</span> <span style="font-weight: bold; color: #0099cc;">function</span> init3D<span style="color: #b1b100;">(</span><span style="color: #b1b100;">)</span> : <span style="color: #0099cc;">void</span> <span style="color: #b1b100;">{</span><br />
<span style="color: #0099cc;">camera</span>.<span style="color: #ff9999;">fov</span> = <span style="color: #cc3366;">55</span>;</p>
<p><span style="color: #666666;">//设置一个空物体作为两个球体的父对象</span><br />
dummy = <span style="font-weight: bold; color: #0099cc;">new</span> DisplayObject3D<span style="color: #b1b100;">(</span><span style="color: #b1b100;">)</span>;</p>
<p><span style="color: #666666;">//添加灯</span><br />
light = <span style="font-weight: bold; color: #0099cc;">new</span> PointLight3D<span style="color: #b1b100;">(</span><span style="color: #b1b100;">)</span>;<br />
scene.<span style="color: #ff9999;">addChild</span><span style="color: #b1b100;">(</span>light<span style="color: #b1b100;">)</span>;</p>
<p><span style="color: #666666;">//添加一个噪波作为贴图</span><br />
<span style="font-weight: bold; color: #0099cc;">var</span> bitmap : BitmapData = <span style="font-weight: bold; color: #0099cc;">new</span> BitmapData<span style="color: #b1b100;">(</span><span style="color: #cc3366;">256</span>, <span style="color: #cc3366;">256</span>, <span style="font-weight: bold; color: #0099cc;">false</span>, <span style="color: #cc3366;">0</span><span style="color: #b1b100;">)</span>;<br />
bitmap.<span style="color: #ff9999;">perlinNoise</span><span style="color: #b1b100;">(</span><span style="color: #cc3366;">64</span>, <span style="color: #cc3366;">64</span>, <span style="color: #cc3366;">2</span>, <span style="color: #0099cc;">Math</span>.<span style="color: #0099cc;">random</span><span style="color: #b1b100;">(</span><span style="color: #b1b100;">)</span> * <span style="color: #cc3366;">3000</span>, <span style="font-weight: bold; color: #0099cc;">false</span>, <span style="font-weight: bold; color: #0099cc;">false</span>, <span style="color: #cc3366;">7</span>, <span style="font-weight: bold; color: #0099cc;">true</span><span style="color: #b1b100;">)</span>;</p>
<p><span style="color: #666666;">//环境贴图需要一个光源</span><br />
<span style="font-weight: bold; color: #0099cc;">var</span> mat : EnvMapMaterial = <span style="font-weight: bold; color: #0099cc;">new</span> EnvMapMaterial<span style="color: #b1b100;">(</span>light, bitmap<span style="color: #b1b100;">)</span>;</p>
<p><span style="font-weight: bold; color: #0099cc;">var</span> s1 : Sphere = <span style="font-weight: bold; color: #0099cc;">new</span> Sphere<span style="color: #b1b100;">(</span>mat, <span style="color: #cc3366;">80</span>, <span style="color: #cc3366;">8</span>, <span style="color: #cc3366;">8</span><span style="color: #b1b100;">)</span>;<br />
s1.<span style="color: #ff9999;">x</span> = <span style="color: #cc3366;">300</span>;<br />
s1.<span style="color: #ff9999;">z</span> = <span style="color: #cc3366;">-100</span>;</p>
<p><span style="color: #666666;">//使用地球图片做纹理贴图</span><br />
<span style="font-weight: bold; color: #0099cc;">var</span> s2 : Sphere = <span style="font-weight: bold; color: #0099cc;">new</span> Sphere<span style="color: #b1b100;">(</span><span style="font-weight: bold; color: #0099cc;">new</span> BitmapMaterial<span style="color: #b1b100;">(</span>image.<span style="color: #ff9999;">bitmapData</span><span style="color: #b1b100;">)</span>, <span style="color: #cc3366;">120</span>, <span style="color: #cc3366;">12</span>, <span style="color: #cc3366;">12</span><span style="color: #b1b100;">)</span>;<br />
s2.<span style="color: #ff9999;">x</span> = <span style="color: #cc3366;">-400</span>;<br />
s2.<span style="color: #ff9999;">z</span> = <span style="color: #cc3366;">100</span>;</p>
<p><span style="color: #666666;">//把球体添加到空物体中</span><br />
dummy.<span style="color: #ff9999;">addChild</span><span style="color: #b1b100;">(</span>s1<span style="color: #b1b100;">)</span>;<br />
dummy.<span style="color: #ff9999;">addChild</span><span style="color: #b1b100;">(</span>s2<span style="color: #b1b100;">)</span>;</p>
<p>scene.<span style="color: #ff9999;">addChild</span><span style="color: #b1b100;">(</span>dummy<span style="color: #b1b100;">)</span>;</p>
<p><span style="color: #666666;">//DisplayObject3D(简称do3d)的层次结构和渲染对应的结构是分开的，接下来设置渲染的层次结构</span><br />
<span style="color: #666666;">//默认情况下do3d渲染到viewport.containerSprite中</span><br />
<span style="color: #666666;">//containerSprite是一个ViewportBaseLayer对象，继承自ViewportLayer，也是一个Sprite</span></p>
<p><span style="color: #666666;">//BitmapEffectLayer原先是Effect分支里的功能，现在整合到Great White里面来了</span><br />
<span style="color: #666666;">//把do3d渲染到BitmapEffectLayer可以添加一些Bitmap滤镜效果</span><br />
<span style="font-weight: bold; color: #0099cc;">var</span> bfx : BitmapEffectLayer = <span style="font-weight: bold; color: #0099cc;">new</span> BitmapEffectLayer<span style="color: #b1b100;">(</span>viewport, <span style="color: #cc3366;">500</span>, <span style="color: #cc3366;">500</span><span style="color: #b1b100;">)</span>;<br />
<span style="color: #666666;">//ViewportLayer对象必须用addLayer语句添加到containerSprite</span><br />
viewport.<span style="color: #ff9999;">containerSprite</span>.<span style="color: #ff9999;">addLayer</span><span style="color: #b1b100;">(</span>bfx<span style="color: #b1b100;">)</span>;</p>
<p><span style="color: #666666;">//把球体加进bfx层，记住do3d的层次结构和渲染对应的图层结构是分开的</span><br />
<span style="color: #666666;">//所以我们不能直接把dummy加进bfx层，这样dummy的子对象是不被一同加入的</span><br />
bfx.<span style="color: #ff9999;">addDisplayObject3D</span><span style="color: #b1b100;">(</span>s1<span style="color: #b1b100;">)</span>;<br />
bfx.<span style="color: #ff9999;">addDisplayObject3D</span><span style="color: #b1b100;">(</span>s2<span style="color: #b1b100;">)</span>;</p>
<p><span style="color: #666666;">//火焰效果很简单，添加一个效果对象就可以了</span><br />
bfx.<span style="color: #ff9999;">addEffect</span><span style="color: #b1b100;">(</span><span style="font-weight: bold; color: #0099cc;">new</span> BitmapFireEffect<span style="color: #b1b100;">(</span><span style="color: #cc3366;">1</span>, <span style="color: #cc3366;">1</span>, <span style="color: #cc3366;">1</span>, <span style="color: #cc3366;">1</span><span style="color: #b1b100;">)</span><span style="color: #b1b100;">)</span>;</p>
<p><span style="color: #666666;">//effects数组可以索引属于图层的效果对象</span><br />
bfx.<span style="color: #ff9999;">effects</span><span style="color: #b1b100;">[</span><span style="color: #cc3366;">0</span><span style="color: #b1b100;">]</span>.<span style="color: #ff9999;">flameHeight</span> = <span style="color: #cc3366;">1</span>;</p>
<p><span style="color: #666666;">//设置bitmap每帧的移动量</span><br />
bfx.<span style="color: #ff9999;">setScroll</span><span style="color: #b1b100;">(</span><span style="color: #cc3366;">4</span>, <span style="color: #cc3366;">3</span><span style="color: #b1b100;">)</span>;</p>
<p><span style="color: #666666;">//出于CPU占用考虑，一般不会用很大的位图来生成效果。一种可用的做法是只把效果渲染到一块较小的区域内</span><br />
<span style="color: #666666;">//BitmapEffectLayer.setTracking(do3d)用于让图层跟随某个do3d在屏幕上的位置移动</span><br />
<span style="color: #666666;">//但先要允许do3d自动计算自身的屏幕坐标。例如：</span><br />
<span style="color: #666666;">//s1.autoCalcScreenCoords = true;</span><br />
<span style="color: #666666;">//bfx.setTracking(s1);</span></p>
<p><span style="color: #666666;">//添加遮罩层</span><br />
<span style="font-weight: bold; color: #0099cc;">var</span> msk : Sprite = <span style="font-weight: bold; color: #0099cc;">new</span> Sprite<span style="color: #b1b100;">(</span><span style="color: #b1b100;">)</span>;<br />
msk.<span style="color: #ff9999;">graphics</span>.<span style="color: #0099cc;">beginFill</span><span style="color: #b1b100;">(</span>0xFF0000<span style="color: #b1b100;">)</span>;<br />
msk.<span style="color: #ff9999;">graphics</span>.<span style="color: #ff9999;">drawCircle</span><span style="color: #b1b100;">(</span><span style="color: #cc3366;">0</span>, <span style="color: #cc3366;">0</span>, <span style="color: #cc3366;">250</span><span style="color: #b1b100;">)</span>;<br />
msk.<span style="color: #ff9999;">graphics</span>.<span style="color: #0099cc;">endFill</span><span style="color: #b1b100;">(</span><span style="color: #b1b100;">)</span>;<br />
<span style="color: #666666;">//containerSprite既然继承自Sprite，那么自然可以用addChild来新增图层</span><br />
viewport.<span style="color: #ff9999;">containerSprite</span>.<span style="color: #ff9999;">addChild</span><span style="color: #b1b100;">(</span>msk<span style="color: #b1b100;">)</span>;</p>
<p><span style="color: #666666;">//现在在containerSprite下面有两个图层，我们可以设置遮罩</span><br />
bfx.<span style="color: #ff9999;">mask</span> = msk;</p>
<p><span style="color: #666666;">//添加外边框作为修饰</span><br />
<span style="font-weight: bold; color: #0099cc;">var</span> frame : Sprite = <span style="font-weight: bold; color: #0099cc;">new</span> Sprite<span style="color: #b1b100;">(</span><span style="color: #b1b100;">)</span>;<br />
frame.<span style="color: #ff9999;">graphics</span>.<span style="color: #0099cc;">lineStyle</span><span style="color: #b1b100;">(</span><span style="color: #cc3366;">10</span>, 0&#215;222222<span style="color: #b1b100;">)</span>;<br />
frame.<span style="color: #ff9999;">graphics</span>.<span style="color: #ff9999;">drawCircle</span><span style="color: #b1b100;">(</span><span style="color: #cc3366;">0</span>, <span style="color: #cc3366;">0</span>, <span style="color: #cc3366;">250</span><span style="color: #b1b100;">)</span>;<br />
viewport.<span style="color: #ff9999;">containerSprite</span>.<span style="color: #ff9999;">addChild</span><span style="color: #b1b100;">(</span>frame<span style="color: #b1b100;">)</span>;</p>
<p>addEventListener<span style="color: #b1b100;">(</span>Event.<span style="color: #ff9999;">ENTER_FRAME</span>, tick<span style="color: #b1b100;">)</span>;<br />
<span style="color: #b1b100;">}</span></p>
<h3>相关文章</h3>
<ul>
    <li><a href="http://www.hcxmflash.cn/blog/?p=362" title="Papervision3d Tutorials in Flex 3">Papervision3d Tutorials in Flex 3</a></li>
    <li><a href="http://www.hcxmflash.cn/blog/?p=360" title="Papervision3D入门教程">Papervision3D入门教程</a></li>
</ul>
<img src ="http://www.blogjava.net/sealyu/aggbug/244819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-12-06 23:39 <a href="http://www.blogjava.net/sealyu/archive/2008/12/06/244819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>3D管线教程 (一)  （转）</title><link>http://www.blogjava.net/sealyu/archive/2008/12/05/244645.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Fri, 05 Dec 2008 10:07:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/12/05/244645.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/244645.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/12/05/244645.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/244645.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/244645.html</trackback:ping><description><![CDATA[<p>原文：<a href="http://www.extremetech.com/article2/0,1558,9722,00.asp">ExtremeTech 3D
Pipeline Tutoria</a></p>
<p>June 13, 2001 - By <a href="http://www.extremetech.com/author_bio/0,1728,a%253D234,00.asp">Dave
Salvator</a></p>
<p>转载请注明<a href="http://www.cnblogs.com/firewood/articles/3d_pipeline_tutorial_part1.html">出处</a>。</p>
<p><strong><span style="font-size: medium;">介绍</span></strong></p>
<p>从令人着迷的电影特效，到医学成像、电子游戏和更多的领域，3D图形所带来的冲击不亚于一场革命。这项从五年前（1996年）开始，带来了个人电脑消费风暴的技术，根源于学术界和军事。其实从某种程度上来说，我们今天在个人电脑上所享受的3D图形算是一种&#8220;和平红利&#8221;，许多最初设计军事模拟器的专家如今在从事3D图形芯片，电影和游戏开发产业的工作。</p>
<p>除娱乐之外，3D图形技术在计算机辅助设计（CAD）上为工业设计带来了巨大的飞跃。制造商不但可以不使用任何材料设计并&#8220;构造&#8221;出他们的产品，还可以通过连接拥有电脑辅助建造（CAM）系统的制造机械来使用这些3D模型。但对我们大多数人来说，3D图形技术给娱乐产业带来的冲击最大，包括电影和游戏，正因为如此，我们许多人都对3D图形相关的技术和术语有所了解。</p>
<p>记住不是所有的渲染系统都有着相同的目标。对于离线渲染系统，像CAD程序中所使用的，精确度比帧速要重要得多。例如，这种模型有可能用来制造飞机部件。实时渲染器，像游戏引擎和模拟器，趋向于强调固定的帧速来得到平滑流畅的动画效果，为了这一目的宁愿牺牲掉图形和纹理的细节。</p>
<p>有些渲染器是混合型的，比如电影《玩具总动员》所使用的。艺术家和程序员们使用Pixar的Renderman技术来创造眩目的视觉场景，但动画的每一帧在服务器场——一个计算机集群，渲染工作可以在其中分布式进行——上要耗费数小时进行渲染。这些离线渲染的帧之后被排成标准电影的每秒24帧的序列，来制作电影的最终剪辑。</p>
<p>随着急速增长的对3D芯片渲染能力的需求，&#8220;消费级3D&#8221;和&#8220;工作站级3D&#8221;之间的界线已经非常模糊了。然而，实时游戏引擎仍然做了许多折衷来保持帧速，一些甚至设计了&#8220;油门&#8221;来控制当帧速降低到规定的水平之下时自动打开和关闭某些特性。相比之下，工作站级3D需要一些当今游戏不需要的高级特性。</p>
<p>3D图形领域广大而复杂。我们的目标是写出一系列相当技术性的，但通俗易懂的，有关3D图形技术的文章。我们从用来创建3D图形的，被称作3D管线的多步处理流程开始。我们会遍历整个3D管线，从场景中一个三角形开始，到最终一个像素被画出。我们会提到一些与渲染3D场景相关的数学，尽管对3D算法只是做简单的介绍（如果你想深入学习，在本文最后我们列出了相当数量的参考）。</p>
<p><strong><span style="font-size: medium;">在管线中，准备就绪</span></strong></p>
<p>因为3D图形渲染本身的有序特性，因为有如此多的计算要做，大量的数据要处理，整个处理过程被拆分成不同的步骤，有时被称作阶段（Stage）。这些阶段被依次送入前面提到的3D图形管线中。</p>
<p>创建场景所需的巨大工作量使得3D渲染系统的设计者们（包括硬件和软件）寻找一切可能的方法来去除不必要的工作。有设计师这么讽刺过，&#8220;3D图形学是欺骗而不被抓住的艺术&#8221;解释一下，这句话的意思是说，3D图形学中的一种艺术形式就是优雅地通过降低场景中的显示细节来获得更好的性能，但却不让观察者注意到显示质量上的损失。处理器和内存带宽是宝贵的资源，因此设计师为节约它们所做的任何努力都会对性能非常有利。一个重要的例子就是拣选，它用来告诉渲染器，&#8220;如果观察摄像机（观察者的眼睛）看不到它，别自找麻烦去处理它，只操心摄像机能看到的东西吧。&#8221;</p>
<p>伴随着相关处理步骤的数量和复杂度，这些阶段（Stage）在管线中的次序可以在执行时改变。之后我们很快会更加详细地检阅这些阶段中所做的操作，概括地说，一个常规的3D管线顺序拆分为四个片段：应用/场景，几何图元，三角形设置和光栅化/渲染。虽然下面的片段草图可能看起来比较吓人，当你读完这篇文章时，你会成为极少数真正理解3D图形工作原理的人中的一员，我们认为你将会想要理解得更加深入。</p>
<p style="text-align: center;"><img alt="" src="http://pic002.cnblogs.com/img/firewood/200809/2008090916144719.png" /></p>
<p><strong>操作在哪里完成</strong></p>
<p>3D世界的大多数高层次方面操作由管线中应用阶段部分（有争论认为它技术上不属于3D管线的一部分）的应用软件负责管理，余下的三个主要阶段通常由一套应用程序接口（API）负责管理，例如SGI的OpenGL，微软的Direct3D，或Pixar的Renderman。API通过调用图形驱动程序和硬件来在硬件中执行绝大多数的图形操作。</p>
<p>图形API实际上是为应用提供了硬件抽象，反过来说，为应用提供了真正的设备无关性。因而，这些API通常被称作硬件抽象层（HALs）。它们的设计目标非常简明——应用开发者一旦为某个API写出了程序，这个程序就可以（而且应该）运行在任何支持这个API的硬件上。相反的，硬件制造者为这些API编写驱动程序，这样为这些API写的应用就可以在它们的硬件上运行了（图1）。说明一下，添加&#8220;应该&#8221;这个词是因为有些时候因为兼容性问题会导致API的不正确使用（被称作违规），这会导致应用依赖于某个特定的硬件特性，或者导致在某个硬件驱动下API特性被错误地执行，最终产生了错误的或不可预知的结果。</p>
<p style="text-align: center;"><img alt="" src="http://pic002.cnblogs.com/img/firewood/200809/2008090915531768.gif" /></p>
<p><strong><span style="font-size: medium;">空间入侵者</span></strong></p>
<p>深入管线细节之前，我们首先要从高层了解3D物体和3D世界是如何定义，物体如何被定义，放置，定位，如何在更大的3D空间内，或者就在它们自己的边界内进行控制。在一个3D渲染系统中，多个笛卡尔坐标系（x－（左/右），y－（上/下），z－（远/近））被应用在管线的不同阶段。被运用在互相关联但各不相同的目的的同时，每个坐标系都提供了精确的数学方法来在空间中定位和描述物体。毫无意外的，每个这样的坐标系都被称作&#8220;空间&#8221;。</p>
<p style="text-align: center;"><img alt="" src="http://pic002.cnblogs.com/img/firewood/200809/2008090915571045.gif" /></p>
<p>3D场景中的物体和场景本身在经过3D管线时被连续地进行转换或者变换，一共要通过五个空间。下面是这些空间的简单概述：</p>
<p><strong><span>模型空间（<span>Model
Space）</span>：</span></strong>模型在它们自己的坐标系中，原点是模型上的某个点，比如在一个英式足球运动员模型的右脚上。而且，模型有一个控制点或者&#8220;把手&#8221;。用来移动模型，3D渲染器只需要移动控制点，因为模型空间中模型的坐标与它的控制点保持固定的关联关系。此外，同样的&#8220;把手&#8221;也可以用来旋转物体。</p>
<p><strong><span>世界空间（<span>World
Space）</span>：</span></strong>在这里模型被放置在实际的3D世界中，使用一个统一的世界坐标系。事实上许多3D程序跳过了世界空间而直接转到了裁剪空间或视图空间。OpenGL中并不真正有世界空间这个概念。</p>
<p><strong>视图空间（View Space - 也被称作摄像机空间 Camera Space）：</strong>这个空间中，当前观察摄像机被程序定位在3D世界坐标的某个点上（通过图形API）。世界坐标系被执行变换（使用矩阵数学，我们稍后会探讨），从而使摄像机（你的眼睛）处在坐标系的原点，沿着z轴朝向场景。如果世界空间的变换被跳过了，场景就被直接变换到视图空间，摄像机同样被放在原点沿着z轴方向。沿着z轴远离摄像机深入场景时z坐标的值是增加还是减少由程序员决定的，但我们现假设你沿着z轴看过去的坐标是增加的。注意拣选，背面剔除和光照操作是在视图空间进行的。</p>
<p>视图体实际上由投影（Projection）来创建的，就像名字所暗示的那样，&#8220;投影场景&#8221;到摄像机的前面。从这个意义上来说，这是种角色倒转，摄像机现在变成了放映机，场景的视图体通过关联摄像机进行定义。把摄像机想象成某种全息放映机，但它不是把3D图像放映到空气中，而是把场景投影&#8220;进&#8221;你的显示器。这个视图体的形状可以是矩形（称作平行投影）也可以是棱锥形（称作透视投影），后者被称作平截视图体（View Frustum）（通常也叫做视图体（Frustum），虽然视图体这个名字更常用）。</p>
<p>视图体定义了摄像机可以看到的部分，同样重要的是，它也定义了摄像机看不到的部分，这样一来，许多物体模型和世界的某些部分都可以被丢弃，以节约3D芯片的运算周期和内存带宽。</p>
<p>视图体看起来像是个顶部被切掉的棱锥。棱锥的顶部紧贴摄像机的视点并向外发散。视图体的顶部被称作近（前）截面，另一面被称作远（后）截面。整个被渲染的3D场景必须处在近截面和远截面之间，同时被视图体的侧面和顶部限制。如果模型中的三角形（或者世界的一部分）超出了视图体，它们就不会被处理。同样的，如果一个三角形有一部分在视图体里面一部分在外面，超出的部分会被视图体截掉，因此这里才会使用&#8220;裁剪&#8221;（Clipping）这个术语。尽管视图空间中的视图体有裁剪面，裁剪的实际操作是在视图体变换到裁剪空间时执行的。&nbsp;</p>
<p><strong><span style="font-size: medium;">深入空间</span></strong></p>
<p><strong><span>裁剪空间（Clip
Space）：</span></strong>与视图空间相似，但是视图体被&#8220;压扁&#8221;成了一个单位立方体，x和y坐标被规格化到了－1到1之间，z坐标在0到1之间，这可以简化裁剪计算。&#8220;透视分割&#8221;执行规格化操作，通过用一个特殊的&#8220;w&#8221;值除所有的x，y和z顶点坐标，这个值就是我们后面将会详细说明的缩放因子。透视分割使近处的物体变大，远处的物体变小，跟你所期望看到的真实场景一样。</p>
<p><strong>屏幕空间（Screen Space）：</strong>在这里3D图像被转换为x和y的二维屏幕坐标来做二维显示。注意z和w坐标依然被图形系统保留，用于最终渲染之前的深度/Z缓存（参见下面的Z缓存一节）和背面剔除中。注意场景到像素的转换，也就是光栅化的操作，还没有开始。</p>
<p>因为这些不同空间之间的变换绝大多数实质上都是改变参照系，很容易混淆。3D管线容易把人搞晕的一部分原因就是没有一个&#8220;确定的&#8221;路线来执行所有这些操作，因为研究人员和程序员们各自发现了一些有用的技巧和优化方法，而且通常都会有多个方法可以解决一个给定的3D/数学问题。但是，通常空间变换的处理步骤都按照我们前面介绍的顺序来进行。</p>
<p>要对这些不同空间之间如何相互影响有个概念，考虑一下下面这个例子：</p>
<p>拿几块乐高玩具，把它们拼在一起做个模型。想象一下把单独的块认作物体的边缘，块与块的连接部分看作顶点（虽然乐高建筑并不使用3D模型常用的三角形图元，但我们的例子用四边形也很合适）。把这个物体放在你面前，模型空间的原点坐标应该是左下方离你最近的那个角，模型的所有坐标都由这个点来衡量。原点实际上可以是模型的任意一部分，但左下方最近的角是最常用的。当你在房间里（3D世界空间或者视图空间，由3D系统决定）移动这个物体，块与块之间的相对位置是固定不变的（模型空间），虽然它们相对房间的坐标在变化（世界空间或视图空间）。</p>
<p><span style="font-size: medium;"><strong>3D</strong><strong>管线数据流</strong></span></p>
<p>某种意义上来说，3D芯片就是物理具体化的3D管线，数据在这里从一个阶段（Stage）&#8220;顺流&#8221;到另一个阶段。有一处需要注意，管线中的大多数应用/场景阶段和早期的图元阶段的操作是对每顶点进行的，然而拣选和裁剪是对每三角形进行的，渲染操作是对每像素进行的。为提高性能，管线中不同阶段的计算可以重叠。例如，顶点和像素操作在Direct3D和OpenGL中都相互独立，所以可以做到一个三角形在图元阶段时，另一个在光栅化阶段。而且，图元阶段对两个或多个顶点的计算和光栅化阶段对两个或多个顶点的计算（来自相同的三角形）可以同时执行。</p>
<p>管线的另一个优势是，因为在图元阶段不会有数据在顶点间传递，渲染阶段像素间也没有数据传递，芯片制造者可以实现多个像素管线，通过并行处理这些独立实体来获得可观的性能提升。还有需要注意的一处是实时渲染中管线的使用，尽管有许多好处，也不是没有缺点。举个例子，一旦一个三角形被送入管线，程序员几乎就跟它挥手道别了。要获取管线中顶点的状态或者颜色/透明度信息要付出非常高的性能代价，还可能导致管道阻塞，这是绝对不该做的事。&nbsp;</p>
<p><strong>管线阶段——深入探讨</strong></p>
<p><strong><span style="text-decoration: underline;"><span>1.
</span></span></strong><strong><span style="text-decoration: underline;">应用/场景</span></strong></p>
<p style="text-align: center;"><img alt="" src="http://pic002.cnblogs.com/img/firewood/200809/2008090916152664.png" /></p>
<p>3D应用程序自身可以认作是3D管线的开始，尽管它并不真的是图形子系统的一部分，但却是由它来启动图形生成处理以生成最终的场景或者动画帧。应用程序还设置观察摄像机的位置，也就是你在3D世界中的&#8220;眼睛&#8221;。物体，包括动的和不动的首先在应用程序中以几何图元或者基本的构造块来描述。其中三角形是最常用的图元。它们简单易用因为三个顶点恰好描述一个平面，但四个或更多顶点的多边形不一定位于同一个平面上。更复杂的系统支持被称作高次表面，它们是不同类型的曲面图元，这些我们很快会讲到。</p>
<p>3D<span>世界和其中的物体是在程序中创建的，像<span>3D Studio
Max</span>，Maya，<span>AutoDesk 3D
Studio</span>，Lightwave和Softimage我们仅举这几个例子。3D艺术家们通过这些程序不但可以创建模型，还可以让它们动起来。模型首先用大量的三角形构建，然后进行着色和贴纹理。接下来，依赖于渲染引擎的约束——离线的或者实时的——艺术家可以降低这些高精度模型的三角形数量来适合给定的性能限制。</span></p>
<p>应用程序控制物体从一帧移动到另一帧，无论是离线渲染器还是游戏引擎。应用程序遍历几何数据库收集必要的物体信息（几何数据库包含了构成物体的所有几何图元），移动所有下一帧动画中要变化的物体。以一个游戏引擎为例，渲染器不会完成所有的工作。游戏引擎同样必须处理AI（人工智能），碰撞检测和物理特性，声音，以及网络（如果游戏在网络多人模式下进行）。</p>
<p>所有的模型都有一个默认的&#8220;姿势&#8221;，比如人物模型，默认姿势是所谓的&#8220;达芬奇姿势&#8221;，因为这个姿势很像达芬奇著名的&#8220;维特鲁威人&#8221;。一旦应用程序指定了模型的新&#8220;姿势&#8221;，模型就准备好了下一步处理。</p>
<p><img style="margin: 10px; float: left;" alt="维特鲁威人" src="http://pic002.cnblogs.com/img/firewood/200809/2008090916553728.jpg" />一些应用程序会在这里执行一个操作，叫做&#8220;遮挡剔除&#8221;，可见测试测定物体是部分还是全部被它前方的其他物体遮挡（盖住）。如果被挡住了，被挡住的物体，或者物体被挡住的部分会被丢弃。节省下的计算代价值得考虑，否则这些计算要在管线中执行，尤其是有着复杂深度的场景，也就是处在场景后面的物体有多&#8220;层&#8221;物体在它们前面，在观察摄像机前挡住了它们。</p>
<p>如果这些被遮挡的物体可以提早被剔除，它们就不必在管道中继续前进，这就节省了不必要的光照、着色和纹理计算。例如，在一个你跟哥斯拉对抗的游戏中，那个大家伙藏在你正走向的一幢大楼后面，你看不到他（卑鄙的家伙）。这时游戏引擎不必绘制哥斯拉的模型，因为大楼的模型挡在了他的前面，这就可以节约下硬件在这一帧动画中渲染哥斯拉模型的消耗。</p>
<p>一个更重要的步骤是对每个物体的一个简单的可见检查。这可以通过检查对象是否在视图体中（全部或者部分）来完成。一些引擎还尝试测量视图体中的一个物体是否完全被另一个物体挡住了。这些操作典型地使用简单的概念如入口（<span>Portal）和可见集（<span>Visibility
Sets</span>）来完成，特别是室内场景。这是在3D游戏引擎中实现的两种简单的技术，使引擎不必再绘制3D世界在摄像机中看不到的部分。<span>[Eberly, p.
413]</span>最初Quake中使用的是称作潜在可视集（PVS）的技术，它把世界划分为小块。本质上就是，如果玩家处在世界的一个特定部分，看不到其他区域时，游戏引擎就不必处理其他部分的数据。</span></p>
<p><span>另一个程序员们喜欢的降低工作量的技巧是使用绑定盒（<span>Bounding
Box</span>）。例如你有个10000个三角面的杀手兔模型，与其测试模型的每个三角形，程序员可以把模型用一个绑定盒包住，绑定盒由12个三角形组成（六面体的每个面两个三角形）。然后就可以测试剔除条件（基于绑定盒的顶点而不是兔子模型的顶点）来确定杀手兔在场景中是否可见。在你通过指定杀手兔模型中的共享顶点（相邻三角形可以共享的顶点，我们后面会详细探究的一个概念）来进一步减少顶点数之前，针对于这个测试你已经把总顶点数从30000（杀手兔模型）个减少到了36个（绑定盒）。如果检测表明绑定盒在场景中不可见，杀手兔模型就可以简单地被丢弃，你就为自己省了一大堆工作。</span></p>
<p><strong><span style="font-size: medium;">你LOD了没有?</span></strong></p>
<p><span>另一个消除额外工作的方法就是所谓的物体细节等级（<span>Level of
Detail</span>），被称为LOD。这项技术是有损的，但对于它的一般应用来说，损失的模型细节通常是觉察不到的。物体模型由数个不同的细节等级构造。很恰当的例子是一个最高细节等级的战斗机模型使用10000个三角形，附带的低精度细节等级分别由5000，2500，1000和500个三角形组成。具体使用哪一个细节等级由战斗机距离观察摄像机的距离决定。如果很近，就使用最高的细节等级，如果是刚刚能在摄像机中看到而已，就使用最低的细节等级，在这两种情况之间，就使用其它的细节等级。</span></p>
<p>细节等级的选择总是由应用程序在将物体送入管线做进一步处理之前完成。为了决定使用哪一个细节等级，应用程序把物体的一个简化版本（通常只是中心点）映射到视图空间，以测定到物体的距离。这项操作独立于管线执行。必须确定具体的细节等级以决定将哪个三角形的集合（不同细节等级）送入管线。</p>
<p><strong>几何专用技巧</strong></p>
<p>一般来说，三角形多的模型看起来更加真实。这些三角形的信息——它们在3D世界中的位置，颜色等——保存在每个三角形的顶点描述中。这些3D世界中的顶点集合被称作场景数据库，跟上面提到的把动物模型做为几何数据库非常相像。模型中的弯曲部分，比如汽车上的轮子，需要许多三角形来近似形成一个光滑曲面。在一个圆形中努力减少顶点/三角形数量会造成不利影响，例如，使用低细节等级将造成一个&#8220;崎岖不平&#8221;的圆，构成圆的三角形顶点都可以看到。如果用更多的三角形来表现这个圆，它的边缘看起来会平滑得多。我们可以进行优化来减少实际送入管线的三角形数量却不必降低模型细节，因为相连的三角形顶点是共享的。程序员可以使用连接的三角形绘制模式来降低顶点数，即三角带和扇形。例如：</p>
<p>在三角带模式下，最简单的例子就是由两个三角形拼成的矩形，它拥有一条共享的斜边。通常，单独绘制两个这样的三角形会产生六个顶点。但是，由于两个三角形连在一起，它们形成了一个简单的，由四个顶点描述的三角带，把平均每个三角形需要的顶点数减少到了两个，优于原先的三个。看起来减少得并不多，随着三角形数目的增多（顶点数也同样变化）优势也会愈加明显，平均每个三角形单独拥有的顶点数降低到了一个。[RTR, p. 234]以下是计算平均顶点数的公式，给定m个三角形：</p>
<p align="center"><strong>1</strong><strong>＋2m</strong></p>
<p>因此，在一个有100个三角形的三角带中，平均每个三角形顶点数是1.02个，或者说总共有102个顶点，相比独立三角形的300个顶点是相当可观的节约。在这个例子中，我们通过把m个三角形改用三角带达到最大限度节约了成本，一共是m+2个顶点。这些节约可以积少成多，当考虑Direct3D中使用32个字节的数据来描述一个顶点的属性（如位置，颜色，透明度等）。当然，整个场景不可能只由三角带和扇形组成，但为了相应节约的成本，开发人员会尽量使用它们。</p>
<p>在扇形情况下，程序员可能使用20个三角形排列在一个扇形区来描述一个半圆。正常情况下由60个顶点组成，但通过使用扇形来描述，顶点数量可以降低到22个。第一个三角形有三个顶点，但接下来每个新增的三角形只需要增加一个顶点，扇形的中心有一个所有三角形共享的顶点。同样达到了使用三角带/扇形最大限度的节约。</p>
<p>使用三角带和扇形的另一大优势是，它们是&#8220;无损&#8221;的数据压缩，这意味着并没有任何信息和图形精度为了数据压缩和速度提升而损失掉。此外，以三角带和扇形向硬件传送三角形可以提高顶点缓存的效率，这可以加速几何处理的性能。另一个程序员可以使用的工具是索引过的三角形列表，可以用来描述巨量的三角形，m个三角形，使用m/2个顶点，大约是使用三角带和扇形压缩量的两倍。这个代表性的方法是大多数硬件架构的首选方法。</p>
<p style="text-align: center;"><img alt="" src="http://pic002.cnblogs.com/img/firewood/200809/2008090917074420.gif" /></p>
<p><strong><span style="font-size: medium;">曲面简介</span></strong></p>
<p>与其使用大量三角形来表现一个曲面，3D艺术家和程序员还可以使用另一个工具：高次曲面。这些曲面图元有着更为复杂的数学描述，但在一些情况下，这些额外的复杂性仍然比用大量三角形来描述物体更加廉价。这些图元有一些相当古怪的名字：参数多项式（称为样条），非均匀有理B样条（NURBs），贝塞尔曲线（Bezier），参数双三次曲面和N-Patches。因为3D硬件对三角形理解得最好，这些在应用层定义的曲面会被栅格化，或者被转换为三角形，转换由API运行时，显卡驱动或者硬件执行，以通过3D管线做进一步处理。如果曲面从CPU送入3D图形卡做变换和光照处理时由硬件执行栅格化，性能还有可能进一步提升，但这会给AGP接口带来少量负载，是一个潜在的瓶颈。&nbsp;</p>
<p><strong><span style="text-decoration: underline;"><span>2.
</span></span></strong><strong><span style="text-decoration: underline;">几何处理</span></strong></p>
<p style="text-align: center;"><img alt="" src="http://pic002.cnblogs.com/img/firewood/200809/2008090916191826.png" /></p>
<p><strong><span style="font-size: medium;">继续前进：四种主要变换</span></strong></p>
<p>物体在帧与帧之间变化位置来产生运动的假象，在3D世界中，物体通过四种操作被移动和操作，统称为变换。变换实际上是把不同类型的&#8220;变换矩阵&#8221;以矩阵数学作用在物体顶点上。这些变换操作都属于仿射几何（Affine），意味着它们发生在仿射空间中——一个包含点和向量的数学空间。仿射变换保留了线的平行关系，但点与点之间的距离可以变化。（看下面的例子，显示了一个正方体变成了一个长方体，边与边的平行关系被保留下来，但物体内的角度发生了变化？）。当物体在一个特定的坐标系或空间中移动，或者从一个空间转到另一个空间时使用这些变换操作。</p>
<p style="text-align: center;"><img alt="" src="http://pic002.cnblogs.com/img/firewood/200809/2008090917102678.gif" /></p>
<p><strong>平移：</strong>物体沿着三个坐标轴的任意一个到另一个位置的移动。数学操作：通常是加法或减法（加一个负数），不过为了提高效率做了一些转换，所以这项操作通过矩阵乘法来完成，跟旋转和缩放操作一样。</p>
<p><strong>旋转：</strong>就像名字暗示的那样，一个物体可以沿任意的轴旋转。数学操作：最简单的旋转例子就是物体在坐标系的原点，顶点的每个坐标值乘上&#952;角（物体旋转的角度）的sin或cos值就得到了旋转后的坐标。如果一个物体要同时绕几个坐标轴旋转，旋转的计算顺序就非常重要，不同的顺序会得到不同的结果。绕任意轴旋转需要一些额外的工作。可能首先需要进行一个变换移动到原点，接着做一些旋转操作使旋转轴对齐坐标系的z轴。然后做想要的旋转，然后对齐z轴的操作要被撤销，然后把物体移回原位。</p>
<p><strong>缩放：</strong>模型的大小变化，在透视投影（我们很快会详细讨论的一种变换）中用来产生场景深度效果。数学操作：乘一个缩放因子，如每个坐标乘2，物体会大一倍。缩放可以被归一化，这样三个轴向的缩放比例相同，或者每个顶点做不同程度的缩放。负的缩放因子会产生物体的镜像。</p>
<p><strong>斜切：</strong>（又称错位变换）沿着一个或多个轴向操作使模型的形状产生变化。例如一盒方形果冻盛在一个盘子里放在桌上，把盘子的一边提起成45度，果冻因为重力会变成偏菱形。果冻模型的顶部会向着3D世界的地面歪斜。数学操作：把一个坐标值的函数加在另一个上，比如把x的值加在y上而x不变。</p>
<p>请看下图：</p>
<p style="text-align: center;"><img alt="" src="http://pic002.cnblogs.com/img/firewood/200809/2008090917110717.gif" /></p>
<p style="text-align: center;"><img alt="" src="http://pic002.cnblogs.com/img/firewood/200809/2008090917114383.gif" /></p>
<p>就像前面所讲，3D变换计算大量使用矩阵数学来描述。矩阵为变换条件提供了简便的表示，3D矩阵数学通常是些简单的乘法和加法。</p>
<p>变换处理的效率来自于以下事实：多次矩阵操作可以连接组成一个单独的矩阵，把这个矩阵应用在顶点上作为一次单独的矩阵操作。这就把矩阵操作的设置消耗分散到了整个场景中。有人可能会认为要给出使用笛卡尔坐标系的各种空间的三个坐标值，应该是个3x3的矩阵。然而这里用的是&#8220;齐次坐标&#8221;，是个4x4矩阵。使用齐次坐标可以把需要加法的变换用乘法来处理，比如平移。多个不同变换也可以通过齐次坐标连接为乘法运算。第四项实际上就是缩放因子&#8220;w&#8221;。最初设置为1，用来在裁剪空间中做投影变换时计算深度值，并且在光栅化阶段作为像素值的透视修正插值。</p>
<p><strong><span style="font-size: medium;">从空间到空间</span></strong></p>
<p>继续进入到几何图元部分，我们很可能把物体从模型空间变换到世界空间，然后从世界空间到视图空间，或者有些时候直接变换到视图空间，我们前面提到过。从一个坐标空间转换到另一个时，要用到许多基本的变换。有些可能像一个翻转变换一样简单，也有复杂得多的，比如包括两个平移和一个旋转的组合。举个例子，世界空间变换到视图空间通常包括一个平移和一个旋转。转换到视图空间之后，许多有趣的事情就开始发生了。</p>
<p>第一部分就讲到这里。在下一部分我们将概括几何图元部分，并且涉及光照，裁剪，三角形设置以及渲染相关的许多方面。</p>
<img src ="http://www.blogjava.net/sealyu/aggbug/244645.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-12-05 18:07 <a href="http://www.blogjava.net/sealyu/archive/2008/12/05/244645.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PaperVision3D中处理坐标之间的直接距离</title><link>http://www.blogjava.net/sealyu/archive/2008/12/01/243811.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Mon, 01 Dec 2008 15:07:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/12/01/243811.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/243811.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/12/01/243811.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/243811.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/243811.html</trackback:ping><description><![CDATA[作者：sealyu&nbsp; 日期：2008-12-01<br />
<br />
今天在pv3d上看到处理3d坐标系中两点之间距离的方法，先记下来：<br />
<pre java="" style="font-family: monospace;">var n1<span style="color: #339933;">:</span>Number3D <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Number3D<span style="color: #009900;">(</span><span style="color: #cc66cc;">500</span>, 0, 0<span style="color: #009900;">)</span>;<br />
var n2<span style="color: #339933;">:</span>Number3D <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Number3D<span style="color: #009900;">(</span>0, 0, <span style="color: #cc66cc;">500</span><span style="color: #009900;">)</span>;<br />
var distance<span style="color: #339933;">:</span><span style="color: #003399;">Number</span> <span style="color: #339933;">=</span> Number3D.<span style="color: #006633;">sub</span><span style="color: #009900;">(</span>n1, n2<span style="color: #009900;">)</span>.<span style="color: #006633;">modulo</span>;</pre>
<br />
<br />
<img src ="http://www.blogjava.net/sealyu/aggbug/243811.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-12-01 23:07 <a href="http://www.blogjava.net/sealyu/archive/2008/12/01/243811.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PaperVision3D纹理(转)</title><link>http://www.blogjava.net/sealyu/archive/2008/12/01/243809.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Mon, 01 Dec 2008 14:54:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/12/01/243809.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/243809.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/12/01/243809.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/243809.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/243809.html</trackback:ping><description><![CDATA[<p>出处:http://hi.baidu.com/heguang</p>
<p>Papervision3D仍然处理2.0 alpha阶段，在测试这些例子之前，确保更新到了Papervision3D 2.0 alpha Great White branch的最新版本。<br />
<br />
原文地址：http://www.insideria.com/2008/05/textures-wireframe-bitmap-movi-1.html </p>
<p>Materials<br />
关于Papervision3D的材质你需要知道些什么呢？以一个球体为例，你怎样确定这个球体是地球呢，还是眼睛或篮球？你只能通过贴在球体上面的材质来判断。<br />
这篇文章介绍了Papervision3D材质的基本内容并且教会你怎样把材质加到一个平面上。让我们开始吧。 </p>
<p>材质的基类<br />
在单独介绍每种材质之前，需要着重了解每种材质都扩展了的抽象父类&#8220;MaterialObject3D&#8221; (org.papervision3d.core.proto.MaterialObject3D)。也就是说，无论哪种材质，你都可以找到以下共同的属性。 </p>
<p>所有的材质都很常用的<br />
1.       name(String):材质的名称。<br />
2.       interactive(Boolean)允许指定监听器。<br />
3.       oneSide或doubleSided(Boolean)：在网格（即3D物体）的正面和反面贴上材质。例如，一个转动的平面在它的两面都显示相同的材质。<br />
4.       smooth(Boolean)：在材质上应用平滑算法。把材质或者高分辨率的材质的平滑打开，会增强它的表现效果。 </p>
<p>较少用到，但很有用的<br />
5.       bitmap(BitmapData)：允许你访问材质的bitmap data。<br />
6.       tiled(Boolean)：决定纹理是否平铺在整个材质上。对于原始对象，需要调整maxU 和maxV才能生效。关于UV映射的更多信息请访问：http://en.wikipedia.org/wiki/UV_mapping/<br />
7.       maxU (Number):&#8220;U&#8221;最大值。<br />
8.       maxV (Number):&#8220;V&#8221;的最大值。<br />
9.       scene (Scene3D):持有物体所属舞台的引用。 </p>
<p>特别情况下使用的<br />
10.   invisible(Boolean)：表明物体表明是否被绘制。<br />
11.   opposite(Boolean)：indicates whether the face is flipped. Only use this if the material is double sided.<br />
12.   widthOffset (Number): holds the original width of the bitmap before auto mip-mapping resizes<br />
13.   heightOffset (Number): holds the original height of the bitmap before auto mip-mapping resizes </p>
<p>Wireframe Material（或者包含了Wireframe Material的组合材质）<br />
14.   lineColor (Number):表面线条的RGB值（如0xabc123）。<br />
15.   lineAlpha (Number):０到１之间的数值，代表了线条的透明度。<br />
16.   lineThickness (Number)：线条厚度。 </p>
<p>仅适用于Color Material（或者包含了Color Material的组合材质）<br />
1.       fillColor (Number):填充网格的RGB值（如0xabc123）。<br />
2.       fillAlpha (Number):0到１之间的数值，填充的透明度。 </p>
<p>1. Wireframe </p>
<p>WireframeMaterial( color:Number=0xFF00FF, alpha:Number=100, thickness:Number = 0 ) </p>
<p>2.Color </p>
<p>ColorMaterial( color:Number=0xFF00FF, alpha:Number = 1, interactive:Boolean = false ) </p>
<p>3.Bitmap<br />
如果想要将图像应用到3D物体上，你需要用到下面的方法来得到.gif、.jpeg或者.png文件的bitmap数据。<br />
<a href="http://www.3dswf.com/wp-content/uploads/2008/09/commons.png"><img src="http://www.3dswf.com/wp-content/uploads/2008/09/commons-223x300.png" alt="" title="commons" class="alignnone size-medium wp-image-82" width="223" height="300" /></a><br />
在这个例子里用到上面这幅logo。Bitmap Material, Bitmap Asset Material, 和 Bitmap File Material是三种不同的方式，得到相同下面相同的效果。 </p>
<p><a href="http://www.3dswf.com/wp-content/uploads/2008/09/bitmapmaterial.jpg"><img src="http://www.3dswf.com/wp-content/uploads/2008/09/bitmapmaterial-300x243.jpg" alt="" title="bitmapmaterial" class="alignnone size-medium wp-image-83" width="300" height="243" /></a></p>
<p>a.Bitmap </p>
<p>Bitmap
Material允许将任何BitmapData贴到材质上。最典型的用法是绑定一个位图，从而获取它的bitmapData再应用到材质上。你可以从这
里获得关于在Flex中绑定位图的更多信息：http://livedocs.adobe.com/flex/3/html
/help.html?content=embed_3.html<br />
BitmapMaterial( asset:BitmapData=null, precise:Boolean = false) </p>
<p>b.Asset(仅在Flash CS3使用) </p>
<p>使用Bitmap Asset Materials将Flash库里的一幅位图贴到物体上。仅需要增加任何位图到library里，右键单击-&gt;属性 </p>
<p>c. Color </p>
<p>Bitmap Color Material的用法跟Color Material差不多，但它允许你访问bitmapData，按照自己的意愿绘制或改变颜色的像素。 </p>
<p>d.File </p>
<p>Bitmap File Material仅需要一个字符串，指出图片的位置。你可以为材质增加监听器，来监听图片下载进度或什么时候完成下载。<br />
BitmapFileMaterial( url :String=&#8221;" ) </p>
<p>e.Viewport </p>
<p><a href="http://www.3dswf.com/wp-content/uploads/2008/09/bitmapviewportmaterial.jpg"><img src="http://www.3dswf.com/wp-content/uploads/2008/09/bitmapviewportmaterial-300x243.jpg" alt="" title="bitmapviewportmaterial" class="alignnone size-medium wp-image-84" width="300" height="243" /></a></p>
<p>Bitmap Viewport Material获取一幅视口位图的快照，并允许你把它应用到其它的3D物体上。类似于篮球比赛，通过大屏幕而不是直接观看。<br />
BitmapViewportMaterial(bitmapViewport:BitmapViewport3D,precise:Boolean=false);
BitmapViewport3D(viewportWidth:Number=640,viewportHeight:Number=480,
autoScaleToStage:Boolean = false, bitmapTransparent:Boolean=false,
bgColor:int=0&#215;000000, interactive:Boolean=false,
autoCulling:Boolean=true); </p>
<p>f.Wireframe </p>
<p>Bitmap Wireframe Material类似于Wireframe Material，但允许访问材质的bitmapData。<br />
BitmapWireframeMaterial(color:Number=0xFF00FF, alpha:Number=1,thickness:Number=3) </p>
<p>4.MovieClip<br />
Papervision3D允许你直接使用Flash库里的MovieClip，通过链接标识符(linkage identifier)贴到3D物体上。对于Flex，就需要绑定公开的.swf和MovieClip。<br />
a.Asset (仅用于Flash CS3)<br />
MovieAssetMaterial( linkageID:String=&#8221;", transparent:Boolean=false,
animated:Boolean=false, createUnique:Boolean=false, precise:Boolean =
false)<br />
b.MovieMaterial<br />
MovieMaterial( movieAsset:DisplayObject=null, transparent:Boolean=false, animated:Boolean=false, precise:Boolean = false ) </p>
<p>5. Video Stream </p>
<p>嗯，你可以在3D物体上显示视频了。真酷！<br />
<a href="http://www.3dswf.com/wp-content/uploads/2008/09/videostreammaterial.jpg"><img src="http://www.3dswf.com/wp-content/uploads/2008/09/videostreammaterial-300x243.jpg" alt="" title="videostreammaterial" class="alignnone size-medium wp-image-85" width="300" height="243" /></a><br />
VideoStreamMaterial ( video:Video, stream:NetStream , precise:Boolean = false ) </p>
<p>6.Shade<br />
阴影材质是基于光线的，一束光照射在材质上，反射与否就形成了阴影。你可能已经猜到了，你首先需要创造一束光：<br />
light = new PointLight3D();<br />
通过x、y和z属性，你可以把这束光移动到你想要的位置。阴影物体会朝向这束光。如果你想这束光可见，需要传递一个为&#8220;true&#8221;的参数，并把它&#8220;addChild&#8221;到舞台上。否则，它就是一束不可见的光，在同样的位置上创建3D物体，看起来光源就像是太阳或灯那样。<br />
a.cell </p>
<p>http://en.wikipedia.org/wiki/Cel-shaded_animation<br />
Cell Material用到了两种颜色，你可以设置步数来混合它们。<br />
<a href="http://www.3dswf.com/wp-content/uploads/2008/09/cellmaterial.jpg"><img src="http://www.3dswf.com/wp-content/uploads/2008/09/cellmaterial-300x243.jpg" alt="" title="cellmaterial" class="alignnone size-medium wp-image-86" width="300" height="243" /></a><br />
CellMaterial(light:LightObject3D, color_1:int, color_2:int, steps:int) </p>
<p>b.Environment Map </p>
<p>http://en.wikipedia.org/wiki/Environment_map<br />
environment map接受投影过的位图。下一篇文章里会提到需要&#8220;shaders&#8221;的environment map的更多高级用法。<br />
<a href="http://www.3dswf.com/wp-content/uploads/2008/09/envmapmaterial.jpg"><img src="http://www.3dswf.com/wp-content/uploads/2008/09/envmapmaterial-300x243.jpg" alt="" title="envmapmaterial" class="alignnone size-medium wp-image-88" width="300" height="243" /></a><br />
EnvMapMaterial(light:LightObject3D, lightMap:BitmapData, backEnvMap:BitmapData=null, ambientColor:int = 0) </p>
<p>c. Flat Shade </p>
<p>http://en.wikipedia.org/wiki/Flat_shading </p>
<p>平面阴影使多边形的每一面都有固体阴影。这个效果用在球体上会比在平面或立方体上更好。你会看见光线环绕着这个球体。 </p>
<p><a href="http://www.3dswf.com/wp-content/uploads/2008/09/flatshadematerial.jpg"><img src="http://www.3dswf.com/wp-content/uploads/2008/09/flatshadematerial-300x243.jpg" alt="" title="flatshadematerial" class="alignnone size-medium wp-image-89" width="300" height="243" /></a></p>
<p>FlatShadeMaterial(light:LightObject3D, diffuse:uint=0xffffff, ambient:uint=0&#215;000000) </p>
<p>d.Gouraud </p>
<p>http://en.wikipedia.org/wiki/Gouraud_shading<br />
Gouraud Material具有更平滑的阴影。上面的链接讨论了它的局限性。<br />
<a href="http://www.3dswf.com/wp-content/uploads/2008/09/gouraudmaterial.jpg"><img src="http://www.3dswf.com/wp-content/uploads/2008/09/gouraudmaterial-300x243.jpg" alt="" title="gouraudmaterial" class="alignnone size-medium wp-image-90" width="300" height="243" /></a><br />
GouraudMaterial(light3D:LightObject3D, lightColor:int = 0xFFFFFF, ambientColor:int=0&#215;000000) </p>
<p>e. Phong </p>
<p>http://en.wikipedia.org/wiki/Phong_shading<br />
Phong Material跟Gouraud Material类似，不过它允许高光。<br />
<a href="http://www.3dswf.com/wp-content/uploads/2008/09/phongmaterial.jpg"><img src="http://www.3dswf.com/wp-content/uploads/2008/09/phongmaterial-300x243.jpg" alt="" title="phongmaterial" class="alignnone size-medium wp-image-91" width="300" height="243" /></a><br />
PhongMaterial(light3D:LightObject3D, lightColor:int, ambientColor:int, specular:int) </p>
<p>7.Composite </p>
<p>composite material就是多种材质组合到一起变成了一种材质。在这里我们看到的是bitmap material和wireframe material混在一起的效果。<br />
<a href="http://www.3dswf.com/wp-content/uploads/2008/09/compositematerial.jpg"><img src="http://www.3dswf.com/wp-content/uploads/2008/09/compositematerial-300x243.jpg" alt="" title="compositematerial" class="alignnone size-medium wp-image-87" width="300" height="243" /></a></p>
<p>8.运行时材质交换 </p>
<p>在运行时(run-time)交换材质将很容易办到。感谢Ralph的更新。<br />
my3DObject.material = myMaterial;<br />
最用使用是在翻转的时候，但Papervision3D的交互要在接下来的文章里才会介绍。 </p>
<p>9.网络上Material的例子 </p>
<p>http://www.zeropointnine.com/blog/a-papervision-20-alpha-example<br />
http://www.unitzeroone.com/blog/2008/03/12/papervision3d-shaders-bumpmap-example-sourcecode-for-cs3/</p>
<p>标签： <a href="http://www.3dswf.com/?tag=material" rel="tag">Material</a>, <a href="http://www.3dswf.com/?tag=pv3d" rel="tag">Papervision 3D</a>, <a href="http://www.3dswf.com/?tag=%e7%ba%b9%e7%90%86" rel="tag">纹理</a></p>
<img src ="http://www.blogjava.net/sealyu/aggbug/243809.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-12-01 22:54 <a href="http://www.blogjava.net/sealyu/archive/2008/12/01/243809.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>3dflash原理（转）</title><link>http://www.blogjava.net/sealyu/archive/2008/11/21/241810.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Fri, 21 Nov 2008 02:48:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/11/21/241810.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/241810.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/11/21/241810.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/241810.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/241810.html</trackback:ping><description><![CDATA[众所周知,flash是一个二维的动画软件,是无法完成一些真正的3d效果,但是如果要用它来做一些3d效果也不是不可能,一般来说有以下三种方法.<br />
第一种方法,借助其它的3d软件,象swift 3d,Ulead Cool
3d,TrueSpace等一些相对容易上手的软件,用它们来完成后再导入到flash中,效果是不错,但是导入的大都是位图系列,所以生成的文件都比较
大,再有一个特点就是没有flash所特有的互动性,作为flash 并没有多少工作可做,它只不过是播放的工具而已.<br />
第二种方法,理论上可以,实际上是行不通的,就是利用flash 的画图工具做成逐帧动画,当然简单的还凑合,复杂的就根本不行.<br />
第三种方法,就是我今天所要说的as 3d
,用数学方法算出3d来,也就是利用数学公式和一些透视的知识模仿出3d效果来,也称之为假3d,是一种视觉上的错觉.不过我个人认为在电视上出现的3d
应该都是假3d,只不过那些专业的3d软件做出来的更逼真,更能欺骗你的眼睛罢了.<br />
言归正传,我们首先认识一下坐标问题,因为要模仿三维效果,必须首先了解坐标方面的知识,,因为3d效果都是三维坐标,而flash中是二维坐标,我们应该先把三维坐标转换二维数学坐标,再把二维坐标转换为flash中的坐标,如图:<br />
<br />
<div style="width: 100%; overflow-x: auto;"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_200810_20070323153949870.gif" target="_blank"><img src="http://www.tjbhxs.com/blog/uploads/200704/30_200810_20070323153949870.gif" alt="uploads/200704/30_200810_20070323153949870.gif" /></a></div>
<br />
为此我们先画一个透视图,B点是观察者的眼睛,物体位于三维空间的A点,它的坐标是(x,y,z),将该点的坐标转换为二维坐标,实际上就是点A在平面
(电视屏幕)上的投影点C的坐标,其中CF的长就是该点的X坐标值,CE是该点的Y的坐标值,假设观察点到屏幕的距离BO=d,然后根据三角形相似原理,
对应边成比例可以得到d/(d+z)=x1/x,d/(d+z)=y1/y,其中(x1,y1)就是转换后的坐标,假设d/(d+z)=ratio,所以
x1=x*ratio,y1=y*ratio.<br />
<div style="width: 100%; overflow-x: auto;"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_200825_2.gif" target="_blank"><img src="http://www.tjbhxs.com/blog/uploads/200704/30_200825_2.gif" alt="uploads/200704/30_200825_2.gif" /></a></div>
<br />
这样如果不好看懂的话,我们再换个角度来看,假设从上往下看和从右往左看,画个顶视图和右视图,这时候顶视图只能看到X轴和Z轴,Y轴只是一个点,右视图只能看到Y轴和Z轴，X而轴只是一个点,如图:<br />
<div style="width: 100%; overflow-x: auto;"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_200855_3.gif" target="_blank"><img src="http://www.tjbhxs.com/blog/uploads/200704/30_200855_3.gif" alt="uploads/200704/30_200855_3.gif" /></a></div>
<br />
<div style="width: 100%; overflow-x: auto;"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_200904_4.gif" target="_blank"><img src="http://www.tjbhxs.com/blog/uploads/200704/30_200904_4.gif" alt="uploads/200704/30_200904_4.gif" /></a></div>
<br />
接下来就很简单了,二维数学坐标和flash之间的坐标转换,只需把中心移动到左上角就好了,那么A点最终的坐标:<br />
_x=width/2+x1,<br />
_y=height/2-y1,<br />
其中width和height分别是场景的宽和高.<br />
现在坐标的问题解决了,只是第一步,要想让物体符合空间透视,还需要对其它参数做调整,比如近大远小,景深之类的,但是flash毕竟不是专门的3d软
件,所以我们只能尽可能的模仿了,通过调整物体的比例大小,透明度和物体所处的层次可以达到比较逼真的效果,其中比例问题的原理和坐标相同,所以也可以根
据上面的公式得出,即:_xscale=_yscale=100*ratio(z越大,ratio就越小,离屏幕就越远,物体就越小)，透明度也是一样
_alpha=100*ratio;至于层次的问题现在大都用的是经验值swapDepths(10000-z)或者swapDepths(-z).<br />
导入三个小图标,也可以是图片,如果你画的好的话,还可以画三个小人,这样效果更好,做成影片剪辑,拖入主场景中,分别命名为:mcA,mcB,mcC,然后在主场景的第一帧加入以下代码:<br />
<div>[color=Red]mcA.x = -300; <br />
mcA.y = 0; <br />
mcA.z = 0; <br />
mcA.dir = 1;//运动的方向 <br />
mcB.x = -50; <br />
mcB.y = 0; <br />
mcB.z = 250; <br />
mcB.dir = 1; <br />
mcC.x = 200; <br />
mcC.y = 0; <br />
mcC.z = 500; <br />
mcC.dir = 1;//以上为三个图标的三维坐标值 <br />
d = 300; <br />
speed = 20; <br />
mcMove = function () { <br />
&nbsp;this.z += speed*this.dir; <br />
&nbsp;if (this.z&gt;500) { <br />
&nbsp;this.z = 500; <br />
&nbsp;this.dir = -1; <br />
&nbsp;} else if (this.z&lt;0) { <br />
&nbsp;this.z = 0; <br />
&nbsp;this.dir = 1; <br />
&nbsp;} <br />
&nbsp;var ratio = d/(d+this.z); <br />
&nbsp;this._x = 250+this.x*ratio; <br />
&nbsp;this._y = 150-this.y*ratio;//将三维坐标转化为二维坐标 <br />
&nbsp;this._xscale = this._yscale=100*ratio; <br />
&nbsp;this.swapDepths(-this.z);//调整比例大小,透明度和层次让它符合透视原理 <br />
}; <br />
mcA.onEnterFrame = mcMove; <br />
mcB.onEnterFrame = mcMove; <br />
mcC.onEnterFrame = mcMove; [/color]</div>
<br />
这里是swf文件:3d1.swf      <br />
附件: 3d1.swf <br />
<div><input id="bShowobjwwsp" value="-1" type="hidden" /><a href="javascript:ubbShowObj('swf','objwwsp','uploads/200704/30_201155_3d1.swf','400','300');"><img src="http://www.tjbhxs.com/blog/styles/default/images/icon_media.gif" alt="Media" /> <strong>点击播放/隐藏媒体</strong></a>
<div id="objwwsp"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_201155_3d1.swf" target="_blank">uploads/200704/30_201155_3d1.swf</a></div>
</div>
<br />
接下来我们再做一个例子,在这个例子里我们引入一个镜头的概念,通过改变镜头的远近来实现一些更酷的效果,在主场景的第一帧加入以下代码:<br />
<div>[color=Red]this.createEmptyMovieClip("scene", 1); <br />
scene._x = scene._y=200;/ <br />
scene.depth = 1;//建立一个空的影片剪辑,用来包含一切的3d元素 <br />
cameraView = new Object(); <br />
cameraView.x = 0; <br />
cameraView.y = 0; <br />
cameraView.z = 0;//镜头坐标的初始值 <br />
cameraView.target = new Object(); <br />
cameraView.target.x = 0; <br />
cameraView.target.y = 0; <br />
cameraView.target.z = 0;//目标镜头的坐标值 <br />
d = 200;//眼睛和屏幕的距离 <br />
selectPic = function () { <br />
&nbsp;cameraView.target.x = this.x; <br />
&nbsp;cameraView.target.y = this.y; <br />
&nbsp;cameraView.target.z = this.z; <br />
};//这个函数就是每选择一个图时,把这个图的坐标作为目标镜头的坐标 <br />
displayPic = function (cameraView, d) { <br />
&nbsp;var x = this.x-cameraView.x; <br />
&nbsp;var y = this.y-cameraView.y; <br />
&nbsp;var z = this.z-cameraView.z; <br />
&nbsp;if (z&lt;0) { <br />
&nbsp;this.z += 5000; <br />
&nbsp;this.x = 1000-Math.random()*1000; <br />
&nbsp;this.y = 1000-Math.random()*1000; <br />
&nbsp;x = this.x-cameraView.x; <br />
&nbsp;y = this.y-cameraView.y; <br />
&nbsp;z = this.z-cameraView.z; <br />
&nbsp;} <br />
&nbsp;var ratio = d/(d+z); <br />
&nbsp;this._x = x*ratio; <br />
&nbsp;this._y = y*ratio; <br />
&nbsp;this._xscale = this._yscale=100*ratio; <br />
&nbsp;this.swapDepths(1000-z); <br />
}; <br />
Pic = new Array(); <br />
for (var i = 1; i&lt;=10; i++) { <br />
&nbsp;mc = scene.attachMovie("pic"+i, "pic"+i, scene.depth++);//导入10个图标,做成影片剪辑 <br />
&nbsp;mc.x = 1000-Math.random()*1000; <br />
&nbsp;mc.y = 1000-Math.random()*1000; <br />
&nbsp;mc.z = i*500; <br />
&nbsp;mc.onRelease = selectPic; <br />
&nbsp;mc.display = displayPic; <br />
&nbsp;Pic.push(mc); <br />
} <br />
scene.onEnterFrame = function() { <br />
&nbsp;cameraView.x += (cameraView.target.x-cameraView.x)/5; <br />
&nbsp;cameraView.y += (cameraView.target.y-cameraView.y)/5; <br />
&nbsp;cameraView.z += (cameraView.target.z-cameraView.z)/5;//缓冲公式 <br />
&nbsp;for (var i = 0; i&lt;=Pic.length; i++) { <br />
&nbsp;Pic.display(cameraView, d); <br />
&nbsp;} <br />
}; [/color]</div>
<br />
这里是swf文件:3d2.swf ，接下来的这俩个例子,都是利用了镜头的概念,你可以利用键盘的方向键来控制看看效果。   <br />
<br />
<div><input id="bShowobjnz0g" value="-1" type="hidden" /><a href="javascript:ubbShowObj('swf','objnz0g','uploads/200704/30_201056_3d2.swf','400','300');"><img src="http://www.tjbhxs.com/blog/styles/default/images/icon_media.gif" alt="Media" /> <strong>点击播放/隐藏媒体</strong></a>
<div id="objnz0g"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_201056_3d2.swf" target="_blank">uploads/200704/30_201056_3d2.swf</a></div>
</div>
<br />
<div><input id="bShowobjw650" value="-1" type="hidden" /><a href="javascript:ubbShowObj('swf','objw650','uploads/200704/30_201102_3d2b.swf','400','300');"><img src="http://www.tjbhxs.com/blog/styles/default/images/icon_media.gif" alt="Media" /> <strong>点击播放/隐藏媒体</strong></a>
<div id="objw650"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_201102_3d2b.swf" target="_blank">uploads/200704/30_201102_3d2b.swf</a></div>
</div>
<br />
<div><input id="bShowobjgrsk" value="-1" type="hidden" /><a href="javascript:ubbShowObj('swf','objgrsk','uploads/200704/30_201111_3d2c.swf','400','300');"><img src="http://www.tjbhxs.com/blog/styles/default/images/icon_media.gif" alt="Media" /> <strong>点击播放/隐藏媒体</strong></a>
<div id="objgrsk"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_201111_3d2c.swf" target="_blank">uploads/200704/30_201111_3d2c.swf</a></div>
</div>
<br />
<br />
以上的例子虽然有了点3d的效果了,但是都是直来直去,并没有涉及到旋转的效果,那么接下来我们再讲一下物体在三维空间里的旋转效果是如何制作的,.我们把旋转分成三种情况来讲,绕X轴,绕Y轴,绕Z轴旋转,首先讲一下绕X轴旋转,如图:<br />
<br />
<div style="width: 100%; overflow-x: auto;"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_201245_21.gif" target="_blank"><img src="http://www.tjbhxs.com/blog/uploads/200704/30_201245_21.gif" alt="uploads/200704/30_201245_21.gif" /></a></div>
<br />
点A绕X轴旋转b到达点B,X坐标的值是不变的,即x1=x,OA=OB=r,再这里首先要说两个数学里三角函数的公式:<br />
sina=对边/斜边,<br />
cosa=邻边/斜边,.<br />
sin(a+b)=sina*cosb+cosa*sinb,<br />
cos(a+b)=cosa*cosb-sina*sinb,<br />
所以点A的坐标:<br />
y=r*sina,<br />
z=r*cosa,<br />
旋转后B点的坐标:<br />
y1=r*sin(a+b),<br />
z1=r*cos(a+b),<br />
最后得到旋转后B点的坐标与旋转前A点坐标的关系:<br />
y1=y*cosb+z*sinb,<br />
z1=z*cosb-y*sinb,<br />
这个公式很重要,在3d效果里涉及到旋转都要用到这个公式, <br />
同样我们还可以计算出饶Y轴旋转的公式:<br />
x1=x*cosb+z*sinb,<br />
z1=z*cosb-x*sinb,<br />
<br />
<div style="width: 100%; overflow-x: auto;"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_201311_22.gif" target="_blank"><img src="http://www.tjbhxs.com/blog/uploads/200704/30_201311_22.gif" alt="uploads/200704/30_201311_22.gif" /></a></div>
<br />
绕Z轴旋转的公式:<br />
x1=x*cosb+y*sinb,<br />
y1=y*cosb-x*sinb,<br />
有了以上的知识,我们就可以做一个空间旋转的例子,在主场景加入以下代码:<br />
<br />
<div style="width: 100%; overflow-x: auto;"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_201332_23.gif" target="_blank"><img src="http://www.tjbhxs.com/blog/uploads/200704/30_201332_23.gif" alt="uploads/200704/30_201332_23.gif" /></a></div>
<br />
<div>[color=Red] this.createEmptyMovieClip("Scene", 1); <br />
Scene._x = 150; <br />
Scene._y = 150; <br />
d = 300;//眼睛和屏幕之间的距离,试着调整看有什么变化 <br />
make3DPoint = function(x,y,z){ <br />
&nbsp;var point = new Object(); <br />
&nbsp;point.x = x; <br />
&nbsp;point.y = y; <br />
&nbsp;point.z = z; <br />
&nbsp;return point; <br />
}; <br />
make2DPoint = function(x, y, depth, ratio){ <br />
&nbsp;var point = new Object(); <br />
&nbsp;point.x = x; <br />
&nbsp;point.y = y; <br />
&nbsp;point.depth = depth; <br />
&nbsp;point.ratio = ratio; <br />
&nbsp;return point; <br />
}; <br />
Transform3DPointsTo2DPoints = function(points, rotations){ <br />
&nbsp;var myArray = []; <br />
&nbsp;var sx = Math.sin(rotations.x); <br />
&nbsp;var cx = Math.cos(rotations.x); <br />
&nbsp;var sy = Math.sin(rotations.y); <br />
&nbsp;var cy = Math.cos(rotations.y); <br />
&nbsp;var sz = Math.sin(rotations.z); <br />
&nbsp;var cz = Math.cos(rotations.z); <br />
&nbsp;var x,y,z, xy,xz, yx,yz, zx,zy, ratio; <br />
&nbsp;var i = points.length; <br />
&nbsp;while (i--){ <br />
&nbsp;x = points.x; <br />
&nbsp;y = points.y; <br />
&nbsp;z = points.z; <br />
&nbsp;xy = cx*y - sx*z; <br />
&nbsp;xz = sx*y + cx*z; <br />
&nbsp;yz = cy*xz - sy*x; <br />
&nbsp;yx = sy*xz + cy*x; <br />
&nbsp;zx = cz*yx - sz*xy; <br />
&nbsp;zy = sz*yx + cz*xy;//旋转后的坐标值 <br />
&nbsp;ratio = d/(d + yz); <br />
&nbsp;x = zx*ratio; <br />
&nbsp;y = zy*ratio;//再转化为二维坐标 <br />
&nbsp;z = yz; <br />
&nbsp;myArray = make2DPoint(x, y, -z, ratio); <br />
&nbsp;} <br />
&nbsp;return myArray; <br />
};//以上三个函数很重要,因为在大多数3d效果的例子里都能用到,可以说是公式了,尤其是最后一个 <br />
pointsArray = [ <br />
&nbsp;make3DPoint(-50,-50,-50), <br />
&nbsp;make3DPoint(50,-50,-50), <br />
&nbsp;make3DPoint(50,-50,50), <br />
&nbsp;make3DPoint(-50,-50,50), <br />
&nbsp;make3DPoint(-50,50,-50), <br />
&nbsp;make3DPoint(50,50,-50), <br />
&nbsp;make3DPoint(50,50,50), <br />
&nbsp;make3DPoint(-50,50,50) <br />
];//正方体四个顶点的坐标 <br />
for (i=0; i&lt;pointsArray.length; i++){ <br />
&nbsp;attachedObj =Scene.attachMovie("ball", "ball"+i, i); <br />
}//画一个小球,转化为影片剪辑 <br />
myRotations = make3DPoint(0,0,0); <br />
Scene.onEnterFrame  = function(){ <br />
&nbsp;myRotations.y -= this._xmouse/2000; <br />
&nbsp;myRotations.x += this._ymouse/2000;//鼠标互动,你也可以调整2000这个值让它转的更快或者更慢,也可以换成固定值 <br />
&nbsp;var screenPoints = Transform3DPointsTo2DPoints(pointsArray, myRotations); <br />
&nbsp;for (i=0; i&lt;pointsArray.length; i++){ <br />
&nbsp;myball = this["ball"+i]; <br />
&nbsp;myball._x = screenPoints.x; <br />
&nbsp;myball._y = screenPoints.y; <br />
&nbsp;myball._xscale = myball._yscale = 100 * screenPoints.ratio; <br />
&nbsp;myball.swapDepths(screenPoints.depth); <br />
&nbsp;} <br />
};[/color]</div>
<br />
按Ctrl+Enter效果就出来了,是不是很酷啊?<br />
这是swf文件:3d3.swf<br />
<br />
<div><input id="bShowobj0rzd" value="-1" type="hidden" /><a href="javascript:ubbShowObj('swf','obj0rzd','uploads/200704/30_201458_3d3.swf','400','300');"><img src="http://www.tjbhxs.com/blog/styles/default/images/icon_media.gif" alt="Media" /> <strong>点击播放/隐藏媒体</strong></a>
<div id="obj0rzd"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_201458_3d3.swf" target="_blank">uploads/200704/30_201458_3d3.swf</a></div>
</div>
<br />
当然我们可以再加点东西,在刚才的onEnterFrame事件后再加以下代码看看又会如何:<br />
<div>[color=Red]this.clear(); <br />
&nbsp;this.lineStyle(2, 0xff0000, 100); <br />
&nbsp;// 顶面的四条线 <br />
&nbsp;this.moveTo(screenPoints[0].x, screenPoints[0].y); <br />
&nbsp;this.lineTo(screenPoints[1].x, screenPoints[1].y); <br />
&nbsp;this.lineTo(screenPoints[2].x, screenPoints[2].y); <br />
&nbsp;this.lineTo(screenPoints[3].x, screenPoints[3].y); <br />
&nbsp;this.lineTo(screenPoints[0].x, screenPoints[0].y); <br />
&nbsp;// 底面的四条线 <br />
&nbsp;this.moveTo(screenPoints[4].x, screenPoints[4].y); <br />
&nbsp;this.lineTo(screenPoints[5].x, screenPoints[5].y); <br />
&nbsp;this.lineTo(screenPoints[6].x, screenPoints[6].y); <br />
&nbsp;this.lineTo(screenPoints[7].x, screenPoints[7].y); <br />
&nbsp;this.lineTo(screenPoints[4].x, screenPoints[4].y); <br />
&nbsp;// 把顶面和第面用四条线连起来 <br />
&nbsp;this.moveTo(screenPoints[0].x, screenPoints[0].y); <br />
&nbsp;this.lineTo(screenPoints[4].x, screenPoints[4].y); <br />
&nbsp;this.moveTo(screenPoints[1].x, screenPoints[1].y); <br />
&nbsp;this.lineTo(screenPoints[5].x, screenPoints[5].y); <br />
&nbsp;this.moveTo(screenPoints[2].x, screenPoints[2].y); <br />
&nbsp;this.lineTo(screenPoints[6].x, screenPoints[6].y); <br />
&nbsp;this.moveTo(screenPoints[3].x, screenPoints[3].y); <br />
&nbsp;this.lineTo(screenPoints[7].x, screenPoints[7].y); <br />
&nbsp;//以上代码是一个简单的画图程序 [/color]</div>
<br />
再加点东西,在上面的画图程序里加上以下俩句看有什么:<br />
<div>[color=Red]this.beginFill(0x00ff00,80); <br />
this.endFill(); [/color]</div>
<br />
这是swf文件:3d3B.swf "3d3C.swf<br />
<br />
<div><input id="bShowobjw7nv" value="-1" type="hidden" /><a href="javascript:ubbShowObj('swf','objw7nv','uploads/200704/30_201608_3d3b.swf','400','300');"><img src="http://www.tjbhxs.com/blog/styles/default/images/icon_media.gif" alt="Media" /> <strong>点击播放/隐藏媒体</strong></a>
<div id="objw7nv"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_201608_3d3b.swf" target="_blank">uploads/200704/30_201608_3d3b.swf</a></div>
</div>
<br />
<div><input id="bShowobj4u5z" value="-1" type="hidden" /><a href="javascript:ubbShowObj('swf','obj4u5z','uploads/200704/30_201613_3d3c.swf','400','300');"><img src="http://www.tjbhxs.com/blog/styles/default/images/icon_media.gif" alt="Media" /> <strong>点击播放/隐藏媒体</strong></a>
<div id="obj4u5z"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_201613_3d3c.swf" target="_blank">uploads/200704/30_201613_3d3c.swf</a></div>
</div>
<br />
<br />
从上面的例子里我们把as画图和3d效果结合起来,那么我们接下来就专门讲一下这方面的例子,用纯粹的as 做一些3d效果,先画一个旋转的正方形,在第一帧加入以下的代码:<br />
[code][/code]<span style="color: Red;"> this.createEmptyMovieClip("theScene", 1); <br />
theScene._x = 150; <br />
theScene._y = 150; <br />
d = 300;  <br />
make3DPoint = function(x,y,z){ <br />
var point = new Object(); <br />
point.x = x; <br />
point.y = y; <br />
point.z = z; <br />
return point; <br />
}; <br />
make2DPoint = function(x, y){ <br />
var point = new Object(); <br />
point.x = x; <br />
point.y = y; <br />
return point; <br />
}; <br />
Transform3DPointsTo2DPoints = function(points,rotations){ <br />
var myArray = []; <br />
var sx = Math.sin( rotations.x); <br />
var cx = Math.cos( rotations.x); <br />
var sy = Math.sin( rotations.y); <br />
var cy = Math.cos( rotations.y); <br />
var sz = Math.sin( rotations.z); <br />
var cz = Math.cos( rotations.z); <br />
var x,y,z, xy,xz, yx,yz, zx,zy, ratio; <br />
var i = points.length; <br />
while (i--){ <br />
x = points.x; <br />
y = points.y; <br />
z = points.z; <br />
xy = cx*y - sx*z; <br />
xz = sx*y + cx*z; <br />
yz = cy*xz - sy*x; <br />
yx = sy*xz + cy*x; <br />
zx = cz*yx - sz*xy; <br />
zy = sz*yx + cz*xy; <br />
ratio = d/(d + yz); <br />
x = zx*ratio; <br />
y = zy*ratio; <br />
myArray = make2DPoint(x, y); <br />
} <br />
return myArray; <br />
}; <br />
pointsArray = [ <br />
make3DPoint(-50,-50,-50), <br />
make3DPoint(50,-50,-50), <br />
make3DPoint(50,-50,50), <br />
make3DPoint(-50,-50,50), <br />
make3DPoint(-50,50,-50), <br />
make3DPoint(50,50,-50), <br />
make3DPoint(50,50,50), <br />
make3DPoint(-50,50,50) <br />
]; <br />
myRotations = make3DPoint(0,0,0); <br />
<br />
theScene.onEnterFrame  = function(){ <br />
myRotations.y -= this._xmouse/3000; <br />
myRotations.x += this._ymouse/3000; <br />
var screenPoints = Transform3DPointsTo2DPoints(pointsArray, myRotations); <br />
this.clear(); <br />
this.lineStyle(2,0xff0000,100); <br />
// top <br />
this.moveTo(screenPoints[0].x, screenPoints[0].y); <br />
this.lineTo(screenPoints[1].x, screenPoints[1].y); <br />
this.lineTo(screenPoints[2].x, screenPoints[2].y); <br />
this.lineTo(screenPoints[3].x, screenPoints[3].y); <br />
this.lineTo(screenPoints[0].x, screenPoints[0].y); <br />
// bottom <br />
this.moveTo(screenPoints[4].x, screenPoints[4].y); <br />
this.lineTo(screenPoints[5].x, screenPoints[5].y); <br />
this.lineTo(screenPoints[6].x, screenPoints[6].y); <br />
this.lineTo(screenPoints[7].x, screenPoints[7].y); <br />
this.lineTo(screenPoints[4].x, screenPoints[4].y); <br />
// connecting bottom and top <br />
this.moveTo(screenPoints[0].x, screenPoints[0].y); <br />
this.lineTo(screenPoints[4].x, screenPoints[4].y); <br />
this.moveTo(screenPoints[1].x, screenPoints[1].y); <br />
this.lineTo(screenPoints[5].x, screenPoints[5].y); <br />
this.moveTo(screenPoints[2].x, screenPoints[2].y); <br />
this.lineTo(screenPoints[6].x, screenPoints[6].y); <br />
this.moveTo(screenPoints[3].x, screenPoints[3].y); <br />
this.lineTo(screenPoints[7].x, screenPoints[7].y); <br />
};</span><br />
<br />
这是swf文件:3d4.swf<br />
<br />
<div><input id="bShowobj6w27" value="-1" type="hidden" /><a href="javascript:ubbShowObj('swf','obj6w27','uploads/200704/30_201657_3d4.swf','400','300');"><img src="http://www.tjbhxs.com/blog/styles/default/images/icon_media.gif" alt="Media" /> <strong>点击播放/隐藏媒体</strong></a>
<div id="obj6w27"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_201657_3d4.swf" target="_blank">uploads/200704/30_201657_3d4.swf</a></div>
</div>
<br />
<br />
看看这段程序和上面的程序是不是很相似,其实只要你掌握了其中的原理,只需要把里面的东西作一些相应的变换就可以做成你自己想的很酷的效果,现在我再把上
面的程序稍做调整,原码我就不写了,你可以自己考虑一下.上面做的都是正方形,如果把坐标做相应的调整,还可以做成其它立体图形,比如三角形,五角形等,
关于单纯的由线条组成的立体图形现在看来很简单,只要你知道各个点的坐标就可以用以上的方法做出来,当然你还可以把它填充起来,比如上面的那个正方体.现
在我就利用beginFill()和endFill()这俩个方法在上面的基础把这个立方体填充起来.把上面的立方体去掉线条,只留下三个面,又是另一个
效果:这是swf文件:3d4B.swf " 3d4C.swf<br />
<br />
<div><input id="bShowobjctkf" value="-1" type="hidden" /><a href="javascript:ubbShowObj('swf','objctkf','uploads/200704/30_201710_3d4b.swf','400','300');"><img src="http://www.tjbhxs.com/blog/styles/default/images/icon_media.gif" alt="Media" /> <strong>点击播放/隐藏媒体</strong></a>
<div id="objctkf"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_201710_3d4b.swf" target="_blank">uploads/200704/30_201710_3d4b.swf</a></div>
</div>
<br />
<div><input id="bShowobjkwqz" value="-1" type="hidden" /><a href="javascript:ubbShowObj('swf','objkwqz','uploads/200704/30_201714_3d4c.swf','400','300');"><img src="http://www.tjbhxs.com/blog/styles/default/images/icon_media.gif" alt="Media" /> <strong>点击播放/隐藏媒体</strong></a>
<div id="objkwqz"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_201714_3d4c.swf" target="_blank">uploads/200704/30_201714_3d4c.swf</a></div>
</div>
<br />
<br />
当然你也可以利用以上的知识自己做一些很酷的效果,只需要将上面的坐标坐标变换一下就能做出很多图形,下面是我做的一个平面五角星和一个只有线条的立体五角星,因为坐标是我自己用苯办法算出里的,所以有点不大像.<br />
<br />
<div><input id="bShowobjnkro" value="-1" type="hidden" /><a href="javascript:ubbShowObj('swf','objnkro','uploads/200704/30_201733_3d4e.swf','400','300');"><img src="http://www.tjbhxs.com/blog/styles/default/images/icon_media.gif" alt="Media" /> <strong>点击播放/隐藏媒体</strong></a>
<div id="objnkro"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_201733_3d4e.swf" target="_blank">uploads/200704/30_201733_3d4e.swf</a></div>
</div>
<br />
<br />
<div><input id="bShowobjuz5s" value="-1" type="hidden" /><a href="javascript:ubbShowObj('swf','objuz5s','uploads/200704/30_201739_3d4f.swf','400','300');"><img src="http://www.tjbhxs.com/blog/styles/default/images/icon_media.gif" alt="Media" /> <strong>点击播放/隐藏媒体</strong></a>
<div id="objuz5s"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_201739_3d4f.swf" target="_blank">uploads/200704/30_201739_3d4f.swf</a></div>
</div>
<br />
<br />
<div><input id="bShowobjcsgr" value="-1" type="hidden" /><a href="javascript:ubbShowObj('swf','objcsgr','uploads/200704/30_201745_3d4f.swf','400','300');"><img src="http://www.tjbhxs.com/blog/styles/default/images/icon_media.gif" alt="Media" /> <strong>点击播放/隐藏媒体</strong></a>
<div id="objcsgr"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_201745_3d4f.swf" target="_blank">uploads/200704/30_201745_3d4f.swf</a></div>
</div>
<br />
下面这个立体图形的坐标我给出来看大家能不能自己做出来.<br />
v1(15.9689,-22.1275,-0.135825),<br />
v2(-15.3241,-22.1275,-0.135825),<br />
v3(15.9689,1.32056e-006,21.9917),<br />
v4(-15.3241,1.32255e-006,21.9917),<br />
v5(-15.3241,-1.31526e-006,-22.2633),<br />
v6(15.9686,-1.31725e-006,-22.2633),<br />
v7(15.9686,22.1275,-0.135827),<br />
v8(-15.3241,22.1275,-0.135827),<br />
v9(0.322368,-84.0845,83.9487),<br />
v10(0.322369,-84.0845,-84.2204),<br />
v11(119.236,0.0,-0.135826),<br />
v12(0.322368,84.0845,-84.2204),<br />
v13(0.322386,84.0845,83.9487),<br />
v14(-118.591,0,-0.135826)<br />
一共有十四个点,组成二十四个面,下面是每个面对应的那几个点:<br />
fa1=9,fb1=1,fc1=3,fa2=9,fb2=3,fc2=4,fa3=9,fb3=4,fc3=2,fa4=9,fb4=2,fc4=1,fa5=10,fb5=2,fc5=5,<br />
fa6=10,fb6=5,fc6=6,fa7=10,fb7=6,fc7=1,fa8=10,fb8=1,fc8=2,fa9=11,fb9=6,fc9=7,fa10=11,fb10=7,fc10=3,<br />
fa11=11,fb11=3,fc11=1,fa12=11,fb12=1,fc12=6,fa13=12,fb13=6,fc13=5,fa14=12,fb14=5,fc14=8,<br />
fa15=12,fb15=8,fc15=7,fa16=12,fb16=7,fc16=6,fa17=13,fb17=8,fc17=4,fa18=13,fb18=4,fc18=3,<br />
fa19=13,fb19=3,fc19=7,fa20=13,fb20=7,fc20=8,fa21=14,fb21=8,fc21=5,fa22=14,fb22=5,fc22=2,<br />
fa23=14,fb23=2,fc23=4,fa24=14,fb24=4,fc24=8<br />
<br />
这是我做的几个例子:swf文件:3d10.swf "3d10B.swf "3d10C.swf<br />
<br />
<div><input id="bShowobj2544" value="-1" type="hidden" /><a href="javascript:ubbShowObj('swf','obj2544','uploads/200704/30_201803_3d10.swf','400','300');"><img src="http://www.tjbhxs.com/blog/styles/default/images/icon_media.gif" alt="Media" /> <strong>点击播放/隐藏媒体</strong></a>
<div id="obj2544"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_201803_3d10.swf" target="_blank">uploads/200704/30_201803_3d10.swf</a></div>
</div>
<br />
<div><input id="bShowobj5wbh" value="-1" type="hidden" /><a href="javascript:ubbShowObj('swf','obj5wbh','uploads/200704/30_201807_3d10b.swf','400','300');"><img src="http://www.tjbhxs.com/blog/styles/default/images/icon_media.gif" alt="Media" /> <strong>点击播放/隐藏媒体</strong></a>
<div id="obj5wbh"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_201807_3d10b.swf" target="_blank">uploads/200704/30_201807_3d10b.swf</a></div>
</div>
<br />
<div><input id="bShowobjexbo" value="-1" type="hidden" /><a href="javascript:ubbShowObj('swf','objexbo','uploads/200704/30_201811_3d10c.swf','400','300');"><img src="http://www.tjbhxs.com/blog/styles/default/images/icon_media.gif" alt="Media" /> <strong>点击播放/隐藏媒体</strong></a>
<div id="objexbo"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_201811_3d10c.swf" target="_blank">uploads/200704/30_201811_3d10c.swf</a></div>
</div>
<br />
<br />
做旋转的六面体还有另一种做法,前面的那中方法,做出来的实际并不逼真,下面先看看我用另一个方法做出来的例子看与这个有什么区别呢,代码如下:<br />
<div>[color=Red] this.createEmptyMovieClip("theScene", 1);  <br />
theScene._x = 150;  <br />
theScene._y = 150;  <br />
d = 300;  <br />
make3DPoint = function(x,y,z){  <br />
&nbsp;var point = new Object();  <br />
&nbsp;point.x = x;  <br />
&nbsp;point.y = y;  <br />
&nbsp;point.z = z;  <br />
&nbsp;return point;  <br />
};  <br />
make2DPoint = function(x,y){  <br />
&nbsp;var point = new Object();  <br />
&nbsp;point.x = x;  <br />
&nbsp;point.y = y;  <br />
&nbsp;return point;  <br />
};  <br />
isVisibleBetween = function(a,b,c){  <br />
&nbsp;if (((b.y-a.y)/(b.x-a.x)-(c.y-a.y)/(c.x-a.x)&lt;0)^(a.x&lt;=b.x == a.x&gt;c.x)){  <br />
&nbsp;return true;  <br />
&nbsp;}else{  <br />
&nbsp;return false;  <br />
&nbsp;}  <br />
};[/color]</div>
<br />
//
这个函数很重要,你不必知道它的原理,只要知道怎么用就可以了,其实我也不知道怎么解释它,但是这个函数可以根据一个平面上任意三个点的坐标而判断该平面
是否看的见,因为一个立体图形在平面上最多可以显示三个面,所以就必须判断你可以看的那三个面,这个函数不仅可以用在四面体上,不管有多少面的立体图形都
可以用这个公式:<br />
<div>[color=Red] drawFilledSquare = function(a,b,c,d){ <br />
&nbsp;this.clear(); <br />
&nbsp;this.lineStyle(2,0,100); <br />
&nbsp;if (isVisibleBetween(a,b,c)){ <br />
&nbsp;this.moveTo(a.x, a.y); <br />
&nbsp;this.beginFill(this.col, 100); <br />
&nbsp;this.lineTo(b.x, b.y); <br />
&nbsp;this.lineTo(c.x, c.y); <br />
&nbsp;this.lineTo(d.x, d.y); <br />
&nbsp;this.lineTo(a.x, a.y); <br />
&nbsp;this.endFill(); <br />
&nbsp;} <br />
};[/color]</div>
<br />
//这里就是上面函数的应用,如果这个面看的见就画出它,<br />
//下面的程序基本上就成为了一种固定的形式了:<br />
<div>[color=Red]Transform3DPointsTo2DPoints = function(points, axisRotations){ <br />
&nbsp;var myArray = []; <br />
&nbsp;var sx = Math.sin(axisRotations.x); <br />
&nbsp;var cx = Math.cos(axisRotations.x); <br />
&nbsp;var sy = Math.sin(axisRotations.y); <br />
&nbsp;var cy = Math.cos(axisRotations.y); <br />
&nbsp;var sz = Math.sin(axisRotations.z); <br />
&nbsp;var cz = Math.cos(axisRotations.z); <br />
&nbsp;var x,y,z, xy,xz, yx,yz, zx,zy, scaleRatio; <br />
&nbsp;var i = points.length; <br />
&nbsp;while (i--){ <br />
&nbsp;x = points.x; <br />
&nbsp;y = points.y; <br />
&nbsp;z = points.z; <br />
&nbsp;xy = cx*y - sx*z; <br />
&nbsp;xz = sx*y + cx*z; <br />
&nbsp;yz = cy*xz - sy*x; <br />
&nbsp;yx = sy*xz + cy*x; <br />
&nbsp;zx = cz*yx - sz*xy; <br />
&nbsp;zy = sz*yx + cz*xy; <br />
&nbsp;scaleRatio = d/(d + yz); <br />
&nbsp;x = zx*scaleRatio; <br />
&nbsp;y = zy*scaleRatio; <br />
&nbsp;myArray = make2DPoint(x, y); <br />
&nbsp;} <br />
&nbsp;return myArray; <br />
}; <br />
pointsArray = [ <br />
&nbsp;make3DPoint(-50,-50,-50), <br />
&nbsp;make3DPoint(50,-50,-50), <br />
&nbsp;make3DPoint(50,-50,50), <br />
&nbsp;make3DPoint(-50,-50,50), <br />
&nbsp;make3DPoint(-50,50,-50), <br />
&nbsp;make3DPoint(50,50,-50), <br />
&nbsp;make3DPoint(50,50,50), <br />
&nbsp;make3DPoint(-50,50,50) <br />
]; <br />
rollOverFace = function(){ <br />
&nbsp;this.col = 0xff0000; <br />
}; <br />
rollOutFace = function(){ <br />
&nbsp;this.col = 0xdddddd; <br />
}; <br />
for (i=0; i&lt;6; i++){ <br />
&nbsp;emptyFace = theScene.createEmptyMovieClip("face"+i,i); <br />
&nbsp;emptyFace.col = 0xdddddd; <br />
&nbsp;emptyFace.onRollOver = emptyFace.onDragOver = rollOverFace; <br />
&nbsp;emptyFace.onRollOut = emptyFace.onDragOut = rollOutFace; <br />
&nbsp;emptyFace.onPress = pressFace; <br />
&nbsp;emptyFace.draw = drawFilledSquare; <br />
} <br />
cubeAxisRotations = make3DPoint(0,0,0); <br />
<br />
theScene.onEnterFrame = function(){ <br />
&nbsp;cubeAxisRotations.y -= this._xmouse/3000; <br />
&nbsp;cubeAxisRotations.x += this._ymouse/3000; <br />
&nbsp;var pts2D = Transform3DPointsTo2DPoints(pointsArray, cubeAxisRotations); <br />
&nbsp;this.face0.draw(pts2D[0], pts2D[3], pts2D[2], pts2D[1]); <br />
&nbsp;this.face1.draw(pts2D[4], pts2D[5], pts2D[6], pts2D[7]); <br />
&nbsp;this.face2.draw(pts2D[0], pts2D[4], pts2D[7], pts2D[3]); <br />
&nbsp;this.face3.draw(pts2D[3], pts2D[7], pts2D[6], pts2D[2]); <br />
&nbsp;this.face4.draw(pts2D[2], pts2D[6], pts2D[5], pts2D[1]); <br />
&nbsp;this.face5.draw(pts2D[1], pts2D[5], pts2D[4], pts2D[0]); <br />
}; [/color]</div>
<br />
这是swf文件:3d5.swf<br />
<div><input id="bShowobjc14j" value="-1" type="hidden" /><a href="javascript:ubbShowObj('swf','objc14j','uploads/200704/30_201949_3d5.swf','400','300');"><img src="http://www.tjbhxs.com/blog/styles/default/images/icon_media.gif" alt="Media" /> <strong>点击播放/隐藏媒体</strong></a>
<div id="objc14j"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_201949_3d5.swf" target="_blank">uploads/200704/30_201949_3d5.swf</a></div>
</div>
<br />
<br />
现在我们再把上面的坐标换成三角形的坐标,再把最后画图的部分也做一下调整,那么就很容易做成一个旋转的的四面体了,具体调整如下:<br />
<div>[color=Red] pointsArray = [ <br />
&nbsp;make3DPoint(-50,87,29),       <br />
&nbsp;make3DPoint(0,87,-58), <br />
&nbsp;make3DPoint(50,87,29), <br />
&nbsp;make3DPoint(0,0,0) <br />
&nbsp;];//这是坐标部分 <br />
this.face0.draw(pts2D[0], pts2D[1], pts2D[2]); <br />
&nbsp;this.face1.draw(pts2D[0], pts2D[3], pts2D[1]); <br />
&nbsp;this.face2.draw(pts2D[1], pts2D[3], pts2D[2]); <br />
&nbsp;this.face3.draw(pts2D[2], pts2D[3], pts2D[0]); <br />
//这是画图部分[/color]</div>
<br />
这是swf文件:3d6.swf .下面的几个例子也是在此基础上扩展的:3d6C.swf ;最后来个超酷的飞机,这可是纯AS做的哦:3d7B.swf .<br />
<br />
<div><input id="bShowobjc4me" value="-1" type="hidden" /><a href="javascript:ubbShowObj('swf','objc4me','uploads/200704/30_202033_3d6.swf','400','300');"><img src="http://www.tjbhxs.com/blog/styles/default/images/icon_media.gif" alt="Media" /> <strong>点击播放/隐藏媒体</strong></a>
<div id="objc4me"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_202033_3d6.swf" target="_blank">uploads/200704/30_202033_3d6.swf</a></div>
</div>
<br />
<div><input id="bShowobjd8do" value="-1" type="hidden" /><a href="javascript:ubbShowObj('swf','objd8do','uploads/200704/30_202039_3d6c.swf','400','300');"><img src="http://www.tjbhxs.com/blog/styles/default/images/icon_media.gif" alt="Media" /> <strong>点击播放/隐藏媒体</strong></a>
<div id="objd8do"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_202039_3d6c.swf" target="_blank">uploads/200704/30_202039_3d6c.swf</a></div>
</div>
<br />
<div><input id="bShowobjb17e" value="-1" type="hidden" /><a href="javascript:ubbShowObj('swf','objb17e','uploads/200704/30_202045_3d7b.swf','400','300');"><img src="http://www.tjbhxs.com/blog/styles/default/images/icon_media.gif" alt="Media" /> <strong>点击播放/隐藏媒体</strong></a>
<div id="objb17e"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_202045_3d7b.swf" target="_blank">uploads/200704/30_202045_3d7b.swf</a></div>
</div>
<br />
<br />
上面的例子比较常见，当然还有一些其它的效果,我现在再给大家连出一些这方面的例子:<br />
有投影的三维效果:3DB2.swf  " 3DF.swf<br />
有弹性的立体小球:3DD.swf<br />
可以拖动的小球:3DA.swf<br />
最后是我做的两个,一个是可以用键盘方向键控制旋转的立体DNA,另一个是我用BitmapData类做的空间旋转的立方体. DNA_exam2.swf "3d9.swf<br />
<br />
<div><input id="bShowobjizu4" value="-1" type="hidden" /><a href="javascript:ubbShowObj('swf','objizu4','uploads/200704/30_202106_3db2.swf','400','300');"><img src="http://www.tjbhxs.com/blog/styles/default/images/icon_media.gif" alt="Media" /> <strong>点击播放/隐藏媒体</strong></a>
<div id="objizu4"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_202106_3db2.swf" target="_blank">uploads/200704/30_202106_3db2.swf</a></div>
</div>
<br />
<br />
<div><input id="bShowobjtrg5" value="-1" type="hidden" /><a href="javascript:ubbShowObj('swf','objtrg5','uploads/200704/30_202117_3df.swf','400','300');"><img src="http://www.tjbhxs.com/blog/styles/default/images/icon_media.gif" alt="Media" /> <strong>点击播放/隐藏媒体</strong></a>
<div id="objtrg5"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_202117_3df.swf" target="_blank">uploads/200704/30_202117_3df.swf</a></div>
</div>
<br />
<div><input id="bShowobjkl5f" value="-1" type="hidden" /><a href="javascript:ubbShowObj('swf','objkl5f','uploads/200704/30_202121_3df.swf','400','300');"><img src="http://www.tjbhxs.com/blog/styles/default/images/icon_media.gif" alt="Media" /> <strong>点击播放/隐藏媒体</strong></a>
<div id="objkl5f"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_202121_3df.swf" target="_blank">uploads/200704/30_202121_3df.swf</a></div>
</div>
<br />
<div><input id="bShowobjdrpc" value="-1" type="hidden" /><a href="javascript:ubbShowObj('swf','objdrpc','uploads/200704/30_202131_3da.swf','400','300');"><img src="http://www.tjbhxs.com/blog/styles/default/images/icon_media.gif" alt="Media" /> <strong>点击播放/隐藏媒体</strong></a>
<div id="objdrpc"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_202131_3da.swf" target="_blank">uploads/200704/30_202131_3da.swf</a></div>
</div>
<br />
<div><input id="bShowobj4lrb" value="-1" type="hidden" /><a href="javascript:ubbShowObj('swf','obj4lrb','uploads/200704/30_202135_dnaexam2.swf','400','300');"><img src="http://www.tjbhxs.com/blog/styles/default/images/icon_media.gif" alt="Media" /> <strong>点击播放/隐藏媒体</strong></a>
<div id="obj4lrb"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_202135_dnaexam2.swf" target="_blank">uploads/200704/30_202135_dnaexam2.swf</a></div>
</div>
<br />
<div><input id="bShowobjnmxl" value="-1" type="hidden" /><a href="javascript:ubbShowObj('swf','objnmxl','uploads/200704/30_202141_3d9.swf','400','300');"><img src="http://www.tjbhxs.com/blog/styles/default/images/icon_media.gif" alt="Media" /> <strong>点击播放/隐藏媒体</strong></a>
<div id="objnmxl"><a href="http://www.tjbhxs.com/blog/uploads/200704/30_202141_3d9.swf" target="_blank">uploads/200704/30_202141_3d9.swf</a></div>
</div>
<img src ="http://www.blogjava.net/sealyu/aggbug/241810.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-11-21 10:48 <a href="http://www.blogjava.net/sealyu/archive/2008/11/21/241810.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>超简易papervision3D基础 第二篇 物体的各种移动（转）</title><link>http://www.blogjava.net/sealyu/archive/2008/11/19/241463.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Wed, 19 Nov 2008 11:36:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/11/19/241463.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/241463.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/11/19/241463.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/241463.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/241463.html</trackback:ping><description><![CDATA[DDM君，Flab3D.com (允许转载，转载请注明)
<p>&nbsp; 所有PV3D三维模型都是继承至DisplayObject3D类，所以所有三维模型都有同样的移动，旋转，缩放的方法/属性。（如果不理解什么叫继承可以无视这句话=_=）讲这句的意思是&#8220;摄像机这些也是DisplayObject3D&#8221;，所以也可以做同样的操作。</p>
<p>我们第一篇的小球在这里不是特别能明显表示下面的区别。所以我们这次用个立方体Cube。<br />
<script type="text/javascript">
AC_FL_RunContent( 'codebase','http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0','width','400','height','400','title','flab3d.com第二篇 物体控制','src','tutorialfile/t04/test02','quality','high','pluginspage','http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash','movie','tutorialfile/t04/test02' ); //end AC code
</script>
<embed title="flab3d.com第二篇 物体控制" src="http://www.flab3d.com/tutorialfile/t04/test02.swf" quality="high" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="400" height="400"> <noscript><object
    classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
    codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0"
    width="400" height="400" title="flab3d.com第二篇 物体控制">
    <param
    name="movie" value="tutorialfile/t04/test02.swf" />
    <param
    name="quality" value="high" />
    </object></noscript>
    </p>
    <p><strong>原理介绍： </strong><br />
    <img src="http://www.flab3d.com/tutorialfile/t04/tutorial04_01.jpg" width="400" height="311"  alt="" /><br />
    先记下上面这个图，它保证我们不迷失在三维的世界里，如果你正好是maya,3dsmax的使用，恭喜你！和里面的道理一模一样。<br />
    <br />
    <strong>移动： </strong><br />
    cube.x &nbsp;//物体在世界坐标的X轴位置<br />
    cube.y &nbsp;//物体在世界坐标的Y轴位置<br />
    cube.z &nbsp;//物体在世界坐标的Z轴位置<br />
    pv3d的三维坐标 图1</p>
    <p>cube.moveForward（一定距离） //向物体本地Z的正方向移动 <br />
    cube.moveBackward（一定距离） //向物体本地Z的负方向移动<br />
    cube.moveDown（一定距离）//向物体本地Y的负方向移动<br />
    cube.moveUp（一定距离）//向物体本地Y的正方向移动<br />
    cube.moveLeft（一定距离）//向物体本地X的负方向移动<br />
    cube.moveRight（一定距离）////向物体本地X的正方向移动</p>
    <p>这两种有什么区别呢？其实就是world和local坐标系的区别，上面那张图应该能帮助您理解。</p>
    <p><strong>旋转： </strong><br />
    cube.rotationX&nbsp; //物体绕世界坐标的X轴，顺时针旋转<br />
    cube.rotationY&nbsp; //物体绕世界坐标的Y轴，顺时针旋转<br />
    cube.rotationZ&nbsp; //物体绕世界坐标的Z轴，顺时针旋转</p>
    <p>cube.yaw(一定角度) &nbsp;//以本地的Y为轴心，顺时针旋转<br />
    cube.pitch(一定角度) &nbsp;//以本地的X为轴心，顺时针旋转<br />
    cube.roll(一定角度)&nbsp; //以本地的Z为轴心，顺时针旋转<br />
    （yaw-pitch-roll其实是欧拉角euler的一种描述方法，愿意研究图形数学可以到网上百科查询具体含义，我们flash3d研究所以后也会在图形学原理里放出关于三种旋转方式和万向节锁gimbal-lock的相关资料）<br />
    <img src="http://www.flab3d.com/tutorialfile/t04/tutorial04_02.jpg" width="400" height="311"  alt="" /></p>
    <p>这两种有什么区别呢？还是自己尝试尝试吧~不要放弃任何一种哦，都是每天都会用到的东西。</p>
    <p><strong>缩放：</strong>（默认下，单位为1，2，3&#8230;倍这种，不是百分比）<br />
    cube.scaleX &nbsp;//物体延X轴放大<br />
    cube.scaleY&nbsp; //物体延Y轴放大<br />
    cube.scaleZ&nbsp; //物体延Z轴放大<br />
    这是分别延x,y,z的缩放，如果要整体缩放，直接用下面这个就可以了。<br />
    cube.scale&nbsp; //物体整体放大</p>
    <p><strong>代码流程： </strong><br />
    仍然有困难写出代码的朋友，可以
    <a href="http://www.flab3d.com/aslib/example02.rar" class="s2">下载源代码</a>
    。</p>
    <p>和上次一样，建包，放傻瓜包，然后初始化最基础的4要素。不想重新来一次的可以就修改上次的^_^。如果不记得了可以看
    <a href="http://www.flab3d.com/tutorials_01_pv3dbasic.html" class="s2">《第一篇 人人都能PV3D》—点击到第一篇</a>
    <br />
    我们这次要添加一个cube（立方体）。</p>
    <p>cube=new Cube(new MaterialsList({all:new BitmapFileMaterial('map.jpg')}),500,500,500,3,3,3);<br />
    介绍一下生成立方体的构造器，和我们第一篇的球体少许不同。<br />
    第一个参数需要一个&#8216;材质列表&#8217;（MaterialsList），而不是像我们上次小球只要单个材质。（不理解材质列表暂时没关系，其实它就是一个很多单个材质添加在一起的&#8216;数组&#8217;或object。我们以后会在中级研究中作一些具体分析）<br />
    参数二，参数三，参数四分别是立方体的宽，长，高。<br />
    参数五，参数六，参数七分别是决定长宽高有多少段（段数越多运行越慢，但是贴图变形越小，越准确）。</p>
    <p>因为需要用&#8216;材质列表&#8217;（MaterialsList），所以开始要记得把MaterialsList类导入进来。<br />
    import org.papervision3d.materials.utils.MaterialsList;<br />
    当然，也得把立方体的类导入<br />
    import org.papervision3d.objects.primitives.Cube;
    </p>
    <p>为了能更清楚的测试这些控制的含义，我在初始化的时候先给立方体了一个角度。<br />
    cube.rotationX=30; <br />
    cube.rotationY=30; </p>
    <p>enterframe里面就可以测试我们学到的各种操作了。<br />
    属性需要这样写才能累加，才能看到动画变化：<br />
    cube.x+=10;<br />
    方法直接写就可以了：<br />
    cube.MoveForward(10);</p>
    <p>&nbsp;这次的也非常简单吧，记住它们，熟悉它们，因为我们每天都会用到。<br />
    好好练习哦~加油！<br />
    <a href="http://www.flab3d.com/topiclist.php" class="s2">有任何不清楚的地方，欢迎到讨论区发言。（无需注册）</a>
    </p>
    <p align="left">DDM君<br />
    Flab3D.com</p>
    <p>
    <a href="http://www.flab3d.com/aslib/Flash3d%E7%A0%94%E7%A9%B6%E6%89%80%E6%8E%A8%E8%8D%90%E7%9A%84%E6%9C%80%E6%96%B0pv3d%E5%82%BB%E7%93%9C%E5%8C%85.rar" class="s2">Flash3d研究所推荐的Pv3d傻瓜包下载</a>
    <br />
    <a href="http://www.flab3d.com/aslib/example02.rar" class="s2">源文件下载</a>
    </p>
<img src ="http://www.blogjava.net/sealyu/aggbug/241463.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-11-19 19:36 <a href="http://www.blogjava.net/sealyu/archive/2008/11/19/241463.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>超简易papervision3D基础 第一篇 人人都能PV3D（转）</title><link>http://www.blogjava.net/sealyu/archive/2008/11/19/241462.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Wed, 19 Nov 2008 11:35:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/11/19/241462.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/241462.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/11/19/241462.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/241462.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/241462.html</trackback:ping><description><![CDATA[DDM君 , Flab3D.com （允许转载，转载请注明）
<p>&nbsp;
在网页里制作三维实时动画和网页三维游戏，从很多年前的shockwave时代（那种普及率很难称作一个时代）就开始了。如今网页三维引擎虽不算多如牛
毛，也算多到眼花的。具体为什么这项技术到现在还没有普及起来，在下可能又能写一篇文章了，所以这里就不多讲。先提一下这些的原因是想让我们不要觉得
flash3d是很超前，或者很高难度不可攀的东西。<br />
&nbsp;在下从shockwave时代就对网页三维引擎颇有兴趣，现在对flash3d也有少许了解。在下也知道国内flash3d站，中文高端资料也是非常有限的，国内的研发者就更是屈指可数。<br />
&nbsp; 我们Flab3D.com就是为了让更多国内flash3d爱好者了解，上手，并希望能加入flash3d制作和开发的行列。因此我们的教程更注意对基本原理的讲解，并非简单描述如何操作。<br />
&nbsp;如果你的梦想和我们一样是建造在网页上的三维世界，那么请和我们一起加油。</p>
<p>&nbsp; 我们都会以flash中的使用为初级教程的软件，flex暂不多提，flex的使用者解决这类简单的安装问题应该是不成问题的）</p>
<script type="text/javascript">
AC_FL_RunContent( 'codebase','http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0','width','400','height','400','title','text01','src','tutorialfile/t01/test01','quality','high','pluginspage','http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash','movie','tutorialfile/t01/test01' ); //end AC code
</script>
<table id="structure" border="0" bordercolor="#ffffff" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td id="insidePage1" colspan="2"><embed title="text01" src="http://www.flab3d.com/tutorialfile/t01/test01.swf" quality="high" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="400" height="400"> <noscript><object
            classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
            codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0"
            width="400" height="400" title="text01">
            <param name="movie"
            value="tutorialfile/t01/test01.swf" />
            <param name="quality"
            value="high" />
            </object> </noscript>
            <p><strong>原理解释：</strong><br />
            要使papervision3D成像，必须至少初始化下面4个东西（如果没有三维引擎经验，或者三维动画制作经验，如果无法理解请先记下来，别担心，以后用多了慢慢就懂了）：</p>
            <p><strong>窗口</strong>：用户观看的窗口，简单的可以想成就是flash里面的画布大小。窗口也可以理解成渲染的尺寸，否则画面就无限大了<br />
            <strong>场景</strong>：场景是指整个三维的场景。<br />
            <strong>摄像机</strong>：很多人要问，为什么有了摄像机还要窗口呢？摄像机是用来拍画面的，看画面还是得电视机/窗口不是吗，^_^<br />
            <strong>渲染器</strong>：如果没有这个东西，所有以上的东西都只是数据，渲染器就是把所有数据变成图像的东西。</p>
            <p>下面这幅图虽然并不算准确的表述，但希望能帮助我们理解：<br />
            图1<img src="http://www.flab3d.com/tutorialfile/t01/tutorial01_01.jpg" width="400" height="311"  alt="" /></p>
            <p>当然只有上面的东西，我们虽然有了个正确的基本pv3d设置。但还是什么都看不到，因为场景里什么都没有嘛，呵呵。</p>
            <p>我们这个例子里，会向场景加入一个小球，然后给这个小球贴上一个自己做的位图贴图。（如果没有三维经验的朋友，可以把小球想成是一个木头架子组成的灯笼框，贴图是上面糊的画纸=___=有时候我有没有必要解释到这种地步OTL&#8230;），最后让这个小球自己慢慢转动。</p>
            <p>请下载我们为您提供的
            <a href="http://www.flab3d.com/aslib/Flash3d%E7%A0%94%E7%A9%B6%E6%89%80%E6%8E%A8%E8%8D%90%E7%9A%84pv3d%E5%82%BB%E7%93%9C%E5%8C%85_0810.rar" class="s2">pv3d傻瓜包</a>
            （08-10）。<br />
            另外自己看了下面的流程仍然有困难写出代码的朋友可以下载我们的
            <a href="http://www.flab3d.com/aslib/example01.rar" class="s2">源文件</a>
            ，解压放到和pv3d的com,org几个包放在一起就可以了。
            <img src="http://www.flab3d.com/tutorialfile/t01/a01.jpg" width="144" height="211"  alt="" />      </p>
            <p><strong>新手操作流程：</strong></p>
            <p>新建一个主包（就是一个文件包），把pv3d解压后的所有包放到这个包里面，我们就可以开始工作了。</p>
            <p>打开flash CS3（或cs4）新建一个fla文件，以&#8220;test01.fla&#8221;为文件名保存在主包里，和刚才解压的pv3d的包在同一个包中。<br />
            下面属性框中：<br />
            祯数调到30fps；<br />
            窗口大小用400*400；<br />
            文件类：test01<br />
            （另外语言如果默认不是actionscript3需要改成actionscript3）
            <img src="http://www.flab3d.com/tutorialfile/t01/a02.jpg" width="470" height="88"  alt="" /></p>
            <p>新建一个ActionScript文件，以保&#8220;test01.as&#8221;为文件名保存，里面写：<br />
            Package{<br />
            public class test01 extends Sprite {<br />
            public function test01():void {<br />
            }<br />
            }<br />
            }<br />
            知道as3的都知道，这个是基本的类结构吧。所有成品的pv3d程序，都需要继承于Sprite类。Test01里含有一个test01构造函数，程序自动会先找这个运行。</p>
            <p>private var viewport:Viewport3D=new Viewport3D(400,400); //初始化窗口<br />
            private var scene:Scene3D =new Scene3D; //初始化场景<br />
            private var camera:FreeCamera3D =new FreeCamera3D; //初始化摄像机<br />
            private var renderer:BasicRenderEngine= new BasicRenderEngine; //初始化渲染器<br />
            以上就初始化好了4要素。</p>
            <p>addChild（viewport）//记得把窗口加入的stage里，别忘了哟，所以要写上这句。</p>
            <p>renderer.renderScene(scene,camera,viewport); //这句就可以渲染一张图勒。</p>
            <p>但是我们肯定不想就渲染一张图就完毕，我们想能动起来，所以需要能1秒钟渲染30张左右。</p>
            <p>addEventListener(Event.ENTER_FRAME,process); //所以加入一个enterframe<br />
            private function process(evt:Event):void { <br />
            renderer.renderScene(scene,camera,viewport); &nbsp;//把刚才那句渲染的句子放到enterframe这里面来，每秒渲染器就会尽最大努力刷新30次，我们的场景就会动起来了。<br />
            }</p>
            <p>现在我们试着放一个球到场景里去。先在主包里面放一张任意的jpg图片（随便什么jpg图都可以，大小最好修改成128*128，256*256，1024*1024这种），命名为&#8216;map.jpg&#8217;。</p>
            <p>private var sphere:Sphere= new Sphere(new BitmapFileMaterial('map.jpg'),400,12,12);<br />
            //上面构造Sphere的4个参数分别代表：贴图，半径大小，横行段数，竖行段数<br />
            // new BitmapFileMaterial('map.jpg')是直接构建一个位图贴图的快捷写法。&#8216;map.jpg&#8217;就是主包里面那张图。如果你非要把图放在其他包里，就写&#8216;其它什么什么包/map.jpg&#8217;。<br />
            scene.addChild(sphere);//这里看清楚哟~是场景在addChild.<br />
            </p>
            <p>
            为了让我们的程序可以执行，我们必须在开始导入这些类。<br />
            import flash.display.Sprite;<br />
            import flash.events.Event;<br />
            import org.papervision3d.cameras.FreeCamera3D;<br />
            import org.papervision3d.render.BasicRenderEngine;<br />
            import org.papervision3d.scenes.Scene3D;<br />
            import org.papervision3d.view.Viewport3D;<br />
            import org.papervision3d.materials.BitmapFileMaterial;<br />
            import org.papervision3d.materials.utils.MaterialsList;<br />
            import org.papervision3d.objects.primitives.Sphere;</p>
            <p>这时我们运行程序，就能看到一个我们可爱的小球（没有动的）了。</p>
            <p>为了不至于错觉图像定住了（实际上没有定住，只是场景里面没有东西在动而已，渲染器仍然在以每秒30张图的速度刷新着一个相同位置的小球而已。），所以我们在enterframe的方法里加入一句。<br />
            sphere.rotationY+=1; //延Y轴以顺时针方向，小球每祯转1。（我们下次会专门讲到这方面的控制，别担心。）</p>
            <p>ctrl+enter,运行发动！</p>
            <p>兴奋吧，去泡杯茶小小的庆祝一下吧~站起来跳两下也可，身边有伙伴也可拥抱（别太久=_=）。 <br />
            有空记得自己把玩一下里面的参数，多熟悉一下哦，加油！<br />
            <a href="http://www.flab3d.com/topiclist.php" class="s2">有任何不清楚的地方，欢迎到讨论区发言。（无需注册）</a></p>
            <p align="left">DDM君<br />
            Flab3D.com</p>
            <p>
            <a href="http://www.flab3d.com/aslib/Flash3d%E7%A0%94%E7%A9%B6%E6%89%80%E6%8E%A8%E8%8D%90%E7%9A%84%E6%9C%80%E6%96%B0pv3d%E5%82%BB%E7%93%9C%E5%8C%85.rar" class="s2">Flash3d研究所推荐的Pv3d傻瓜包下载</a>
            <br />
            <a href="http://www.flab3d.com/aslib/example01.rar" class="s2">源文件下载</a>
            </p>
            <p><br />
            </p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/sealyu/aggbug/241462.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-11-19 19:35 <a href="http://www.blogjava.net/sealyu/archive/2008/11/19/241462.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Papervision3D 基本3D交互场景事件（转）</title><link>http://www.blogjava.net/sealyu/archive/2008/11/19/241374.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Wed, 19 Nov 2008 06:52:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/11/19/241374.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/241374.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/11/19/241374.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/241374.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/241374.html</trackback:ping><description><![CDATA[在Papervision3D中，3D场景交互事件主要用到了一个新的类：InteractiveScene3DEvent，这个类在
org.papervision3d.events包中，主要定义了有关鼠标和3D对象之间交互时事件驱动的一些静态属性，如点击、移动、滑开、滑上、按
下、按下并释放、按下释放移开等。<br />
该类的构造函数是：&nbsp;
<p><wbr></p>
<table style="width: 80%;" align="center" border="1" cellpadding="3" cellspacing="1">
    <tbody>
        <tr>
            <td>InteractiveScene3DEvent (type:String,
            container3d:DisplayObject3D = null, bubbles:Boolean = false,
            cancelable:Boolean = false)</td>
        </tr>
    </tbody>
</table>
<p>
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
详细的参数就不再一一解释，你只要记住它的用法比照Flash CS3中的MouseEvent类使用，这里简单提供在Flash
CS3帧上的测试代码(使用前不要忘了要import包类)：&nbsp;<wbr></p>
<table style="width: 80%; height: 290px;" align="center" border="1" cellpadding="3" cellspacing="1">
    <tbody>
        <tr>
            <td>
            <p>import org.papervision3d.events.InteractiveScene3DEvent;<br />
            addEventListener(InteractiveScene3DEvent.OBJECT_CLICK,
            onHandle);<br />
            addEventListener(InteractiveScene3DEvent.OBJECT_MOVE,
            onHandle);<br />
            addEventListener(InteractiveScene3DEvent.OBJECT_OUT,
            onHandle);<br />
            addEventListener(InteractiveScene3DEvent.OBJECT_OVER,
            onHandle);<br />
            addEventListener(InteractiveScene3DEvent.OBJECT_PRESS,
            onHandle);<br />
            addEventListener(InteractiveScene3DEvent.OBJECT_RELEASE,
            onHandle);<br />
            addEventListener(InteractiveScene3DEvent.OBJECT_RELEASE_OUTSIDE,
            onHandle);</p>
            <p>private function onHandle(e:InteractiveScene3DEvent):void<br />
            {<br />
            &nbsp;<wbr>trace(e.type);<br />
            }</p>
            </td>
        </tr>
    </tbody>
</table>
<p>
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
注意观察输出面板相关的信息！</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
<strong><font color="#0000ff">基本3D交互</font><font color="#0000ff">场景事件实例：</font></strong></p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
本实例是场景中有一个旋转的平面Plane，正反面都有贴图，当用鼠标移上或移开时交换显示不同的图片，点击该平面时向相反方向旋转。在代码中，我预先创
建一个3D对象Plane平面，并使用两张不同的图片来做材质贴图，然后使用InteractiveScene3DEvent来驱动鼠标事件。效果图示如
下：</p>
<p align="center"><a href="http://blog.photo.sina.com.cn/showpic.html#blogid=49b35d540100a54p&amp;url=http://static8.photo.sina.com.cn/orignal/49b35d54451f9eed1a3e7" target="_blank"><img src="http://static8.photo.sina.com.cn/bmiddle/49b35d54451f9eed1a3e7"  alt="" /></a></p>
<p align="center">&nbsp;<wbr></p>
<p align="center"><a href="http://blog.photo.sina.com.cn/showpic.html#blogid=49b35d540100a54p&amp;url=http://static2.photo.sina.com.cn/orignal/49b35d54451f9f0dbd1c1" target="_blank"><img src="http://static2.photo.sina.com.cn/bmiddle/49b35d54451f9f0dbd1c1"  alt="" /></a></p>
<p align="left">
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
<strong><font color="#0000ff">具体代码如下：</font></strong></p>
<p>&nbsp;<wbr></p>
<table style="width: 100.34%; height: 33px;" align="center" border="1" cellpadding="3" cellspacing="1">
    <tbody>
        <tr>
            <td>&nbsp;<wbr>package<br />
            {<br />
            &nbsp;<wbr><br />
            &nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> import
            PaperBase;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> import
            org.papervision3d.objects.DisplayObject3D;<br />
            &nbsp;<wbr>import
            org.papervision3d.events.InteractiveScene3DEvent;&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> import
            org.papervision3d.materials.BitmapFileMaterial;<br />
            &nbsp;<wbr>import
            org.papervision3d.objects.primitives.Plane;<br />
            &nbsp;<wbr><br />
            &nbsp;<wbr>import it.flashfuck.debugger.FPSMonitor;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> public class
            MainInteractiveScene3dEv<wbr>ent extends PaperBase<br />
            &nbsp;<wbr>{<br />
            &nbsp;<wbr>&nbsp;<wbr>private var
            ourMaterial:BitmapFileMaterial = new
            BitmapFileMaterial("img/pic43.jpg");//用于plane平面对象上的材质贴图<br />
            &nbsp;<wbr>&nbsp;<wbr>private var
            ourOverMaterial:BitmapFileMaterial = new
            BitmapFileMaterial("img/pic12.jpg");//用于当鼠标移到plane平面上时的材质贴图<br />
            &nbsp;<wbr>&nbsp;<wbr>private var yawspeed:Number =
            3;//设置yaw()方法的旋转角度<br />
            &nbsp;<wbr>&nbsp;<wbr>private var
            plane:DisplayObject3D;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            public function MainInteractiveScene3dEv<wbr>ent()<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            addChild(new FPSMonitor());<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            init();<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            override protected function init3d():void<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            ourMaterial.interactive = true;//设置材质交互<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            ourMaterial.doubleSided = true;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            ourOverMaterial.interactive = true;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            ourOverMaterial.doubleSided = true;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            plane = new Plane(ourMaterial,1000,1000,4,4);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            default_scene.addChild(plane);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            plane.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS,
            onInteractiveHandle);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            plane.addEventListener(InteractiveScene3DEvent.OBJECT_OUT,
            onInteractiveHandle);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            plane.addEventListener(InteractiveScene3DEvent.OBJECT_OVER,
            onInteractiveHandle);&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> private
            function onInteractiveHandle(e:InteractiveScene3DEvent):void<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> if (e.type
            == "mousePress")<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            yawspeed *= -1;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            if (e.type == "mouseOut")<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            plane.material=ourMaterial<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            if (e.type == "mouseOver")<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            plane.material = ourOverMaterial;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            override protected function processFrame():void<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            plane.yaw(yawspeed);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br />
            }</td>
        </tr>
    </tbody>
</table>
&nbsp;
<div id="articleBody" class="articleContent"><wbr>&nbsp;<wbr>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
<strong><font color="#0000ff">总结</font></strong>：本节主要是关于交互场景3D事件类的基本用法，比
较简单。实际上，该类的使用和Flash
CS3中的MouseEvent类一样；另外需要注意的是，该类定义的是静态属性，因此可以&#8220;类名.属性&#8221;的方式直接使用；事件处理器函数可以调用同一个
函数实现不同的功能，如本例中对3D鼠标事件的处理采用if条件来实现指定的事件处理，算是对代码的一种优化吧。如果对代码中相关的材质贴图不是很明白，
可以参看前面的内容。</p>
<p><font color="#ff0000"><font color="#000000">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr></font>
<strong>本教程可自由转载，请注明转载出处，谢谢~！</strong></font></p>
</div>
<img src ="http://www.blogjava.net/sealyu/aggbug/241374.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-11-19 14:52 <a href="http://www.blogjava.net/sealyu/archive/2008/11/19/241374.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Papervision3D 高级3D交互场景事件（一） （转）</title><link>http://www.blogjava.net/sealyu/archive/2008/11/19/241375.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Wed, 19 Nov 2008 06:52:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/11/19/241375.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/241375.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/11/19/241375.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/241375.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/241375.html</trackback:ping><description><![CDATA[上一课主要学习基本3D交互场景事件的用法，这一课记录高级用法~！
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
我以旋转的立方体为例，3D场景中有一个立方体，立方体的6个面每一个面都有一幅图（贴图），当鼠标点击其中的任一面时，缓动放大，再点击时缓动缩小恢复原状继续旋转。效果图如下：</p>
<p align="center"><a href="http://blog.photo.sina.com.cn/showpic.html#blogid=49b35d540100a5vd&amp;url=http://static5.photo.sina.com.cn/orignal/49b35d544521f9db1b554" target="_blank"><img src="http://www.blogjava.net/images/blogjava_net/sealyu/49b35d544521f9db1b554.jpg" alt="" width="552" height="451" /></a></p>
<p align="center">鼠标未点击时不断旋转的立方体效果</p>
<p align="center"><a href="http://blog.photo.sina.com.cn/showpic.html#blogid=49b35d540100a5vd&amp;url=http://static13.photo.sina.com.cn/orignal/49b35d544521fa10f820c" target="_blank"><img src="http://static13.photo.sina.com.cn/bmiddle/49b35d544521fa10f820c" alt="" /></a></p>
<p align="center">鼠标点击时缓动放大效果</p>
<p align="left">&nbsp;<wbr>&nbsp;<wbr> 效果代码如下：</p>
<p align="left">&nbsp;<wbr></p>
<table style="width: 92.44%; height: 33px;" align="center" border="1" cellpadding="3" cellspacing="1">
    <tbody>
        <tr>
            <td>
            <p>&nbsp;<wbr>package&nbsp;<wbr><br />
            {<br />
            &nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> import
            flash.display.DisplayObject;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> import
            org.papervision3d.materials.BitmapFileMaterial;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> import
            org.papervision3d.materials.utils.MaterialsList;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> import
            org.papervision3d.events.InteractiveScene3DEvent;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> import
            org.papervision3d.objects.primitives.Cube;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> public class
            MainAdvancedInteractiveS<wbr>cene3dEvent extends PaperBase<br />
            &nbsp;<wbr>{<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            //---------------------------------------------------------------6个面对应的material<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            private var frontMaterial:BitmapFileMaterial = new
            BitmapFileMaterial("img/concretetex02.jpg");<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            private var backMaterial:BitmapFileMaterial = new
            BitmapFileMaterial("img/concretetex03.jpg");<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            private var leftMaterial:BitmapFileMaterial = new
            BitmapFileMaterial("img/bashi.jpg");<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> private var
            rightMaterial:BitmapFileMaterial = new
            BitmapFileMaterial("img/pic12.jpg");<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            private var topMaterial:BitmapFileMaterial = new
            BitmapFileMaterial("img/pic37.jpg");<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            private var bottomMaterial:BitmapFileMaterial = new
            BitmapFileMaterial("img/pic43.jpg");<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            //---------------------------------------------------------------目标旋转初始值<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            private var targetrotationX:Number = 0;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            private var targetrotationY:Number = 0;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            private var targetrotationZ:Number = 0;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            //---------------------------------------------------------------判断是否缓动<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            private var tweening:Boolean = false;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            private var cube:Cube;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            public function MainAdvancedInteractiveS<wbr>cene3dEvent()<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            init(550, 400);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            override protected function init3d():void<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            frontMaterial.interactive = true;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            frontMaterial.name = "front";<br />
            &nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            backMaterial.interactive = true;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            backMaterial.name = "back";<br />
            &nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            leftMaterial.interactive = true;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            leftMaterial.name = "left";<br />
            &nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            rightMaterial.interactive = true;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            rightMaterial.name = "right";<br />
            &nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            topMaterial.interactive = true;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            topMaterial.name = "top";<br />
            &nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            bottomMaterial.interactive = true;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            bottomMaterial.name =
            "bottom";&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>
            //------------------------------------------------------------Cube<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            cube = new Cube(new MaterialsList(<br />
            &nbsp;<wbr>&nbsp;<wbr> {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            front: frontMaterial,<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            back: backMaterial,<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            left: leftMaterial,<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            right: rightMaterial,<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            top: topMaterial,<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            bottom: bottomMaterial<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            } ), 500, 500, 500, 3, 3, 3);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            cube.addEventListener( InteractiveScene3DEvent.OBJECT_PRESS,
            onPress);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            default_scene.addChild(cube);<br />
            &nbsp;<wbr>&nbsp;<wbr>}<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            private function onPress( e:InteractiveScene3DEvent ):void<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            if (tweening)<br />
            &nbsp;<wbr>&nbsp;<wbr> {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            tweening = false;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }<br />
            &nbsp;<wbr>&nbsp;<wbr> else<br />
            &nbsp;<wbr>&nbsp;<wbr> {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            switch(e.face3d.material.name)<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            case "front":<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            targetrotationX = 0;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            targetrotationY = 180;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            targetrotationZ = 0;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            tweening = true;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            break;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            case "back":<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            targetrotationX = 0;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            targetrotationY = 0;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            targetrotationZ = 0;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            tweening = true;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            break;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            case "left":<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            targetrotationX = 0;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            targetrotationY = -90;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            targetrotationZ = 0;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            tweening = true;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            break;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            case "right":<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            targetrotationX = 0;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            targetrotationY = 90;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            targetrotationZ = 0;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            tweening = true;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            break;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            case "top":<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            targetrotationX = 90;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            targetrotationY = 0;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            targetrotationZ = 0;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            tweening = true;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            break;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            case "bottom":<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            targetrotationX = -90;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            targetrotationY = 0;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            targetrotationZ = 180;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            tweening = true;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            break;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>}<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>}<br />
            &nbsp;<wbr>&nbsp;<wbr>}<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            override protected function processFrame():void<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            if (tweening)<br />
            &nbsp;<wbr>&nbsp;<wbr> {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            if (default_camera.zoom &lt; 6.8)<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            default_camera.zoom += Math.sqrt(6.8-default_camera.zoom)/5;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            //X<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            if (cube.rotationX &lt; targetrotationX)<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            cube.rotationX += Math.sqrt(targetrotationX-cube.rotationX);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            cube.rotationX = Math.round(cube.rotationX);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }else if (cube.rotationX &gt; targetrotationX)<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            cube.rotationX -= Math.sqrt(cube.rotationX-targetrotationX);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            cube.rotationX = Math.round(cube.rotationX);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            //Y<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            if (cube.rotationY &lt; targetrotationY)<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            cube.rotationY += Math.sqrt(targetrotationY-cube.rotationY);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            cube.rotationY = Math.round(cube.rotationY);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }else if (cube.rotationY &gt; targetrotationY)<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            cube.rotationY -= Math.sqrt(cube.rotationY-targetrotationY);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            cube.rotationY = Math.round(cube.rotationY);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            //Z<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            if (cube.rotationZ &lt; targetrotationZ)<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            cube.rotationZ += Math.sqrt(targetrotationZ-cube.rotationZ);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            cube.rotationZ = Math.round(cube.rotationZ);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }else if (cube.rotationZ &gt; targetrotationZ)<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            cube.rotationZ -= Math.sqrt(cube.rotationZ-targetrotationZ);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            cube.rotationZ = Math.round(cube.rotationZ);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }<br />
            &nbsp;<wbr>&nbsp;<wbr> }<br />
            &nbsp;<wbr>&nbsp;<wbr> //<br />
            &nbsp;<wbr>&nbsp;<wbr> else<br />
            &nbsp;<wbr>&nbsp;<wbr> {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            if (default_camera.zoom &gt; 2)<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            default_camera.zoom -= Math.sqrt(default_camera.zoom-2)/5;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            cube.rotationX += 2;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            cube.rotationY += 2;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            if (cube.rotationX&gt;= 360) cube.rotationX = 0;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            if (cube.rotationY&gt;= 360) cube.rotationY = 0;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br />
            }</p>
            </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;<wbr></p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
代码比较长，关键处已加以说明~！</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
这段代码依然是有关InteractiveScene3DEvent类的用法，由于立方体有6个面，为了显示每个面的不同，采用了6张图片做贴图；为了能让立方体的每个面都能实现鼠标交互，在init3d()函数中设置6个面的交互属性为true：</p>
<table style="width: 80%;" align="center" border="1" cellpadding="3" cellspacing="1">
    <tbody>
        <tr>
            <td>
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            frontMaterial.interactive = true;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            frontMaterial.name =
            "front";&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            backMaterial.interactive = true;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            backMaterial.name =
            "back";&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            leftMaterial.interactive = true;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            leftMaterial.name =
            "left";&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            rightMaterial.interactive = true;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            rightMaterial.name =
            "right";&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            topMaterial.interactive = true;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            topMaterial.name =
            "top";&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            bottomMaterial.interactive = true;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            bottomMaterial.name = "bottom";&nbsp;<wbr></td>
        </tr>
    </tbody>
</table>
<p>&nbsp;<wbr></p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
由于要求有缓动效果，所以在帧频处理函数中通过默认相机的放大：</p>
<p>&nbsp;<wbr></p>
<table style="width: 80%;" align="center" border="1" cellpadding="3" cellspacing="1">
    <tbody>
        <tr>
            <td>&nbsp;<wbr>default_camera.zoom +=
            Math.sqrt(6.8-default_camera.zoom)/5;</td>
        </tr>
    </tbody>
</table>
<p>&nbsp;<wbr></p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 缩小：</p>
<p>&nbsp;<wbr></p>
<table style="width: 80%;" align="center" border="1" cellpadding="3" cellspacing="1">
    <tbody>
        <tr>
            <td>&nbsp;<wbr>default_camera.zoom -=
            Math.sqrt(default_camera.zoom-2)/5;</td>
        </tr>
    </tbody>
</table>
<p>&nbsp;<wbr></p>
<p>
来达到效果。接着通过判断立方体的X、Y、Z三个方向的旋转进一步设定缓动放大缩小过程效果，从而达到高级3D场景交互事件效果的运用目的。</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
<font color="#0000ff">总结：本节主要是关于高级3D场景交互事件用法，特别是在一些缓动算法上有一定的难度，通过平方根函数求两点之间的距离达到缓动放大、缩小的效果(这个我习惯称为逼近&#8220;定点距离缓动&#8221;)。</font></p>
<p><strong><font color="#ff0000">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
本教程可自由转载，请注明转载出处，谢谢~！</font></strong></p>
<img src ="http://www.blogjava.net/sealyu/aggbug/241375.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-11-19 14:52 <a href="http://www.blogjava.net/sealyu/archive/2008/11/19/241375.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Papervision3D 3D键盘交互效果（转） </title><link>http://www.blogjava.net/sealyu/archive/2008/11/19/241373.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Wed, 19 Nov 2008 06:51:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/11/19/241373.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/241373.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/11/19/241373.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/241373.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/241373.html</trackback:ping><description><![CDATA[<font color="#0000ff">1、修改PaperBase基类</font>，存贮新的相机、场景和视图区，然后重新渲染产生新的效果。因为，首先需要定义三个新的类成员属性：
<p>&nbsp;<wbr></p>
<table style="width: 80%;" align="center" border="1" cellpadding="3" cellspacing="1">
    <tbody>
        <tr>
            <td>&nbsp;<wbr>public var
            current_scene:Scene3D;//为实现3D键盘交互准备<br />
            &nbsp;<wbr>public var
            current_camera:CameraObject3D;//为实现3D键盘交互准备<br />
            &nbsp;<wbr>public var
            current_viewport:Viewport3D;//为实现3D键盘交互准备</td>
        </tr>
    </tbody>
</table>
<p>&nbsp;<wbr></p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
然后修改initPapervision函数，把原来默认的场景、相机、视图区更改为这三个类属性：</p>
<p>&nbsp;<wbr></p>
<table style="width: 80%;" align="center" border="1" cellpadding="3" cellspacing="1">
    <tbody>
        <tr>
            <td>&nbsp;<wbr>current_camera = default_camera;<br />
            &nbsp;<wbr>current_scene = default_scene;<br />
            &nbsp;<wbr>current_viewport = viewport;</td>
        </tr>
    </tbody>
</table>
<p>&nbsp;<wbr></p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
用新的类成员变量重新渲染：</p>
<p>&nbsp;<wbr></p>
<table style="width: 80%;" align="center" border="1" cellpadding="3" cellspacing="1">
    <tbody>
        <tr>
            <td>&nbsp;<wbr>renderer.renderScene(current_scene,
            current_camera, current_viewport);</td>
        </tr>
    </tbody>
</table>
<p>&nbsp;<wbr></p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
<font color="#0000ff">2、新建3D键盘交互类：MainKeyboardInteraction</font></p>
<p><font color="#0000ff">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr></font>
<font color="#000000">在这类中我将使用Plane（平面类）加载外部图片贴图来实现3D键盘交互，并且设定使用键盘上的w、a、s、d这4个按键控制Plane的平移，旋转交互效果，代码如下：</font></p>
<p>&nbsp;<wbr></p>
<table style="width: 80%;" align="center" border="1" cellpadding="3" cellspacing="1">
    <tbody>
        <tr>
            <td>&nbsp;<wbr>package<br />
            {<br />
            &nbsp;<wbr><br />
            &nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> import
            PaperBase;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> import
            flash.events.KeyboardEvent;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> import
            org.papervision3d.cameras.FreeCamera3D;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> import
            org.papervision3d.objects.primitives.Plane;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> import
            org.papervision3d.materials.BitmapFileMaterial;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> public class
            MainKeyboardInteraction extends PaperBase {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            public var wdown:Boolean = false;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            public var adown:Boolean = false;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            public var sdown:Boolean = false;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            public var ddown:Boolean = false;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            public var camera:FreeCamera3D;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            public function MainKeyboardInteraction() {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            init();<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            public function onKeyDown( event:KeyboardEvent ):void {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            switch(event.keyCode) {//w:87&nbsp;<wbr>
            a:65&nbsp;<wbr> s:83&nbsp;<wbr> d:68<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            case 87:<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            wdown = true;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            break;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            case 65:<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            adown = true;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            break;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            case 83:<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            sdown = true;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            break;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            case 68:<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            ddown = true;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            break;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            public function onKeyUp( event:KeyboardEvent ):void {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            switch(event.keyCode) {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            case 87:<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            wdown = false;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            break;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            case 65:<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            adown = false;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            break;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            case 83:<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            sdown = false;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            break;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            case 68:<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            ddown = false;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            break;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            override protected function init3d():void {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            camera = new FreeCamera3D(1, 500);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            camera.moveUp(400);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            current_camera = camera;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            for (var x:Number = 0; x &lt;4; x++) {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            for (var y:Number = 0; y &lt;4; y++) {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            var p:Plane = new Plane(new
            BitmapFileMaterial("img/concretetex02.jpg"));<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            p.pitch(90);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            p.x = (x * 1000)-2000;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            p.z = (y * 1000)-2000;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            default_scene.addChild(p);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            override protected function processFrame():void {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            if (wdown) {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            camera.moveForward(60);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            if (sdown) {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            camera.moveBackward(60);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            if (adown) {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            camera.yaw( -8);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            if (ddown) {<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            camera.yaw( 8);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            }<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br />
            }</td>
        </tr>
    </tbody>
</table>
<p>&nbsp;<wbr></p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
代码思路清晰，无非是用stage来侦听事件（键盘事件）~！最终效果截图如下：</p>
<p align="center"><a href="http://blog.photo.sina.com.cn/showpic.html#blogid=49b35d540100a3yu&amp;url=http://static6.photo.sina.com.cn/orignal/49b35d54451bbccaa24a5" target="_blank"><img src="http://static6.photo.sina.com.cn/bmiddle/49b35d54451bbccaa24a5" alt="" /></a></p>
<p align="left">
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
总结：实现Papervision3D键盘交互效果要注意对舞台的侦听事件的处理，当需要侦听键盘时不要忘了事先import键盘类，并同时override父类相关的函数。</p>
<p align="left"><strong><font color="#ff0000">&nbsp;<wbr>&nbsp;<wbr>
本教程可自由转载，请注明转载出处，谢谢~！</font></strong></p>
<img src ="http://www.blogjava.net/sealyu/aggbug/241373.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-11-19 14:51 <a href="http://www.blogjava.net/sealyu/archive/2008/11/19/241373.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Papervision3D3D鼠标交互效果（转）</title><link>http://www.blogjava.net/sealyu/archive/2008/11/19/241372.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Wed, 19 Nov 2008 06:50:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/11/19/241372.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/241372.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/11/19/241372.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/241372.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/241372.html</trackback:ping><description><![CDATA[Papervision3D实现鼠标交互的效果也比较简单，这里用上一课中的乳牛效果来实现这样的鼠标交互算法：
<p align="center"><a href="http://blog.photo.sina.com.cn/showpic.html#blogid=49b35d540100a3ht&amp;url=http://static14.photo.sina.com.cn/orignal/49b35d54451a76b5fb47d" target="_blank"><img src="http://www.blogjava.net/images/blogjava_net/sealyu/1.jpg" alt="" width="1082" height="727" /></a></p>
<p align="left">
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <font color="#0000ff"><font color="#ff0000">代码解释</font>：</font></p>
<p align="left"><font color="#0000ff">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
1、这段代码只比上一课代码中新增了一个distance属性，目的是确定相机在场景中的位置不至于和对象（cow乳牛）随鼠标移动相距过大；</font></p>
<p align="left"><font color="#0000ff">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
2、这段代码重新修改的函数processFrame中的代码，目的是为了实现场景中的3D模型随鼠标的位置变动不断变动，从而达到鼠标交互的目的。</font>效果最终截图如下：</p>
<p align="center"><a href="http://blog.photo.sina.com.cn/showpic.html#blogid=49b35d540100a3ht&amp;url=http://static14.photo.sina.com.cn/orignal/49b35d54451a77f297b4d" target="_blank"><img src="http://www.blogjava.net/images/blogjava_net/sealyu/2.jpg" alt="" width="556" height="448" /></a></p>
<p align="left">
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
本课最终源代码如下：</p>
<p align="left">&nbsp;<wbr></p>
<table style="width: 100.94%; height: 873px;" align="center" border="1" cellpadding="3" cellspacing="1">
    <tbody>
        <tr>
            <td>&nbsp;<wbr>package<br />
            {<br />
            &nbsp;<wbr><br />
            &nbsp;<wbr><br />
            &nbsp;<wbr>import PaperBase;<br />
            &nbsp;<wbr>import
            org.papervision3d.objects.DisplayObject3D;<br />
            &nbsp;<wbr>import
            org.papervision3d.objects.parsers.Collada;<br />
            &nbsp;<wbr><br />
            &nbsp;<wbr>public class MainMouseInteraction extends
            PaperBase<br />
            &nbsp;<wbr>{<br />
            &nbsp;<wbr>&nbsp;<wbr>public var
            cow:DisplayObject3D;<br />
            &nbsp;<wbr>&nbsp;<wbr>public var distance:Number =
            1000;<br />
            &nbsp;<wbr>&nbsp;<wbr><br />
            &nbsp;<wbr>&nbsp;<wbr>public function
            MainMouseInteraction():void<br />
            &nbsp;<wbr>&nbsp;<wbr>{<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>init();<br />
            &nbsp;<wbr>&nbsp;<wbr>}<br />
            &nbsp;<wbr>&nbsp;<wbr>override protected function
            init3d():void<br />
            &nbsp;<wbr>&nbsp;<wbr>{<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>cow = new
            Collada("collada/cow.dae");<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>cow.moveDown(100);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>cow.scale =
            3;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>cow.pitch(
            -30);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>default_scene.addChild(cow);<br />
            &nbsp;<wbr>&nbsp;<wbr>}<br />
            &nbsp;<wbr>&nbsp;<wbr>override protected function
            processFrame():void<br />
            &nbsp;<wbr>&nbsp;<wbr>{<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>default_camera.y
            = -(((mouseY - (stage.height/2))/stage.height) *
            1600);//确定相机的y范围在800~~-800之间,即当mouseY=0时default_camera.y=800，当mouseY=stage.height时default_camera.y=-800<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>default_camera.moveForward(default_camera.distanceTo(cow)
            - distance);//限定相机相对于cow乳牛模型不要移动到更远的地方<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>cow.rotationY
            = -((mouseX / stage.width) * 360);//使用mouseX来控制cow乳牛Y方向旋转角度<br />
            &nbsp;<wbr>&nbsp;<wbr>}<br />
            &nbsp;<wbr>}<br />
            }</td>
        </tr>
    </tbody>
</table>
<p><font color="#0000ff">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
总结：没有过多的语句就实现了3D中的鼠标交互效果，这个效果尽管很简单~！</font></p>
<p><strong><font color="#ff0000">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
本教程可自由转载，请注明转载出处，谢谢~！</font></strong></p>
<img src ="http://www.blogjava.net/sealyu/aggbug/241372.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-11-19 14:50 <a href="http://www.blogjava.net/sealyu/archive/2008/11/19/241372.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Papervision3D使用复杂模型贴图（转） </title><link>http://www.blogjava.net/sealyu/archive/2008/11/19/241371.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Wed, 19 Nov 2008 06:49:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/11/19/241371.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/241371.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/11/19/241371.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/241371.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/241371.html</trackback:ping><description><![CDATA[<div id="articleBody" class="articleContent">
<p style="text-indent: 2em;">
复杂模型这里指的是用第三方软件预先制作的模型，最常见的是用3DMAX软件绘制的模型，在Papervision3D中，能够使用这种模型的称之为
Collada（可拉大），实话说，我本人对3DMAX软件的建模功能并不是十分熟悉，如果想要快速达到这种建模目的，可以使用一款免费软
件：GoogleSketchUpFree，现从网上找到一款简体中文绿色版，下载地址：<a href="http://x.139.xdowns.com/085/Google%20SketchUp%206.chs.rar">http://x.139.xdowns.com/085/Google%20SketchUp%206.chs.rar</a>（附<font color="#990000">注册信息:</font></p>
<p style="text-indent: 2em;">Name：<a href="http://www.xdowns.com/">www.xdowns.com</a></p>
<p style="text-indent: 2em;">Serial Number：KA-290-30718084-MMM</p>
<p style="text-indent: 2em;">Authorization
Number：4314573-409430-4318663</p>
<p style="text-indent: 2em;">这里简要介绍使用这种模型达到的效果：<br />
</p>
<p style="text-indent: 2em;" align="center"><a href="http://blog.photo.sina.com.cn/showpic.html#blogid=49b35d540100a2yd&amp;url=http://static10.photo.sina.com.cn/orignal/49b35d5445192ed477af9" target="_blank"><img src="http://www.blogjava.net/images/blogjava_net/sealyu/3.jpg" alt="" width="554" height="451" /></a></p>
<p style="text-indent: 2em;" align="left">
这幅截图是使用Papervision3D生成的动画乳牛效果图，3D感十分强烈~！</p>
<p style="text-indent: 2em;" align="left">
想要达到这种效果，在Papervision3D中要用到一个新的类：Collada，它位于
org.papervision3d.objects.parsers包中，此外还要用到一个3D显示对象类DisplayObject3D,它位于
org.papervision3d.objects包中，我要定义的乳牛cow就是用这个类来存贮模型，因此必须先import这两个类,连同基类
PaperBase一共3个类：</p>
<p style="text-indent: 2em;" align="left">&nbsp;<wbr></p>
<table style="width: 80%;" align="center" border="1" cellpadding="3" cellspacing="1">
    <tbody>
        <tr>
            <td>&nbsp;<wbr>import PaperBase;<br />
            &nbsp;<wbr>import
            org.papervision3d.objects.DisplayObject3D;<br />
            &nbsp;<wbr>import
            org.papervision3d.objects.parsers.Collada;</td>
        </tr>
    </tbody>
</table>
<p>&nbsp;<wbr></p>
<p style="text-indent: 2em;" align="left">
&nbsp;<wbr>类import后，就要构造cow乳牛了，即：</p>
<p style="text-indent: 2em;" align="left">&nbsp;<wbr></p>
<table style="width: 80%;" align="center" border="1" cellpadding="3" cellspacing="1">
    <tbody>
        <tr>
            <td>&nbsp;<wbr>public var cow:DisplayObject3D;</td>
        </tr>
    </tbody>
</table>
<p>&nbsp;<wbr></p>
<p style="text-indent: 2em;" align="left">
cow定义完成后，接下来就是进行具体的初始化，这只需要override 父类PaperBase中的init3d()函数：</p>
<p style="text-indent: 2em;" align="left">&nbsp;<wbr></p>
<table style="width: 80%;" align="center" border="1" cellpadding="3" cellspacing="1">
    <tbody>
        <tr>
            <td>&nbsp;<wbr>override protected function
            init3d():void<br />
            &nbsp;<wbr>&nbsp;<wbr>{<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>cow = new
            Collada("collada/cow.dae");<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>cow.moveDown(100);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>cow.scale =
            3;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>cow.pitch(
            -30);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>default_scene.addChild(cow);<br />
            &nbsp;<wbr>&nbsp;<wbr>}</td>
        </tr>
    </tbody>
</table>
<p>&nbsp;<wbr></p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
测试一下即有相应的效果~！</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
<font color="#0000ff">完整的代码如下：</font></p>
<p>&nbsp;<wbr></p>
<table style="width: 80%;" align="center" border="1" cellpadding="3" cellspacing="1">
    <tbody>
        <tr>
            <td>&nbsp;<wbr>package<br />
            {<br />
            &nbsp;<wbr><br />
            &nbsp;<wbr><br />
            &nbsp;<wbr>import PaperBase;<br />
            &nbsp;<wbr>import
            org.papervision3d.objects.DisplayObject3D;<br />
            &nbsp;<wbr>import
            org.papervision3d.objects.parsers.Collada;<br />
            &nbsp;<wbr><br />
            &nbsp;<wbr>public class MainColladaCow extends
            PaperBase<br />
            &nbsp;<wbr>{<br />
            &nbsp;<wbr>&nbsp;<wbr>public var
            cow:DisplayObject3D;<br />
            &nbsp;<wbr>&nbsp;<wbr>public function
            MainColladaCow():void<br />
            &nbsp;<wbr>&nbsp;<wbr>{<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>init();<br />
            &nbsp;<wbr>&nbsp;<wbr>}<br />
            &nbsp;<wbr>&nbsp;<wbr>override protected function
            init3d():void<br />
            &nbsp;<wbr>&nbsp;<wbr>{<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>cow = new
            Collada("collada/cow.dae");<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>cow.moveDown(100);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>cow.scale =
            3;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>cow.pitch(
            -30);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>default_scene.addChild(cow);<br />
            &nbsp;<wbr>&nbsp;<wbr>}<br />
            &nbsp;<wbr>&nbsp;<wbr>override protected function
            processFrame():void<br />
            &nbsp;<wbr>&nbsp;<wbr>{<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>cow.yaw(2);<br />
            &nbsp;<wbr>&nbsp;<wbr>}<br />
            &nbsp;<wbr>}<br />
            }</td>
        </tr>
    </tbody>
</table>
<p>&nbsp;<wbr></p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
补充说明：Collada文件要放在MainColladaCow这个类同包下的collada文件夹中，一共有2个文件：cow.dae和cow.png<a href="http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=4165392" target="_blank"><strong><font style="font-size: 22px;">素材下载点此</font></strong></a>。</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
总结：本课学习了有关复杂模型在Papervision3D中的使用。一般地，使用复杂3D模型时必须要用到Collada类，再进行实例化，重新渲染3D场景即可实现效果~！</p>
<p><strong><font color="#ff0000">&nbsp;<wbr>&nbsp;<wbr>
本教程可自由转载，请注明转载出处，谢谢~！</font></strong></p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr></p>
</div>
<img src ="http://www.blogjava.net/sealyu/aggbug/241371.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-11-19 14:49 <a href="http://www.blogjava.net/sealyu/archive/2008/11/19/241371.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Papervision3D贴图基础（转）</title><link>http://www.blogjava.net/sealyu/archive/2008/11/19/241370.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Wed, 19 Nov 2008 06:48:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/11/19/241370.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/241370.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/11/19/241370.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/241370.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/241370.html</trackback:ping><description><![CDATA[这一课学习在Papervision3D中实现贴图方法。
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
还记滴在第四课&#8220;一个旋转圆锥体效果&#8221;吧，那个简单的效果只是一些线条显示了这个圆锥体：</p>
<p align="center"><a href="http://blog.photo.sina.com.cn/showpic.html#blogid=49b35d540100a2rx&amp;url=http://static3.photo.sina.com.cn/orignal/49b35d544518de4d95bc2" target="_blank"><img src="http://static3.photo.sina.com.cn/bmiddle/49b35d544518de4d95bc2"  alt="" /></a></p>
<p align="left">
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
要实现在这个基础上把这个圆锥体表面加上一幅图的效果怎么做呢？这里就要用到一个Papervision3D中的一个贴图
类：BitmapFileMaterial，这是一个什么类？简单的说这个类是实现从外部加载图片，实现Papervision3D材质贴图的效果，其用
法很简单，其语法是：</p>
<p align="left">&nbsp;<wbr></p>
<table style="width: 76.35%; height: 39px;" align="center" border="1" cellpadding="3" cellspacing="1">
    <tbody>
        <tr>
            <td>
            <p>BitmapFileMaterial(<a href="http://blog.sina.com.cn/s/String">url:String</a>="");</p>
            </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;<wbr></p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
在实际使用中只需要先导入这个类，然后直接new
BitmapFileMaterial("所加载的图片地址")即可。需要说明的是，加载的图片格式是jpg,png,bmp等。</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
在第四课代码的基础上稍加变动，立即就有一个旋转贴图效果的圆锥体：</p>
<p align="center"><a href="http://blog.photo.sina.com.cn/showpic.html#blogid=49b35d540100a2rx&amp;url=http://static16.photo.sina.com.cn/orignal/49b35d544518e0a9b1d5f" target="_blank"><img src="http://static16.photo.sina.com.cn/bmiddle/49b35d544518e0a9b1d5f"  alt="" /></a></p>
<p align="left">最终代码如下（注：你可以更换你喜欢的图片）：</p>
<p align="left">&nbsp;<wbr></p>
<table style="width: 93.34%; height: 705px;" border="1" cellpadding="3" cellspacing="1">
    <tbody>
        <tr>
            <td>&nbsp;<wbr>package<br />
            {<br />
            &nbsp;<wbr><br />
            &nbsp;<wbr>import flash.display.Sprite;<br />
            &nbsp;<wbr><br />
            &nbsp;<wbr>import PaperBase;<br />
            &nbsp;<wbr>import
            org.papervision3d.objects.primitives.Cone;<br />
            &nbsp;<wbr>import
            org.papervision3d.materials.BitmapFileMaterial;<br />
            &nbsp;<wbr><br />
            &nbsp;<wbr>public class MainConeBitmap extends
            PaperBase<br />
            &nbsp;<wbr>{<br />
            &nbsp;<wbr>&nbsp;<wbr>public var cone:Cone = new
            Cone(new BitmapFileMaterial("<a href="http://papervision2.com/wp-content/downloads/ourtex.jpg">http://papervision2.com/wp-content/downloads/ourtex.jpg</a>"));<br />
            &nbsp;<wbr>&nbsp;<wbr>public function
            MainConeBitmap():void<br />
            &nbsp;<wbr>&nbsp;<wbr>{<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>init();<br />
            &nbsp;<wbr>&nbsp;<wbr>}<br />
            &nbsp;<wbr>&nbsp;<wbr>override protected function
            init3d():void<br />
            &nbsp;<wbr>&nbsp;<wbr>{<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>cone.scale =
            5;<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>cone.pitch(
            -40);<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>default_scene.addChild(cone);<br />
            &nbsp;<wbr>&nbsp;<wbr>}<br />
            &nbsp;<wbr>&nbsp;<wbr>override protected function
            processFrame():void<br />
            &nbsp;<wbr>&nbsp;<wbr>{<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>cone.yaw(5);<br />
            &nbsp;<wbr>&nbsp;<wbr>}<br />
            &nbsp;<wbr>}<br />
            }</td>
        </tr>
    </tbody>
</table>
<p>&nbsp;<wbr></p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
总结：本课学习了Papervision3D中贴图的使用，比较简单。如果你有兴趣，把第五课的内容稍加改动，看看有什么样的效果~！建议找一张地球的平面图(这里有一张<a href="http://photo.sina.com.cn/list/photo_src.php?type=orignal&amp;pic_id=49b35d542b1dd25beab3d">http://photo.sina.com.cn/list/photo_src.php?type=orignal&amp;pic_id=49b35d542b1dd25beab3d</a>)来实现这个效果(提示:实现这个效果请参考球体函数原型中的参数说明)，以下是这个效果的最终截图，呵呵。。。</p>
<p align="center"><a href="http://blog.photo.sina.com.cn/showpic.html#blogid=49b35d540100a2rx&amp;url=http://static1.photo.sina.com.cn/orignal/49b35d544518e7ef13a40" target="_blank"><img src="http://static1.photo.sina.com.cn/bmiddle/49b35d544518e7ef13a40"  alt="" /></a></p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
<strong><font color="#ff0000">本教程可自由转载，请注明转载出处，谢谢~！</font></strong></p>
<img src ="http://www.blogjava.net/sealyu/aggbug/241370.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-11-19 14:48 <a href="http://www.blogjava.net/sealyu/archive/2008/11/19/241370.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ColorMatrixFilter--颜色矩阵滤镜（转）</title><link>http://www.blogjava.net/sealyu/archive/2008/11/19/241368.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Wed, 19 Nov 2008 06:42:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/11/19/241368.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/241368.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/11/19/241368.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/241368.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/241368.html</trackback:ping><description><![CDATA[ColorMatrixFilter--颜色矩阵滤镜(flash.filters.ColorMatrixFilter)
在颗粒等级上提供给你更好的控制方法。ColorMatrixFilter为
4行5列的多维矩阵(20个元素的数组)。图1是与ColorMatrixFilter等同的矩阵：
<p align="center"><a href="http://blog.photo.sina.com.cn/showpic.html#blogid=49b35d540100aks4&amp;url=http://static2.photo.sina.com.cn/orignal/49b35d54g54f3b2469641" target="_blank"><img src="http://static2.photo.sina.com.cn/bmiddle/49b35d54g54f3b2469641"  alt="" /></a></p>
<p align="center"><font color="#ff00ff">图1.
与ColorMatrixFilter等同的矩阵</font></p>
<p align="left">
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
红，绿，蓝通道的值由如下所示计算方法所决定：<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> CODE:</p>
<p align="left">&nbsp;<wbr></p>
<table style="width: 94.1%; height: 102px;" align="center" border="1" cellpadding="3" cellspacing="1">
    <tbody>
        <tr>
            <td>
            <p align="left">redResult&nbsp;<wbr>&nbsp;<wbr> =
            a[0] * srcR + a[1] * srcG + a[2] * srcB + a[3] * srcA + a[4]<br />
            greenResult = a[5] * srcR + a[6] * srcG + a[7] * srcB + a[8] * srcA
            + a[9]<br />
            blueResult&nbsp;<wbr> = a[10] * srcR + a[11] * srcG + a[12]
            * srcB + a[13] * srcA + a[14]<br />
            alphaResult = a[15] * srcR + a[16] * srcG + a[17] * srcB + a[18] *
            srcA + a[19]</p>
            </td>
        </tr>
    </tbody>
</table>
&nbsp;
<div id="articleBody" class="articleContent"><wbr>&nbsp;<wbr>&nbsp;<wbr>
可以看出，第一行的值决定了红色值，第二行决定绿色，第三行蓝色，第四行是透明(Alpha)通道值。同样可以看出首四栏值是与红，绿，蓝，alpha通
道值的乘积，而第五栏的值分别是和(偏移量)。注意每行的源值和结果值都是在0到255的区间内。因此即使各个通道的值小于0或大于255都会被强制到该
区间内。我来举些例子说明它的原理。<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
如果你想在红色通道加100(偏移量),将a[4]设置为100，如图2:
<p>&nbsp;<wbr></p>
<p align="center"><a href="http://blog.photo.sina.com.cn/showpic.html#blogid=49b35d540100aks4&amp;url=http://static4.photo.sina.com.cn/orignal/49b35d54g54f3c852fe73" target="_blank"><img src="http://static4.photo.sina.com.cn/bmiddle/49b35d54g54f3c852fe73"  alt="" /></a></p>
<p align="center"><font color="#ff00ff">图2. 红色值增加100</font></p>
<p align="left">
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
如果想使绿色通道加倍，将a[6]设为2,如图3:</p>
<p align="center"><a href="http://blog.photo.sina.com.cn/showpic.html#blogid=49b35d540100aks4&amp;url=http://static13.photo.sina.com.cn/orignal/49b35d54g54f3deb1308c" target="_blank"><img src="http://static13.photo.sina.com.cn/bmiddle/49b35d54g54f3deb1308c"  alt="" /></a></p>
<p align="center"><font color="#ff00ff">图3. 绿色加倍</font></p>
<p align="left">
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
如果你要使结果图像中的蓝色与原图的红色数量相等，将a[10]设为1， a[12]设为0 ，如图4:</p>
<p align="center"><a href="http://blog.photo.sina.com.cn/showpic.html#blogid=49b35d540100aks4&amp;url=http://static3.photo.sina.com.cn/orignal/49b35d54g54f3e7661782" target="_blank"><img src="http://static3.photo.sina.com.cn/bmiddle/49b35d54g54f3e7661782"  alt="" /></a></p>
<p align="center"><font color="#ff00ff">图4. 红色决定蓝色值</font></p>
<p align="left">
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
改变图像的亮度，你需要在每个颜色通道的值改变同样的数量。最简单的途径是在每个通道都设置相同的偏移量。偏移量为正时可以增加亮度为负时可以减小亮度。图5是一个增加亮度的例子:</p>
<p align="center"><a href="http://blog.photo.sina.com.cn/showpic.html#blogid=49b35d540100aks4&amp;url=http://static12.photo.sina.com.cn/orignal/49b35d54g54f3ef0cbf1b" target="_blank"><img src="http://static12.photo.sina.com.cn/bmiddle/49b35d54g54f3ef0cbf1b"  alt="" /></a></p>
<p align="center"><font color="#ff00ff">图5. 增加亮度</font></p>
<p align="left"><font color="#000000">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
你也可以通过将每个颜色通道与一个值相乘按比例的改变亮度，大于1的增加亮度小于1减小亮度。<br />
按照原理，将图像转换为灰度图，你需要将每个通道的部分设为等值。因为有三个通道，你可以将每个通道乘以0.33并将它们相加得到结果值。如图6:</font></p>
<p align="center"><a href="http://blog.photo.sina.com.cn/showpic.html#blogid=49b35d540100aks4&amp;url=http://static1.photo.sina.com.cn/orignal/49b35d54g54f3f6741d60" target="_blank"><font color="#000000"><img src="http://static1.photo.sina.com.cn/bmiddle/49b35d54g54f3f6741d60"  alt="" /></font></a></p>
<p align="center"><font color="#ff00ff">图6.灰度图矩阵</font></p>
<p align="left"><font color="#000000">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
由于不同颜色通道的相对屏幕发光度，但是确实有特殊的提供更加真实的灰度图的&#8220;亮度系数&#8221;值。例如在PS里创建一个纯绿色块然后把它放在一个纯蓝色块，然后将图像灰度化，你会看到原来绿色的地方的灰色会比原来蓝色的区域要亮。<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
在Flash里使用这些矩阵，创建一个ColorMatrixFilter的实例然后将它加入到一个影片剪辑(MovieClip)实例上。下面是一个使绿色加倍的例子：<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
CODE:</font></p>
<p align="left">&nbsp;<wbr></p>
<table style="width: 95.01%; height: 159px;" align="center" border="1" cellpadding="3" cellspacing="1">
    <tbody>
        <tr>
            <td>import flash.filters.ColorMatrixFilter;<br />
            var mat:Array = [ 1,0,0,0,0,<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            0,2,0,0,0,<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            0,0,1,0,0,<br />
            &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
            0,0,0,1,0 ];<br />
            var colorMat:ColorMatrixFilter = new ColorMatrixFilter(mat);<br />
            mc.filters = [colorMat];</td>
        </tr>
    </tbody>
</table>
<p>&nbsp;<wbr></p>
<p align="left">
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
ColorMatrixFilter与一个已知的矩阵使用，你可以完成除了亮度和灰度之外复杂的颜色调整。调整对比度，饱和度和色相等。<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
下面是Adobe官方提供的一个ColorMatrixFilter操作图像的在线演示图：</p>
<p align="left">
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <a href="http://www.adobe.com/devnet/flash/articles/matrix_transformations/ColorMatrixDemo.swf" target="_blank">ColorMatrixFilter</a>&nbsp;<wbr></p>
<p align="left">
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>
下载地址：<a href="http://www.adobe.com/devnet/flash/articles/matrix_transformations/ColorMatrixDemo.swf">http://www.adobe.com/devnet/flash/articles/matrix_transformations/ColorMatrixDemo.swf</a></p>
</div>
<img src ="http://www.blogjava.net/sealyu/aggbug/241368.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-11-19 14:42 <a href="http://www.blogjava.net/sealyu/archive/2008/11/19/241368.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>3D相机焦距  （转） </title><link>http://www.blogjava.net/sealyu/archive/2008/11/19/241367.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Wed, 19 Nov 2008 06:41:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/11/19/241367.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/241367.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/11/19/241367.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/241367.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/241367.html</trackback:ping><description><![CDATA[<font style="font-size: 18px;" color="#0000ff"><strong>以图显示这个原理,很有用~!</strong></font>
<p><strong><font size="4"><font color="#0000ff">&nbsp;<wbr>&nbsp;<wbr></font> <font style="font-size: 18px;" color="#ff00ff">公式:</font></font></strong></p>
<p align="center"><font style="font-size: 14px;" color="#ff0000">var
fl:Numer = (viewport.height / 2) / Math.tan (camera.fov / 2 *
(Math.PI / 180));</font></p>
<p><strong><font size="4" color="#0000ff">&nbsp;<wbr></font></strong></p>
<p align="center"><a href="http://blog.photo.sina.com.cn/showpic.html#blogid=49b35d540100b250&amp;url=http://static6.photo.sina.com.cn/orignal/49b35d54g5891c13ca265" target="_blank"><img src="http://www.blogjava.net/images/blogjava_net/sealyu/49b35d54g5891c13ca265.jpg" alt="" width="973" height="854" /></a></p>
<img src ="http://www.blogjava.net/sealyu/aggbug/241367.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-11-19 14:41 <a href="http://www.blogjava.net/sealyu/archive/2008/11/19/241367.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Papervision3D(Version 1.5)引擎源代码分析(转)</title><link>http://www.blogjava.net/sealyu/archive/2008/11/17/240973.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Mon, 17 Nov 2008 08:19:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/11/17/240973.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/240973.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/11/17/240973.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/240973.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/240973.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: PV3D是一个很著名的Flash 3D免费开源引擎，功能很强大，效率也可以。官方网站是http://www.papervision3d.org/，源代码下载地址是http://code.google.com/p/papervision3d/。目前最新版本是2.0a(Greate White)。下面对PV3D 1.5版进行简单的源代码分析，希望对学习PV3D的同志能有所帮助。下图是PV3D ...&nbsp;&nbsp;<a href='http://www.blogjava.net/sealyu/archive/2008/11/17/240973.html'>阅读全文</a><img src ="http://www.blogjava.net/sealyu/aggbug/240973.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-11-17 16:19 <a href="http://www.blogjava.net/sealyu/archive/2008/11/17/240973.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Papervision3D的一个例子加源码</title><link>http://www.blogjava.net/sealyu/archive/2008/11/13/240400.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Thu, 13 Nov 2008 14:07:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/11/13/240400.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/240400.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/11/13/240400.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/240400.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/240400.html</trackback:ping><description><![CDATA[<div id="post-112">
<div fix="">Dec 17, 2007</div>
<h2><a href="http://www.unitzeroone.com/blog/2007/12/17/papervision3d-20-chrome-example-source/" title="Papervision3D 2.0 Chrome Example + Source.">Papervision3D 2.0 Chrome Example + Source.</a></h2>
<div>
<p><a href="http://www.unitzeroone.com/papervision/examples/envmapping/bin-release/PaperBlending.html"><img alt="chrome.jpg" src="http://www.unitzeroone.com/blog/images/chrome.jpg" height="300" width="400" /></a></p>
<p>Alot of people are trying to come and work with Papervision3D 2.0,
but there&#8217;s not too much examples out there. Believe me, in between
regular work and this we do what we can. I had this example I made to
test some bugs in the envmapmaterial, and I thought I would share the
source, so you can start playing around. Mind you, still haven&#8217;t nailed
the bug. <img src="http://www.unitzeroone.com/blog/wp-includes/images/smilies/icon_wink.gif" alt=";-)" class="wp-smiley" /><br />
<a href="http://www.unitzeroone.com/papervision/examples/envmapping/bin-release/PaperBlending.html">(Right click in this example to view and get the source).</a></p>
</div>
<p><strong>Related posts :</strong>
</p>
<ul>
    <li><a href="http://www.unitzeroone.com/blog/2008/03/17/papervision3d-cut-any-mesh-into-2-new-meshes-source/" rel="bookmark" title="Permanent Link: Papervision3D : Cut any mesh into 2 new meshes. (source).">Papervision3D : Cut any mesh into 2 new meshes. (source).</a></li>
    <li><a href="http://www.unitzeroone.com/blog/2007/12/07/learn-papervision3d-20-workshop/" rel="bookmark" title="Permanent Link: Learn Papervision3D 2.0 : Workshop.">Learn Papervision3D 2.0 : Workshop.</a></li>
    <li><a href="http://www.unitzeroone.com/blog/2005/11/01/flash-8-exampledisplacementsmoke-source/" rel="bookmark" title="Permanent Link: Flash 8 Example:DisplacementSmoke Source">Flash 8 Example:DisplacementSmoke Source</a></li>
    <li><a href="http://www.unitzeroone.com/blog/2008/03/12/papervision3d-shaders-bumpmap-example-sourcecode-for-cs3/" rel="bookmark" title="Permanent Link: Papervision3D Shaders / Bumpmap example sourcecode for CS3">Papervision3D Shaders / Bumpmap example sourcecode for CS3</a></li>
    <li><a href="http://www.unitzeroone.com/blog/2007/06/15/speaking-at-ofla2-today-come-and-join-us/" rel="bookmark" title="Permanent Link: Speaking at OFLA2 today; come and join us.">Speaking at OFLA2 today; come and join us.</a></li>
</ul>
</div>
<img src ="http://www.blogjava.net/sealyu/aggbug/240400.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-11-13 22:07 <a href="http://www.blogjava.net/sealyu/archive/2008/11/13/240400.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Papervision3D入门－使用Collada模型文件</title><link>http://www.blogjava.net/sealyu/archive/2008/11/13/240390.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Thu, 13 Nov 2008 12:54:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/11/13/240390.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/240390.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/11/13/240390.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/240390.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/240390.html</trackback:ping><description><![CDATA[你可以使用3DMAX来建模，或者像我一样使用比较容易上手的建模工具Google SketchUp Pro 6，反正最后导出的文件类型都是Collada。&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp; 使用Collada模型文件，和我们前面的基本教程中教的内容没有多大差别，<span style="color: #ff0000;">唯一不同的地方就是显示对象换成了Collada类型，并且需要根据Collada的模型文件中的材质贴图设置，相应的在AS3代码中进行贴图。<br />
&nbsp;&nbsp; </span>这一步也是初使用Collada模型的朋友，最容易失败的地方，这个地方处理好了，就没什么难度了。<br />
&nbsp;&nbsp; 文本大部分代码建立在<a tip="" href="http://dmh2002.com/post/66.html"><font color="#0279cd">Papervision3D入门－创建PV3D基本内置模型(球体,立方体,柱状体等)</font></a>&nbsp;一文中的代码上。
<p>&nbsp;&nbsp; <span style="color: #ff0000;">首先，需要引用Collada类，并将3D模型文件作为内嵌资源，嵌入到程序中：<span style="color: #800000;"> <span style="font-style: italic;">//...</span>&nbsp;<br />
&nbsp;&nbsp; </span><span style="color: #000000;">import org.papervision3d.objects.Collada;<br />
&nbsp;&nbsp;&nbsp; <span style="color: #999999;"><em><span style="font-style: italic;">//...&nbsp;&nbsp;</span></em></span><br />
&nbsp;&nbsp; [SWF(width='400',height='400',backgroundColor='0xFFFFFF',frameRate='30')]&nbsp;<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; public <span style="font-weight: bold;">class</span> Main extends Sprite <br />
&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <em><span style="color: #ff0000;">//&nbsp;注意Embed标签的source和mimeType值，source是模型文件的相对路径，mimeType一定不要搞错了。</span></em><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>&nbsp;[Embed(source='Demo.dae', mimeType='application/octet-stream')] <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private static <span style="font-weight: bold;">var</span> DemoModel:<span style="font-weight: bold;">Class</span>;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em><span style="color: #999999;"> <span style="font-style: italic;">//...<br />
</span></span></em><span style="font-style: italic;">&nbsp;&nbsp;&nbsp;</span>}<br />
<br />
&nbsp;</span><span style="color: #ff0000;">&nbsp; 接着，我们需要在初始化3D场景的时候把模型一起初始化：<br />
&nbsp;&nbsp;<span style="color: #000000;"> //...&nbsp;<br />
&nbsp;&nbsp; private function Init3D():void <br />
&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var _materialList:Object = {Sketchy_Stone_Ashlar: new BitmapFileMaterial("demo2/Sketchy_Stone_Ashlar.jpg") };<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _displayObj = new Collada(XML(new DemoModel()), new MaterialsList(_materialList));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;_displayObj.x = 30;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;_displayObj.y = -60;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp; //...</span></span></p>
<p>&nbsp;&nbsp;&nbsp;注意上面的<span style="color: #ff0000;">_materialList中的Sketchy_Stone_Ashlar属性，这个属性一定要和Collada的模型文件中的材质贴图名称一样！<br />
&nbsp;&nbsp; </span>否则什么也显示不出来，比如我的模型中的材质贴图信息如下：<br />
&nbsp;&nbsp; &lt;library_materials&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;material id="Sketchy_Stone_AshlarID" name="Sketchy_Stone_Ashlar"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;instance_effect url="#Sketchy_Stone_Ashlar-effect"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/material&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;material id="BackColorID" name="BackColor"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;instance_effect url="#BackColor-effect"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/material&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;material id="ForegroundColorID" name="ForegroundColor"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;instance_effect url="#ForegroundColor-effect"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/material&gt;<br />
&nbsp;&nbsp; &lt;/library_materials&gt;</p>
<p>&nbsp;&nbsp;
Sketchy_Stone_Ashlar对应的就是上面的name=&#8221;Sketchy_Stone_Ashlar&#8221;，我这里没有相应的设置
BackColor和ForegroundColor，因为这两个是SketchUp自动生成的，因为这两个材质贴图不影响我的模型的显示。<br />
&nbsp;&nbsp; 如果你是用3Ds MAX你可以在设置材质贴图的时候设置这个名称，记得这个名称要符合命名规范，3Ds MAX自动给你生成的通常是不符合命名规范的，用起来会有些问题。<br />
&nbsp;&nbsp; 其它的代码就和显示一个球体模型或者立方体模型一样了，大家参考以前的代码吧。<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp; <span style="color: #ff0000;">如果你和我一样使用SketchUp的话，那请你再继续往下看&#8230;</span><br />
&nbsp;&nbsp;
按我上面的步骤做，显示SketchUp导出的3D模型时是会出错的，运行时会报&#8220;无法访问空对象引用的属性或方法。&#8221;。需要对PV3D的代码做一处小修
改，来避免这个空引用异常。打开PV3D的Collada类的源文件，找到379行处的var len:Number =
semVertices.length;，将它改为var len:Number = semVertices == null ? 0 :
semVertices.length; 这样就可以了。</p>
<p>&nbsp;&nbsp; 显示效果如下：<a tip="" href="http://flex.unbe.cn/PV3D/Try08_SketchModeling/Main.swf">http://flex.unbe.cn/PV3D/Try08_SketchModeling/Main.swf</a></p>
<p>&nbsp;&nbsp; PV3D对SkechUp导出的Collada模型似乎支持得不好，或者是SketchUp的Collada模型导出功能还不够完善，所以显示出来的效果和建模时的效果有些差别。<br />
&nbsp;&nbsp; <img alt="" src="http://www.unbe.cn/blog/wp-content/uploads/2007/10/modeling3.png" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;完整项目文件：<a tip="try08_sketchmodeling.rar" href="http://www.unbe.cn/blog/wp-content/uploads/2007/10/try08_sketchmodeling.rar"><strong><font color="#3d81ee">try08_sketchmodeling.rar</font></strong></a></p>
<p>&nbsp;&nbsp; <span style="color: #ff0000;">dmh2002注：本文在原文基础上略有改变。<br />
&nbsp;&nbsp; </span><span style="color: #000000;">原文地址：<a tip="" href="http://www.unbe.cn/blog/?p=385">http://www.unbe.cn/blog/?p=385</a></span></p>
<img src ="http://www.blogjava.net/sealyu/aggbug/240390.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-11-13 20:54 <a href="http://www.blogjava.net/sealyu/archive/2008/11/13/240390.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Papervision3D基础（转）</title><link>http://www.blogjava.net/sealyu/archive/2008/11/13/240204.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Thu, 13 Nov 2008 01:09:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/11/13/240204.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/240204.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/11/13/240204.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/240204.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/240204.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Papervision3DPV3D是一个开源的遵循MIT协议的使用AS3代码写成的3D引擎。这篇文章旨在教会各位如何使用PV3D完成一个HELLOWORD式的3D程序，同时也是这篇教程的最近更新。PV3D2.0Alpha(也称GW)对于初学者来说使用PV3D最大的障碍在于如何安装PV3D，由于对版本控制软件不熟是造成无法完成PV3D安装的主要原因，第一部分的三节阐述了这个问题，但是不是这篇...&nbsp;&nbsp;<a href='http://www.blogjava.net/sealyu/archive/2008/11/13/240204.html'>阅读全文</a><img src ="http://www.blogjava.net/sealyu/aggbug/240204.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-11-13 09:09 <a href="http://www.blogjava.net/sealyu/archive/2008/11/13/240204.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>