Vertex3DExample.as==================================================================================
package
{
import com.shallaazm.examples.ui.Panel3D;
import flash.display.Sprite;
import flash.events.MouseEvent;
import fl.controls.Button;
/**
* Vertex3D Art Example.
* @author shallaa
* @blog http://shallaazm.tistory.com
*/
public class Vertex3DExample extends Sprite
{
private const objectNames:Array = ["Cone", "Cube", "Cylinder", "Plane", "Sphere"];
private var _panel3D:Panel3D;
/**
* 생성자.
*/
public function Vertex3DExample()
{
initPanel3D();
initButtons();
}
/**
* add Panel3D.
* @private
*/
private function initPanel3D():void
{
_panel3D = new Panel3D();
addChild(_panel3D);
}
/**
* set Buttons.
* @private
*/
private function initButtons():void
{
var len:Number = objectNames.length;
for (var i:Number = 0; i < len; i++)
{
var button:Button = new Button();
button.name = "b" + i;
button.x = 10;
button.y = 10 + (button.height + 5) * i;
button.label = objectNames[i];
button.buttonMode = true;
button.useHandCursor = true;
button.addEventListener(MouseEvent.CLICK, clickHandler);
addChild(button);
}
}
/**
* Button click handler.
* @private
*/
private function clickHandler(e:MouseEvent):void
{
var button:Button = e.currentTarget as Button;
switch(button.name)
{
case "b0" : _panel3D.setState(0); break;
case "b1" : _panel3D.setState(1); break;
case "b2" : _panel3D.setState(2); break;
case "b3" : _panel3D.setState(3); break;
case "b4" : _panel3D.setState(4); break;
}
}
}
}
======================================================================================================
Panel3D.as===========================================================================================
package com.shallaazm.examples.ui
{
import com.shallaazm.flash.utils.NumberUtil;
import flash.utils.Timer;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import org.papervision3d.core.geom.renderables.Vertex3D;
import org.papervision3d.materials.WireframeMaterial;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.primitives.Cone;
import org.papervision3d.objects.primitives.Cube;
import org.papervision3d.objects.primitives.Cylinder;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.objects.primitives.Sphere;
import org.papervision3d.view.BasicView;
import gs.TweenMax;
import gs.easing.Quad;
/**
* Panel3D
* @author shallaa
* @blog http://shallaazm.tistory.com
*/
public class Panel3D extends BasicView
{
private const elementsNames:Array = ["H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca", "Sc",
"Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo",
"Tc", "Ru", "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu",
"Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po",
"At", "Rn", "Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr", "Rf", "Db",
"Sg", "Bh", "Hs", "Mt", "Ds", "Rg", "Uub", "Uut", "Uuq", "Uup", "Uuh", "Uus", "Uuo"];
private var _objects:Array;
private var _elements:Array;
private var _timer:Timer;
/**
* 생성자.
*/
public function Panel3D()
{
_objects = [];
_elements = [];
camera.y = 500;
init3DObjects();
}
/**
* 파티클 위치 설정.
* @param num 위치 넘버
* 0 : Cone
* 1 : Cube
* 2 : Cylinder
* 3 : Plane
* 4 : Sphere
*/
public function setState(num:Number):void
{
var vertex3DPoints = _objects[num];
var elememtNameNum:Number = elementsNames.length - 1;
var time:Number = 4;
var len:Number = vertex3DPoints.length;
for (var i:Number = 0; i < len; i++)
{
if (!_elements[i])
{
var elementWord:ElementWord = new ElementWord(elementsNames[NumberUtil.random(0, elememtNameNum)]);
elementWord.x = NumberUtil.random( -5000, -4000);
elementWord.y = NumberUtil.random( -5000, -4000);
elementWord.z = NumberUtil.random( -5000, -4000);
_elements.push(elementWord);
scene.addChild(elementWord);
}
addTween(_elements[i], vertex3DPoints[i].x, vertex3DPoints[i].y, vertex3DPoints[i].z, time, i/100, false);
}
var elementsToDestroy:Array = _elements.splice(len);
len = elementsToDestroy.length;
for (i = 0; i < len; i++)
{
addTween(elementsToDestroy[i], NumberUtil.random( 4000, 5000), NumberUtil.random( 4000, 5000), NumberUtil.random( 4000, 5000), time, i/100, true);
}
if (!_timer)
{
_timer = new Timer((time + 1) * 1000);
_timer.addEventListener(TimerEvent.TIMER, timerHandler);
_timer.start();
}
startRendering();
}
/**
* 트윈 실행.
* @param target 타겟
* @param xto x위치
* @param yto y위치
* @param zto z위치
* @param time 시간(초)
* @param delay 딜레이(초)
* @param destroy 트윈후에 삭제할지 여부
* @private
*/
private function addTween(target:DisplayObject3D, xto:Number, yto:Number, zto:Number, time:Number, delay:Number, destroy:Boolean):void
{
var tweenObj:Object = { };
tweenObj.ease = Quad.easeInOut;
tweenObj.x = xto;
tweenObj.y = yto;
tweenObj.z = zto;
tweenObj.delay = delay;
tweenObj.bezierThrough = [ { x:NumberUtil.random( -5000, 5000), y:NumberUtil.random( -5000, 5000), z:NumberUtil.random( -5000, 5000) } ];
if (destroy)
{
tweenObj.alpha = 0;
tweenObj.onCompleteListener = destroyElements;
}
TweenMax.to(target, time, tweenObj);
}
/**
* Timer TimerEvent handler.
* 랜더링 제어.
* @private
*/
private function timerHandler(e:TimerEvent):void
{
if (!isTweening())
{
_timer.removeEventListener(TimerEvent.TIMER, timerHandler);
_timer = null;
stopRendering();
}
}
/**
* Tweening 중인지 체크.
* @return Boolean
* @private
*/
private function isTweening():Boolean
{
var len:Number = _elements.length;
for (var i:Number = 0; i < len; i++)
{
if (TweenMax.isTweening(_elements[i]))
{
return true;
}
}
return false;
}
/**
* 불필요한 ElementWord 제거.
* @private
*/
private function destroyElements(e:Event):void
{
var element:ElementWord = e.target.target as ElementWord;
scene.removeChild(element);
element = null;
}
/**
* DisplayObject3D의 vertices를 얻어낸다.
* @private
*/
private function init3DObjects():void
{
var cone:Cone = new Cone(null, 300, 600, 15, 8);
_objects[0] = cone.geometry.vertices;
var materialsList:MaterialsList = new MaterialsList();
materialsList.addMaterial(new WireframeMaterial(), "all");
var cube:Cube = new Cube(materialsList, 600, 600, 600, 6, 6, 6);
_objects[1] = cube.geometry.vertices;
var cylinder:Cylinder = new Cylinder(null, 300, 300, 15, 7);
_objects[2] = cylinder.geometry.vertices;
var plane:Plane = new Plane(null, 600, 600, 8, 8);
_objects[3] = plane.geometry.vertices;
var sphere:Sphere = new Sphere(null, 300, 11, 11);
_objects[4] = sphere.geometry.vertices;
}
}
}
======================================================================================================
ElementWord.as======================================================================================
package com.shallaazm.examples.ui
{
import org.papervision3d.core.geom.TriangleMesh3D;
import org.papervision3d.materials.special.Letter3DMaterial;
import org.papervision3d.typography.fonts.HelveticaBold;
import org.papervision3d.typography.Text3D;
/**
* 3D 단어
* @author shallaa
* @blog http://shallaazm.tistory.com
*/
public class ElementWord extends TriangleMesh3D
{
/**
* 생성자
* @param word 생성할 3D 단어
*/
public function ElementWord(word:String)
{
super(null, new Array(), new Array());
var text3D:Text3D = new Text3D(word, new HelveticaBold(), new Letter3DMaterial(0xFFFFFF));
text3D.scaleX = text3D.scaleY = 0.50;
addChild(text3D);
}
}
}
======================================================================================================