Sealyu

--- 博客已迁移至: http://www.sealyu.com/blog

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  618 随笔 :: 87 文章 :: 225 评论 :: 0 Trackbacks
在Papervision3D中,3D场景交互事件主要用到了一个新的类:InteractiveScene3DEvent,这个类在 org.papervision3d.events包中,主要定义了有关鼠标和3D对象之间交互时事件驱动的一些静态属性,如点击、移动、滑开、滑上、按 下、按下并释放、按下释放移开等。
该类的构造函数是: 

InteractiveScene3DEvent (type:String, container3d:DisplayObject3D = null, bubbles:Boolean = false, cancelable:Boolean = false)

     详细的参数就不再一一解释,你只要记住它的用法比照Flash CS3中的MouseEvent类使用,这里简单提供在Flash CS3帧上的测试代码(使用前不要忘了要import包类): 

import org.papervision3d.events.InteractiveScene3DEvent;
addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, onHandle);
addEventListener(InteractiveScene3DEvent.OBJECT_MOVE, onHandle);
addEventListener(InteractiveScene3DEvent.OBJECT_OUT, onHandle);
addEventListener(InteractiveScene3DEvent.OBJECT_OVER, onHandle);
addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, onHandle);
addEventListener(InteractiveScene3DEvent.OBJECT_RELEASE, onHandle);
addEventListener(InteractiveScene3DEvent.OBJECT_RELEASE_OUTSIDE, onHandle);

private function onHandle(e:InteractiveScene3DEvent):void
{
 trace(e.type);
}

     注意观察输出面板相关的信息!

    基本3D交互场景事件实例:

    本实例是场景中有一个旋转的平面Plane,正反面都有贴图,当用鼠标移上或移开时交换显示不同的图片,点击该平面时向相反方向旋转。在代码中,我预先创 建一个3D对象Plane平面,并使用两张不同的图片来做材质贴图,然后使用InteractiveScene3DEvent来驱动鼠标事件。效果图示如 下:

 

    具体代码如下:

 

 package
{
 
 
    import PaperBase;
    import org.papervision3d.objects.DisplayObject3D;
 import org.papervision3d.events.InteractiveScene3DEvent;  
    import org.papervision3d.materials.BitmapFileMaterial;
 import org.papervision3d.objects.primitives.Plane;
 
 import it.flashfuck.debugger.FPSMonitor;
   
    public class MainInteractiveScene3dEvent extends PaperBase
 {
  private var ourMaterial:BitmapFileMaterial = new BitmapFileMaterial("img/pic43.jpg");//用于plane平面对象上的材质贴图
  private var ourOverMaterial:BitmapFileMaterial = new BitmapFileMaterial("img/pic12.jpg");//用于当鼠标移到plane平面上时的材质贴图
  private var yawspeed:Number = 3;//设置yaw()方法的旋转角度
  private var plane:DisplayObject3D;      
      
       public function MainInteractiveScene3dEvent()
    {
     addChild(new FPSMonitor());
     init();
       }
      
       override protected function init3d():void
    {
     ourMaterial.interactive = true;//设置材质交互
     ourMaterial.doubleSided = true;
     ourOverMaterial.interactive = true;
     ourOverMaterial.doubleSided = true;
    
     plane = new Plane(ourMaterial,1000,1000,4,4);
     default_scene.addChild(plane);
     plane.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, onInteractiveHandle);
     plane.addEventListener(InteractiveScene3DEvent.OBJECT_OUT, onInteractiveHandle);
     plane.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, onInteractiveHandle);    
       }
   
    private function onInteractiveHandle(e:InteractiveScene3DEvent):void
    {
    if (e.type == "mousePress")
     {
      yawspeed *= -1;
     }
     if (e.type == "mouseOut")
     {
      plane.material=ourMaterial
     }
     if (e.type == "mouseOver")
     {
      plane.material = ourOverMaterial;
     }
    }
       override protected function processFrame():void
    {
     plane.yaw(yawspeed);
       }
    }
}
 
 

    总结:本节主要是关于交互场景3D事件类的基本用法,比 较简单。实际上,该类的使用和Flash CS3中的MouseEvent类一样;另外需要注意的是,该类定义的是静态属性,因此可以“类名.属性”的方式直接使用;事件处理器函数可以调用同一个 函数实现不同的功能,如本例中对3D鼠标事件的处理采用if条件来实现指定的事件处理,算是对代码的一种优化吧。如果对代码中相关的材质贴图不是很明白, 可以参看前面的内容。

    本教程可自由转载,请注明转载出处,谢谢~!

posted on 2008-11-19 14:52 seal 阅读(842) 评论(1)  编辑  收藏 所属分类: Flex+ActionScript

评论

# re: Papervision3D 基本3D交互场景事件(转) 2009-04-30 12:01 孙令纯
以你的代码根本做不出来!  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: