forked from: 3d seconds clock
various codes combined especially the quaternion formula via pv3d.org
/**
* Copyright smallflowergame ( http://wonderfl.net/user/smallflowergame )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/ddfX
*/
// forked from siaukia's 3d seconds clock
// forked from ita's forked from: flash on 2009-7-19
// forked from Rnkn's flash on 2009-7-19
// various codes combined especially the quaternion formula via pv3d.org
package {
import flash.display.*;
import flash.utils.*;
import flash.events.*;
import flash.text.*;
import org.papervision3d.view.*;
import org.papervision3d.scenes.*;
import org.papervision3d.core.proto.*;
import org.papervision3d.core.math.Quaternion;
import org.papervision3d.cameras.*;
import org.papervision3d.materials.*;
import org.papervision3d.objects.*
import org.papervision3d.objects.primitives.*
import org.papervision3d.render.*;
import gs.TweenMax;
import gs.easing.*;
public class FlashTest extends Sprite {
private var view:Viewport3D;
// private var camera:CameraObject3D;
private var scene:Scene3D;
private var arraySeconds:Array = new Array();
private var timer:Timer;
private var secondsHolder:DisplayObject3D = new DisplayObject3D;;
private var RADIUS:Number = 300;
private var anglePer:Number = (Math.PI*2) / 60;
private var startQuaternion:Quaternion = null;
private var endQuaternion:Quaternion = null;
private var currentQuaternion:Quaternion = null;
private var cameraTarget:DisplayObject3D = new DisplayObject3D();
private var DISTANCE_FROM_PLANE:Number = 200
private var TWEEN_TIME:Number = .5;
private var camera:CameraWithSlerp;
private var renderer:BasicRenderEngine = new BasicRenderEngine()
public function FlashTest():void {
view = new Viewport3D(0,0, true, true);
camera = new CameraWithSlerp();
scene = new Scene3D();
camera.x = 0;
camera.y = 0;
camera.z = 0;
secondsHolder.rotationX = 30
scene.addChild(secondsHolder);
addChild(view);
initSeconds();
updateSeconds();
timer = new Timer(1000);
timer.addEventListener(TimerEvent.TIMER, loop);
timer.start();
stage.addEventListener(Event.ENTER_FRAME, stageEnterFrame);
}
private function stageEnterFrame(e:Event):void {
renderer.renderScene(scene, camera, view);
}
private function initSeconds():void {
for(var i:int = 0;i<60;i++){
var second:TextField = new TextField;
var format:TextFormat = new TextFormat("Arial Black",30);
second.defaultTextFormat = format;
if (i < 10) {
second.text = "0" + i;
}else{
second.text = "" + i;
}
var mc:MovieClip = new MovieClip();
mc.graphics.beginFill(0xFFFFFF, 0)
mc.graphics.drawRect(0, 0, 50, 50)
mc.addChild(second);
var bd:BitmapData = new BitmapData(50,50, true, 0);
bd.draw(mc);
var planeMaterial:BitmapMaterial = new BitmapMaterial(bd);
var plane:Plane = new Plane(planeMaterial, 50, 50, 2, 2);
var planeHolder:DisplayObject3D = new DisplayObject3D();
planeMaterial.doubleSided = true;
planeHolder.x = Math.cos(i*anglePer) * RADIUS;
planeHolder.y = 0
planeHolder.z = Math.sin(i*anglePer) * RADIUS;
plane.useOwnContainer = true;
plane.name = "plane";
planeHolder.addChild(plane);
secondsHolder.addChild(planeHolder);
arraySeconds.push(planeHolder);
planeHolder.lookAt(DisplayObject3D.ZERO)
}
}
private function loop(event:TimerEvent):void{
updateSeconds();
}
private function updateSeconds():void {
var d:Date = new Date();
var s:Number = d.getSeconds();
for (var i:int = 0; i <60; i++) {
if (i == s) {
TweenMax.to(arraySeconds[i].getChildByName("plane"), .5, {scale:1, ease:Elastic.easeOut})
} else {
TweenMax.to(arraySeconds[i].getChildByName("plane"), .5, {scale:.5, ease:Elastic.easeOut})
}
}
rotateSphere(arraySeconds[s]);
}
private function rotateSphere(object:DisplayObject3D):void {
cameraTarget.copyTransform(object);
cameraTarget.moveBackward(DISTANCE_FROM_PLANE);
createTween(cameraTarget);
}
private function createTween(displayObject3d:DisplayObject3D):void
{
//when "slerping", this value is a range from 0 to 1
//0 being the starting total rotation (AKA transformation)
//1 being the ending total rotation
camera.slerp = 0;
var tweenObject:Object = {};
tweenObject.x = displayObject3d.x;
tweenObject.y = displayObject3d.y;
tweenObject.z = displayObject3d.z;
tweenObject.ease = Expo.easeInOut;
tweenObject.slerp = 1;
tweenObject.onUpdate = cameraUpdateCallback;
tweenObject.onComplete = cameraCompleteCallback;
tweenObject.overwrite = true;
startQuaternion = Quaternion.createFromMatrix(camera.transform);
endQuaternion = Quaternion.createFromMatrix(displayObject3d.transform);
TweenMax.to(camera, TWEEN_TIME, tweenObject);
}
private function cameraCompleteCallback():void {
}
private function cameraUpdateCallback():void {
currentQuaternion = Quaternion.slerp(startQuaternion, endQuaternion, camera.slerp);
camera.transform.copy3x3(currentQuaternion.matrix);
}
}
}
import org.papervision3d.cameras.*
class CameraWithSlerp extends Camera3D
{
public var slerp:Number = 0;
function CameraWithSlerp() {
}
}