본문 바로가기

Examples/PaperVision3D

Vertex3DExample






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);
  }
 }
}

======================================================================================================