PV3D之旋转篇Quaternion

现在PV3D处理旋转 实在是方便多了 还记得一年前 我还在AS2.0时代的时候做个这样旋转效果 忙乎了一下午
先放个以前AS2做过的套套3D

今非昔比啊,之前做的很复杂呢。不过现在PV3D里面的Quaternion我也搞不懂 知道怎么用能实现就好了。

  1. package
  2. {
  3.     import caurina.transitions.Tweener;
  4.     import flash.events.Event;
  5.     import flash.filters.BlurFilter;
  6.  
  7.     import org.papervision3d.materials.MovieAssetMaterial;
  8.     import org.papervision3d.core.math.Quaternion;
  9.     import org.papervision3d.objects.DisplayObject3D;
  10.     import org.papervision3d.objects.primitives.Plane;
  11.     import org.papervision3d.core.effects.view.ReflectionView;
  12.     import org.papervision3d.events.InteractiveScene3DEvent;
  13.     public class PV3D_t005 extends ReflectionView
  14.     {
  15.         private var flag:Boolean;
  16.         private var currentQuat:Quaternion = new Quaternion();
  17.         private var targetQuat:Quaternion = new Quaternion();
  18.         private var slerp:Number = 0;
  19.         private const RADIUS:Number = 400;
  20.         private const NUM_OF_PLANES:int = 9;
  21.         private var carousel:DisplayObject3D = new DisplayObject3D();
  22.         private var Material:MovieAssetMaterial=new MovieAssetMaterial("Photo1");
  23.         public function PV3D_t005()
  24.         {
  25.             super(550,400,false,false);
  26.             init();
  27.             surfaceHeight = -120;
  28.             this.addEventListener(Event.ENTER_FRAME,enterFrame);
  29.         }
  30.         private function init():void
  31.         {
  32.             for (var i:int = 0; i < NUM_OF_PLANES; i++) {
  33.                 Material.interactive=true;
  34.                 Material.allowAutoResize=true;
  35.                 Material.doubleSided=true;
  36.                 var plane:DisplayObject3D =new Plane(Material,100,100,4,4);
  37.                 viewportReflection.filters = [new BlurFilter(3,3,3)];
  38.                 //添加模糊滤镜后看起来会更逼真
  39.                 viewport.interactive=true;
  40.                 
  41.                 plane.rotationY = 360 / NUM_OF_PLANES * i;
  42.                 //以一定角度旋转每个平面,得到类似米字型
  43.                 plane.moveForward(RADIUS);
  44.                 //每个平面像各自前方平移上面定义的半径距离
  45.                 //这两步就是组成一个环形的关键代码
  46.                 
  47.                 
  48.             plane.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, overHander);
  49.             plane.addEventListener(InteractiveScene3DEvent.OBJECT_OUT, outHander);
  50.             plane.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, pressHander);
  51.                 carousel.addChild(plane);
  52.                 //carousel相当于一个planeGroup,plane是多个的
  53.             }
  54.             camera.z=800;
  55.             //这个一开始搞了我很久,我以为默认是1000,没想到继承ReflectionView的Z默认是-1000;
  56.             scene.addChild(carousel);
  57.         }
  58.         private function overHander(e:InteractiveScene3DEvent):void
  59.         {
  60.             viewport.buttonMode=true;
  61.         }
  62.         private function outHander(e:InteractiveScene3DEvent):void
  63.         {
  64.             viewport.buttonMode=false;
  65.         }
  66.         private function pressHander(e:InteractiveScene3DEvent):void
  67.         {
  68.      var plane:DisplayObject3D=e.target as DisplayObject3D;
  69.      var radians:Number = (carousel.rotationY -plane.rotationY) * Quaternion.DEGTORAD;
  70.      //Quaternion.DEGTORAD是一个常数
  71.      slerp = 0;
  72.      currentQuat = Quaternion.createFromMatrix(carousel.transform);//复制一个3D矩阵
  73.      targetQuat = Quaternion.createFromAxisAngle(0, 1, 0, radians);//x,y,z,度数
  74.             
  75.             //trace(plane.rotationY,Quaternion.DEGTORAD,radians)
  76.  
  77.         }
  78.         private function enterFrame(e:Event):void
  79.         {
  80.             slerp += (1 - slerp) * .05;//只知道用来控制旋转速度的在0~1之间的一个变量
  81.             var quat:Quaternion = Quaternion.slerp(currentQuat, targetQuat, slerp);
  82.             //currentQuat和targetQuat返回的都是带有x y z w信息的东西,从初始到目标的运动
  83.             carousel.transform = quat.matrix;
  84.             //不断更新矩阵
  85.             singleRender();
  86.         }
  87.     }
  88. }

实例来自pv3d.org 想学好PV3D的朋友常去逛逛吧 会有收获的~

Tags:PV3D  Papervision3D  

0 Comment so far



Leave a reply