加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何把Papervision3d物体加到 flex项目中(附 旋转圆球例子)

发布时间:2020-12-15 04:37:03 所属栏目:百科 来源:网络整理
导读:本文介绍怎么在flex项目中使用Papervision3d,而不是在actionscript项目中。 (Papervision3d 最新源代码和swc库文件:http://code.google.com/p/papervision3d/ ) ?本文参照:http://pv3d.org/2008/11/29/adding-a-basicview-to-a-flex-uicomponent/ 方法一

本文介绍怎么在flex项目中使用Papervision3d,而不是在actionscript项目中。

(Papervision3d 最新源代码和swc库文件:http://code.google.com/p/papervision3d/ )

?本文参照:http://pv3d.org/2008/11/29/adding-a-basicview-to-a-flex-uicomponent/

方法一 直接在mxml文件中加入 3D 窗体组件

? 代码:

?<?xml version="1.0" encoding="utf-8"?>
<mx:Application width="640"?height="480"?xmlns:mx="http://www.adobe.com/2006/mxml "??layout="absolute"
?applicationComplete="applicationComplete()">
?<mx:Script>
??<![CDATA[
???import org.papervision3d.objects.primitives.Sphere;
???import org.papervision3d.view.BasicView;
???private function applicationComplete():void
???{
????var basicView:BasicView = new BasicView(); //3D 窗体,?是一个 UIComponent
????var sphere:Sphere = new Sphere(null,200,16,16); //3D球体,属性依次是材质,半径,水平方向三角形数量,垂直方向三角形数量
????basicView.scene.addChild(sphere); //把球体加入到 3D 窗体中
????basicView.startRendering(); //?显示
????pv3dPanel.rawChildren.addChild(basicView);?//把3D窗体加入到panel中
???}
??]]>
?</mx:Script>
?<mx:Panel id="pv3dPanel" title="Papervision3D Panel" width="640" height="480"/>
</mx:Application>

运行效果:

?

代码分析:

?? 用BasicView创建一个3d球体还是很简单,比老版简化了很多步骤。 这里需要注意的是“??pv3dPanel.rawChildren.addChild()” , 官方文档入下:

http://livedocs.adobe.com/flex/3_cn/mx/core/Container.html#rawChildren

?容器中通常包含子组件,可以使用 Container.getChildAt() 方法和 Container.numChildren 属性枚举这些子组件。此外,容器可以包含样式元素和外观,如边框和背景。Flash Player 和 AIR 创建的子组件和外观之间没有任何差异。二者均可以使用播放器的 getChildAt() 方法和 numChildren 属性进行访问。但是,Container 类通过覆盖 getChildAt() 方法和 numChildren 属性(以及其它多个方法)可造成容器的子项是唯一的子组件的错觉。

如果您需要访问容器的所有子项(内容子项和外观),则需使用 rawChildren 属性上的方法和属性,而不是常规 Container 方法。例如,可使用 Container.rawChildren.getChildAt()) 方法。但是,如果容器为其子项创建了 ContentPane Sprite 对象,则 rawChildren 属性值将只计算 ContentPane,而不计算容器的子项。并非总能够确定容器何时包含 ContentPane。

注意: 如果您调用 rawChildren 对象的 addChildaddChildAt 方法,则需在添加的组件上设置 tabEnabled = false 。这可以防止用户跳位到所添加的仅可视组件。

?

也可以写成这样:(不推荐)

<mx:Script>
??<![CDATA[
???import mx.core.UIComponent;
???use namespace mx_internal;?
???
???import org.papervision3d.objects.primitives.Sphere;
???import org.papervision3d.view.BasicView;
???private function applicationComplete():void
???{
????
????var basicView:BasicView = new BasicView();
????var sphere:Sphere = new Sphere(null,16);
????basicView.scene.addChild(sphere);
????basicView.startRendering();
?? ?pv3dPanel.$addChild(basicView); ?
???}
??]]>
?</mx:Script>

?

代码下载:

http://dl.getdropbox.com/u/132579/sites/pv3d.org/flex/basics/FlexBasicView.zip



方法二:使用自定义控件,把3d窗体封装到自定义控件中, 在主应用中引入这个自定义控件。

?

主要代码:

?import flash.events.Event;
?
?import org.papervision3d.cameras.CameraType;
?import org.papervision3d.objects.primitives.Sphere;
?import org.papervision3d.view.BasicView;
?
?public class My3D extends BasicView
?{
??private var sphere:Sphere
??public function My3D()
??{
??? super(400,300,false,true,CameraType.FREE);
???? sphere = new Sphere(null,16);
??????? scene.addChild(sphere);
???? startRendering();
??}
?/**
???????? * 加入每一帧的动作
???????? * @param event
???????? *?
?? */
override protected function onRenderTick(event:Event=null):void
??{
???sphere.yaw(1);//球体绕Y轴旋转
???renderer.renderScene(scene,camera,viewport);
??}
?}


?


代码分析:

? 其实就是把方法一封装一下,做一个自定义控件,用自定义控件来装载3d窗体,并把这个控件当作3d窗体的控制器, 然后把这个控件放到主应用中。


? 另外,比方法一多了球体旋转效果, 代码在上面贴了。

?

代码下载: 见附件

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读