今天的目标是:将对象做旋转运动及环绕运动
我的实现方法,是继承原有对象,建立新对象,然后在其中写移动的方法
首先,新建Ball3D类,继承Sphere类,具体代码如下:
package common3d.component { import org.papervision3d.core.proto.MaterialObject3D; import org.papervision3d.objects.primitives.Sphere; public class Ball3D extends Sphere { public function Ball3D(material:MaterialObject3D=null, radius:Number=100, segmentsW:int=8, segmentsH:int=6 ) { super(material, radius, segmentsW, segmentsH); } /******************** 环 绕 移 动 ********************/ // 环绕方向 X轴 public static var ENCIRCLE_AXIS_X:Number = 1; // 环绕方向 Y轴 public static var ENCIRCLE_AXIS_Y:Number = 2; // 环绕方向 Z轴 public static var ENCIRCLE_AXIS_Z:Number = 3; // 环绕方向 正方向 public static var ENCIRCLE_DIRECTION_ALONG:Number = 1; // 环绕方向 负方向 public static var ENCIRCLE_DIRECTION_CONTRARY:Number = 2; // 环绕半径 public var encircleRadius:Number = 300; // 环绕状态 public var isEncircleMoving:Boolean = false; // 环绕角度单位 public var encircleAngleUnit:Number = 0.1; // 环绕轴 public var encircleAxis:Number = ENCIRCLE_AXIS_Z; // 环绕方向 public var encircleDirection:Number = ENCIRCLE_DIRECTION_ALONG; // 目前环绕角度 private var encircleAngle:Number = 0; // 环绕移动 public function encircleMove():void { // 设定状态 if (isEncircleMoving == false) { isEncircleMoving = true; } // 判断环绕方向 if (encircleAxis == ENCIRCLE_AXIS_Z) { if (encircleDirection == ENCIRCLE_DIRECTION_ALONG) { this.x = encircleRadius * Math.sin(encircleAngle); this.y = encircleRadius * Math.cos(encircleAngle); } else { this.x = encircleRadius * Math.cos(encircleAngle); this.y = encircleRadius * Math.sin(encircleAngle); } } else if (encircleAxis == ENCIRCLE_AXIS_X) { if (encircleDirection == ENCIRCLE_DIRECTION_ALONG) { this.z = encircleRadius * Math.sin(encircleAngle); this.y = encircleRadius * Math.cos(encircleAngle); } else { this.z = encircleRadius * Math.cos(encircleAngle); this.y = encircleRadius * Math.sin(encircleAngle); } } else if (encircleAxis == ENCIRCLE_AXIS_Y) { if (encircleDirection == ENCIRCLE_DIRECTION_ALONG) { this.x = encircleRadius * Math.sin(encircleAngle); this.z = encircleRadius * Math.cos(encircleAngle); } else { this.x = encircleRadius * Math.cos(encircleAngle); this.z = encircleRadius * Math.sin(encircleAngle); } } // 增加角度 encircleAngle += encircleAngleUnit; } /******************** 旋 转 移 动 ********************/ // 旋转方向 X轴 public static var ROTATE_AXIS_X:Number = 1; // 旋转方向 Y轴 public static var ROTATE_AXIS_Y:Number = 2; // 旋转方向 Z轴 public static var ROTATE_AXIS_Z:Number = 3; // 旋转方向 正方向 public static var ROTATE_DIRECTION_ALONG:Number = 1; // 旋转方向 负方向 public static var ROTATE_DIRECTION_CONTRARY:Number = 2; // 旋转状态 public var isRotateMoving:Boolean = false; // 旋转角度单位 public var rotateAngleUnit:Number = 1; // 旋转轴 public var rotateAxis:Number = ROTATE_AXIS_Z; // 旋转方向 public var rotateDirection:Number = ENCIRCLE_DIRECTION_ALONG; // 旋转移动 public function rotateMove():void { // 设定状态 if (isRotateMoving == false) { isRotateMoving = true; } // 旋转环绕方向 if (rotateAxis == ROTATE_AXIS_Z) { if (rotateDirection == ENCIRCLE_DIRECTION_ALONG) { this.rotationZ -= rotateAngleUnit; } else { this.rotationZ += rotateAngleUnit; } } else if (rotateAxis == ROTATE_AXIS_X) { if (rotateDirection == ENCIRCLE_DIRECTION_ALONG) { this.rotationX += rotateAngleUnit; } else { this.rotationX -= rotateAngleUnit; } } else if (rotateAxis == ROTATE_AXIS_Y) { if (rotateDirection == ENCIRCLE_DIRECTION_ALONG) { this.rotationY += rotateAngleUnit; } else { this.rotationY -= rotateAngleUnit; } } } } }
然后,将上次写的Ball3D.mxml改一下,为了使其不与今天这个新写的类捣混,我已经将其更名为View3D.mxml,具体代码如下:
<?xml version="1.0" encoding="utf-8"?> <mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300" initialize="onLoad()"> <mx:Script> <!--[CDATA[ import org.papervision3d.materials.BitmapFileMaterial; import common3d.component.Ball3D; import org.papervision3d.render.BasicRenderEngine; import org.papervision3d.cameras.Camera3D; import org.papervision3d.scenes.Scene3D; import org.papervision3d.view.Viewport3D; private var _view:Viewport3D = new Viewport3D(400, 300); private var _scene:Scene3D; private var _camera:Camera3D; private var render:BasicRenderEngine = new BasicRenderEngine(); private var moon:Ball3D; private var earth:Ball3D; public function onLoad():void { // 创建3D舞台的容器 this.rawChildren.addChild(_view); // 创建3D舞台 _scene = new Scene3D(); // 创建摄像头 _camera = new Camera3D(); _camera.z = -700; _camera.zoom = 10; // 创建一个月亮,做环绕移动 var moonMaterial:BitmapFileMaterial = new BitmapFileMaterial('moon.jpg'); moon = new Ball3D(moonMaterial, 40, 25, 25); moon.encircleAxis = Ball3D.ENCIRCLE_AXIS_Y; moon.encircleRadius = 400; moon.encircleAngleUnit = 0.05 moon.rotationZ -= 23.5; moon.encircleDirection = Ball3D.ENCIRCLE_DIRECTION_CONTRARY; _scene.addChild(moon); // 创建一个地球,做自转运动 var newM:BitmapFileMaterial = new BitmapFileMaterial('bg.jpg'); earth = new Ball3D(newM, 200, 25, 25); earth.rotateAxis = Ball3D.ROTATE_AXIS_Y; earth.rotateDirection = Ball3D.ROTATE_DIRECTION_CONTRARY; _scene.addChild(earth); // 增加ENTER_FRAME事件,主要是为了能让球动起来 this.addEventListener(Event.ENTER_FRAME, OnEnterFrame); } public function OnEnterFrame(event:Event):void { // 调用内部方法,使对象转起来 moon.encircleMove(); earth.rotateMove(); // 渲染图形 render.renderScene(_scene, _camera , _view); } ]]--> </mx:Script> </mx:Canvas>
点击执行,看下效果吧~~~
目标达成 !
Flash演示地址:First3D20090905.swf