Feb 27
PV3D之旋转篇Quaternion
PV3D
现在PV3D处理旋转 实在是方便多了 还记得一年前 我还在AS2.0时代的时候做个这样旋转效果 忙乎了一下午
先放个以前AS2做过的套套3D
今非昔比啊,之前做的很复杂呢。不过现在PV3D里面的Quaternion我也搞不懂 知道怎么用能实现就好了。
- package
- {
- import caurina.transitions.Tweener;
- import flash.events.Event;
- import flash.filters.BlurFilter;
- import org.papervision3d.materials.MovieAssetMaterial;
- import org.papervision3d.core.math.Quaternion;
- import org.papervision3d.objects.DisplayObject3D;
- import org.papervision3d.objects.primitives.Plane;
- import org.papervision3d.core.effects.view.ReflectionView;
- import org.papervision3d.events.InteractiveScene3DEvent;
- public class PV3D_t005 extends ReflectionView
- {
- private var flag:Boolean;
- private var currentQuat:Quaternion = new Quaternion();
- private var targetQuat:Quaternion = new Quaternion();
- private var slerp:Number = 0;
- private const RADIUS:Number = 400;
- private const NUM_OF_PLANES:int = 9;
- private var carousel:DisplayObject3D = new DisplayObject3D();
- private var Material:MovieAssetMaterial=new MovieAssetMaterial("Photo1");
- public function PV3D_t005()
- {
- super(550,400,false,false);
- init();
- surfaceHeight = -120;
- this.addEventListener(Event.ENTER_FRAME,enterFrame);
- }
- private function init():void
- {
- for (var i:int = 0; i < NUM_OF_PLANES; i++) {
- Material.interactive=true;
- Material.allowAutoResize=true;
- Material.doubleSided=true;
- var plane:DisplayObject3D =new Plane(Material,100,100,4,4);
- viewportReflection.filters = [new BlurFilter(3,3,3)];
- //添加模糊滤镜后看起来会更逼真
- viewport.interactive=true;
- plane.rotationY = 360 / NUM_OF_PLANES * i;
- //以一定角度旋转每个平面,得到类似米字型
- plane.moveForward(RADIUS);
- //每个平面像各自前方平移上面定义的半径距离
- //这两步就是组成一个环形的关键代码
- plane.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, overHander);
- plane.addEventListener(InteractiveScene3DEvent.OBJECT_OUT, outHander);
- plane.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, pressHander);
- carousel.addChild(plane);
- //carousel相当于一个planeGroup,plane是多个的
- }
- camera.z=800;
- //这个一开始搞了我很久,我以为默认是1000,没想到继承ReflectionView的Z默认是-1000;
- scene.addChild(carousel);
- }
- private function overHander(e:InteractiveScene3DEvent):void
- {
- viewport.buttonMode=true;
- }
- private function outHander(e:InteractiveScene3DEvent):void
- {
- viewport.buttonMode=false;
- }
- private function pressHander(e:InteractiveScene3DEvent):void
- {
- var plane:DisplayObject3D=e.target as DisplayObject3D;
- var radians:Number = (carousel.rotationY -plane.rotationY) * Quaternion.DEGTORAD;
- //Quaternion.DEGTORAD是一个常数
- slerp = 0;
- currentQuat = Quaternion.createFromMatrix(carousel.transform);//复制一个3D矩阵
- targetQuat = Quaternion.createFromAxisAngle(0, 1, 0, radians);//x,y,z,度数
- //trace(plane.rotationY,Quaternion.DEGTORAD,radians)
- }
- private function enterFrame(e:Event):void
- {
- slerp += (1 - slerp) * .05;//只知道用来控制旋转速度的在0~1之间的一个变量
- var quat:Quaternion = Quaternion.slerp(currentQuat, targetQuat, slerp);
- //currentQuat和targetQuat返回的都是带有x y z w信息的东西,从初始到目标的运动
- carousel.transform = quat.matrix;
- //不断更新矩阵
- singleRender();
- }
- }
- }
实例来自pv3d.org 想学好PV3D的朋友常去逛逛吧 会有收获的~
2009-7-15 10:49:29 回复该留言
你好,我在Flex3中有这么一个问题:
将用图片创建的plane(DisplayObject3D)加入carousel(DisplayObject3D)中,不能显示每个plane!
(已将carousel添加如scene场景中)
但是将plane添加到scene中却可以显示。
为何?