うむるむ

うむるむ は主に flash 周りの話と美少女ゲーム系の話の二本立てで構成されています。



[ Papervision3D ]
ネタ切れの正12面体 - 08/07/08 21:26 by umroom

正20面体に続いて、懲りずに正しい12面体。
楽勝かと思ったけど、いざ実行したら何も表示されず。
よくよく見たら TriangleMesh3D である。3角ポリゴンじゃなきゃダメじゃん。

(´・ω・`) flash表示できんよ。

20面体は面が3角形なので何も考えずともそのままできたが、今度は面が5角形。
対角線を2本引いて3つの3角形に分割して終了、、でもなかった。
残ってるのはマテリアル。
前回同様にCompositeMaterialにColorMaterialとWireframeMaterialを指定すると、分割してる対角線にまでWireframeMaterialが適用されて見にくいことこの上ない。面の周りを5角形にラインを引きたかったのでLine3Dを使った。

Line3Dで線を引くにはLines3Dも必要になる。最初「s」を見落としていて混乱した。
この2つはTriangleMesh3DとTriangle3Dの関係に似てる。それぞれが属してるパッケージも同じだ。
Line3Dのコンストラクタの第1引数はsizeとあるが、これは太さ。続いて始点と終点。
これをLines3Dにaddしてシーンに貼付けると3D空間に線が引かれる。

ソースは前回とほぼ同じ。前回は使ってない変数やらゴミが混じっていたので綺麗にした。
図形描画は相変わらず力技で美しくない。

package{
  import flash.display.MovieClip;
  import flash.display.Stage;
  import flash.display.StageAlign;
  import flash.display.StageScaleMode;
  
  import flash.events.Event;
  
  import org.papervision3d.Papervision3D;
  import org.papervision3d.view.Viewport3D;
  import org.papervision3d.objects.DisplayObject3D;
  import org.papervision3d.objects.primitives.Sphere;
  import org.papervision3d.materials.*;
  import org.papervision3d.materials.special.LineMaterial;
  import org.papervision3d.materials.special.CompositeMaterial;
  import org.papervision3d.cameras.Camera3D;
  import org.papervision3d.render.BasicRenderEngine;
  import org.papervision3d.scenes.Scene3D;
  
  import org.papervision3d.core.geom.Lines3D;
  import org.papervision3d.core.geom.TriangleMesh3D;
  import org.papervision3d.core.geom.renderables.Triangle3D;
  import org.papervision3d.core.geom.renderables.Vertex3D;
  import org.papervision3d.core.math.NumberUV;
  
  public class Main extends MovieClip{
    
    private var view:Viewport3D;
    private var camera:Camera3D;
    public var renderer:BasicRenderEngine;
    
    private var scene:Scene3D;
    
    public function Main(){
      stage.align = StageAlign.TOP_LEFT;
      stage.scaleMode = StageScaleMode.NO_SCALE;
      
      init();
      stage.addEventListener(Event.ENTER_FRAME, myEnterFrame);
    }
    
    private function init():void{
      Papervision3D.VERBOSE=false;
      
      view = new Viewport3D(0, 0, true, true);
      addChild(view);
  
      renderer = new BasicRenderEngine();
      
      scene = new Scene3D();
      
      camera = new Camera3D();
      camera.z = -3000;
      camera.zoom=2;
      camera.focus=600;
  
      var A=(Math.sqrt(5)+1)*0.5;
      
      var v:Array=[
                   new Vertex3D(1, 0, 0),
                   new Vertex3D(Math.cos(72*Math.PI/180), Math.sin(72*Math.PI/180), 0),
                   new Vertex3D(-Math.cos(36*Math.PI/180), Math.sin(36*Math.PI/180), 0),
                   new Vertex3D(-Math.cos(36*Math.PI/180), -Math.sin(36*Math.PI/180), 0),
                   new Vertex3D(Math.cos(72*Math.PI/180), -Math.sin(72*Math.PI/180), 0),
  
                   new Vertex3D(A, 0, 1),
                   new Vertex3D(A*Math.cos(36*Math.PI/180), A*Math.sin(36*Math.PI/180), A),
                   new Vertex3D(A*Math.cos(72*Math.PI/180), A*Math.sin(72*Math.PI/180), 1),
                   new Vertex3D(-A*Math.cos(72*Math.PI/180), A*Math.sin(72*Math.PI/180), A),
                   new Vertex3D(-A*Math.cos(36*Math.PI/180), A*Math.sin(36*Math.PI/180), 1),
                   
                   new Vertex3D(-A, 0, A),
                   new Vertex3D(-A*Math.cos(36*Math.PI/180), -A*Math.sin(36*Math.PI/180), 1),
                   new Vertex3D(-A*Math.cos(72*Math.PI/180), -A*Math.sin(72*Math.PI/180), A),
                   new Vertex3D(A*Math.cos(72*Math.PI/180), -A*Math.sin(72*Math.PI/180), 1),
                   new Vertex3D(A*Math.cos(36*Math.PI/180), -A*Math.sin(36*Math.PI/180), A),
                   
                   new Vertex3D(-1, 0, A+1),
                   new Vertex3D(-Math.cos(72*Math.PI/180), -Math.sin(72*Math.PI/180), A+1),
                   new Vertex3D(Math.cos(36*Math.PI/180), -Math.sin(36*Math.PI/180), A+1),
                   new Vertex3D(Math.cos(36*Math.PI/180), Math.sin(36*Math.PI/180), A+1),
                   new Vertex3D(-Math.cos(72*Math.PI/180), Math.sin(72*Math.PI/180), A+1)
                   ];
      
      var obj:DisplayObject3D=new DisplayObject3D();
      obj.name="obj";
      obj.rotationX=10;
      obj.rotationZ=10;
      scene.addChild(obj);
      
      for(var i:uint=0; i<20; i++){
        var sp:Sphere=new Sphere(new ColorMaterial(0xff0000), 7);
        sp.x=v[i].x*=200;
        sp.y=v[i].y*=200;
        sp.z=v[i].z*=200;
        obj.addChild( sp );
      }
      
      makeMesh( [ v[4], v[3], v[2], v[1], v[0] ] );
      makeMesh( [ v[1], v[7], v[6], v[5], v[0] ] );
      makeMesh( [ v[2], v[9], v[8], v[7], v[1] ] );
      makeMesh( [ v[3], v[11], v[10], v[9], v[2] ] );
      makeMesh( [ v[4], v[13], v[12], v[11], v[3] ] );
      makeMesh( [ v[0], v[5], v[14], v[13], v[4] ] );
  
      makeMesh( [ v[15], v[16], v[17], v[18], v[19] ] );
      makeMesh( [ v[8], v[9], v[10], v[15], v[19] ] );
      makeMesh( [ v[10], v[11], v[12], v[16], v[15] ] );
      makeMesh( [ v[12], v[13], v[14], v[17], v[16] ] );
      makeMesh( [ v[14], v[5], v[6], v[18], v[17] ] );
      makeMesh( [ v[6], v[7], v[8], v[19], v[18] ] );
    }
    
    private function makeMesh(prmVertex:Array):void{
      makeTri(prmVertex[0], prmVertex[2], prmVertex[1] );
      makeTri(prmVertex[0], prmVertex[3], prmVertex[2] );
      makeTri(prmVertex[0], prmVertex[4], prmVertex[3] );
  
      for(var i:uint=0; i<5; i++){
        var lines:Lines3D = new Lines3D( new LineMaterial(0xFFFF00) );
        lines.addNewLine( 2, prmVertex[i].x, prmVertex[i].y, prmVertex[i].z, prmVertex[(i+1)%5].x, prmVertex[(i+1)%5].y, prmVertex[(i+1)%5].z );
        scene.getChildByName("obj").addChild( lines );
      }
    }
    
    private function makeTri(v0, v1, v2):void{
      var tri:TriangleMesh3D = new TriangleMesh3D( new ColorMaterial(Math.round(Math.random()*16777215), 0.95), [ v0, v1, v2 ], [] );
      tri.geometry.faces.push( new Triangle3D( tri, [ v0, v1, v2 ], null, [new NumberUV( 0.5, 1 ), new NumberUV( 0, 0 ), new NumberUV( 1, 0 )] ));
      tri.geometry.ready = true;      
      scene.getChildByName("obj").addChild( tri );
    }
    
    private function myEnterFrame(ev:Event):void{
      var omegaY:Number = -stage.mouseX*0.02+4;
      DisplayObject3D(scene.getChildByName("obj") ).rotationY += omegaY;
  
      renderer.renderScene(scene, camera, view);
    }
    
  }
}

« [ Papervision3D ] 正20面体 | ブログトップ | [ AIR ] Vistaでブラウザ挙動がおかしい? »

トラックバックURL :