WOWEngineの立方体、WBoxの実装凄すぎワロタ

ちなみに、今回のデモのソースがこちら。
WBoxをちゃんと使ってる事がわかるはず。

ActionScript

  1. package  {
  2.     import flash.events.Event;
  3.     import flash.events.MouseEvent;
  4.     import fr.seraf.wow.core.data.WVector;
  5.     import fr.seraf.wow.core.WOWEngine;
  6.     import fr.seraf.wow.primitive.WBoundArea;
  7.     import fr.seraf.wow.primitive.WBox;
  8.     import fr.seraf.wow.primitive.WSphere;
  9.     import org.papervision3d.core.proto.MaterialObject3D;
  10.     import org.papervision3d.lights.PointLight3D;
  11.     import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
  12.     import org.papervision3d.materials.shaders.ShadedMaterial;
  13.     import org.papervision3d.materials.utils.MaterialsList;
  14.     import org.papervision3d.materials.WireframeMaterial;
  15.     import org.papervision3d.objects.DisplayObject3D;
  16.     import org.papervision3d.objects.primitives.Cube;
  17.     import org.papervision3d.objects.primitives.Sphere;
  18.     import org.papervision3d.view.BasicView;
  19.    
  20.     public class WBoxDemo extends BasicView{
  21.        
  22.         private const BOX_SIZE:Number = 120;
  23.         private const SPHERE_R:Number = 20;
  24.         private var light:PointLight3D;
  25.         private var cameraRotation:Number = 180;
  26.         private var wow:WOWEngine;
  27.         private var wba:WBoundArea;
  28.         private var box:DisplayObject3D;
  29.         private var sphere:Sphere;
  30.         private var wbox:WBox;
  31.         private var wsphere:WSphere;
  32.        
  33.         public function WBoxDemo() {
  34.             super(500, 500);
  35.             light = new PointLight3D();
  36.  
  37.             //WOWEngineを準備
  38.             initWOWEngine();
  39.  
  40.             //箱を準備
  41.             createWBoxShepres();
  42.  
  43.             //表示用の赤ボールを準備
  44.             var mat:MaterialObject3D = new FlatShadeMaterial(light , 0xFFAAAA , 0x663333);
  45.             sphere = new Sphere(mat, SPHERE_R, 16, 16);
  46.             scene.addChild(sphere);
  47.  
  48.             //カメラを準備
  49.             camera.y = 200;
  50.             camera.z = -500 * Math.sqrt(3);
  51.             camera.focus = 300;
  52.             camera.zoom = 4;
  53.             wsphere.velocity = new WVector(0, -20, 0);
  54.  
  55.             this.addEventListener(MouseEvent.CLICK ,  mouseClicked);
  56.             this.addEventListener(Event.ENTER_FRAME , onEnterFrame);
  57.  
  58.             startRendering();
  59.         }
  60.        
  61.         /**
  62.          * 表示されているオブジェクトのどれかをクリックすると、赤ボールが跳ねる。
  63.          */
  64.         private function mouseClicked(e:MouseEvent):void {
  65.             wsphere.velocity = new WVector(Math.random() * 5 - 2.5, 20, Math.random() * 5 - 2.5);
  66.         }
  67.  
  68.         private function initWOWEngine():void{
  69.             wow = new WOWEngine();
  70.             wow.collisionResponseMode = wow.SELECTIVE;
  71.             wow.addMasslessForce(new WVector(0, -3, 0));
  72.             wba = new WBoundArea(BOX_SIZE * 2 , BOX_SIZE * 4 , BOX_SIZE * 2);
  73.             wow.setBoundArea(wba);
  74.             //出た!WBoxを準備!!
  75.             wbox = new WBox(0, 0, 0, BOX_SIZE * 2 , wow);
  76.            
  77.             //WBoxを固定化するために、こんなコードが必要。
  78.             wbox.centerSphere.fixed = wbox.coin0_0.fixed = wbox.coin0_1.fixed
  79.                                     = wbox.coin0_2.fixed = wbox.coin0_3.fixed
  80.                                     = wbox.coin1_0.fixed = wbox.coin1_1.fixed
  81.                                     = wbox.coin1_2.fixed = wbox.coin1_3.fixed
  82.                                     = true;
  83.             //赤ボール用のWSphereを準備
  84.             wsphere = new WSphere(0 , BOX_SIZE * 2, 0, SPHERE_R, false, 0);
  85.             wow.addParticle(wsphere);
  86.         }
  87.  
  88.         private function onEnterFrame(e:Event):void {
  89.             wow.step();
  90.             cameraRotation += 1.2;
  91.  
  92.             wowPositionSetting(box , wbox.centerSphere);
  93.             wowPositionSetting(sphere , wsphere);
  94.             camera.z = 1000 * Math.sin(cameraRotation * Math.PI/180);
  95.             camera.x = 1000 * Math.cos(cameraRotation * Math.PI/180);
  96.         }
  97.  
  98.         private function wowPositionSetting(target:DisplayObject3D , wowObj:Object):void {
  99.             if (target && wowObj) {
  100.                 target.x = wowObj.px;
  101.                 target.y = wowObj.py;
  102.                 target.z = wowObj.pz;
  103.             }
  104.         }
  105.  
  106.         /**
  107.          * WBoxの実態を表示するためのBoxを準備
  108.          */
  109.         private function createWBoxShepres():void {
  110.             box = new DisplayObject3D("box");
  111.             var mat:MaterialObject3D = new FlatShadeMaterial(light , 0xFFFFFF , 0x666666);
  112.             var centerSphere:Sphere = new Sphere(mat , BOX_SIZE);
  113.             var r:Number = BOX_SIZE / 4;
  114.             var size:Number = BOX_SIZE * 2;
  115.             var x:Number = centerSphere.x;
  116.             var y:Number = centerSphere.y;
  117.             var z:Number = centerSphere.z;
  118.            
  119.             var coin0_0:Sphere = new Sphere(mat , r);
  120.             coin0_0.x = x - size / 2 + r;
  121.             coin0_0.y = y - size / 2 + r;
  122.             coin0_0.z = z - size / 2 + r;
  123.  
  124.             var coin0_1:Sphere = new Sphere(mat ,r);
  125.             coin0_1.x = x - size / 2 + r;
  126.             coin0_1.y = y + size / 2 - r;
  127.             coin0_1.z = z - size / 2 + r;
  128.            
  129.             var coin0_2:Sphere = new Sphere(mat, r);
  130.             coin0_2.x = x + size / 2 - r;
  131.             coin0_2.y = y + size / 2 - r;
  132.             coin0_2.z = z - size / 2 + r;
  133.            
  134.             var coin0_3:Sphere = new Sphere(mat , r);
  135.             coin0_3.x = x + size / 2 - r;
  136.             coin0_3.y = y - size / 2 + r;
  137.             coin0_3.z = z - size / 2 + r;
  138.  
  139.             var coin1_0:Sphere = new Sphere(mat , r);
  140.             coin1_0.x = x - size / 2 + r;
  141.             coin1_0.y = y - size / 2 + r;
  142.             coin1_0.z = z + size / 2 - r;
  143.  
  144.             var coin1_1:Sphere = new Sphere(mat ,r);
  145.             coin1_1.x = x - size / 2 + r;
  146.             coin1_1.y = y + size / 2 - r;
  147.             coin1_1.z = z + size / 2 - r;
  148.            
  149.             var coin1_2:Sphere = new Sphere(mat, r);
  150.             coin1_2.x = x + size / 2 - r;
  151.             coin1_2.y = y + size / 2 - r;
  152.             coin1_2.z = z + size / 2 - r;
  153.            
  154.             var coin1_3:Sphere = new Sphere(mat , r);
  155.             coin1_3.x = x + size / 2 - r;
  156.             coin1_3.y = y - size / 2 + r;
  157.             coin1_3.z = z + size / 2 - r;
  158.  
  159.             box.addChild(centerSphere);
  160.             box.addChild(coin0_0);
  161.             box.addChild(coin0_1);
  162.             box.addChild(coin0_2);
  163.             box.addChild(coin0_3);
  164.             box.addChild(coin1_0);
  165.             box.addChild(coin1_1);
  166.             box.addChild(coin1_2);
  167.             box.addChild(coin1_3);
  168.            
  169.             var wmat:MaterialObject3D = new WireframeMaterial(0xAAFFAA, 0.5, 2);//new ColorMaterial(0x00FF00, 0.2);
  170.             var wml:MaterialsList = new MaterialsList();
  171.             wml.addMaterial(wmat,"all");
  172.             var cube:Cube = new Cube(wml, BOX_SIZE * 2, BOX_SIZE * 2, BOX_SIZE * 2, 4, 4, 4);
  173.             box.addChild(cube);
  174.             scene.addChild(box);
  175.         }
  176.     }
  177.    
  178. }

それとも、俺が使ってるバージョンがおかしいのか!?

タイトルとURLをコピーしました