note.x

Papervision3Dメモ #30

GeodesicSphere

PV3DMLで以前紹介された、GeodesicSphere.asを使ってみた。
通常のSphereオブジェクトは、四角ポリゴンを三角メッシュに分割して作られるのに対して、GeodesicSphereは正多面体で構成される。なので『極』が無い球体が作れる。

e_geodesic.jpg

obj_GeodesicSphere.swf(要:FlashPlayer9)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package
{
    import flash.display.*;
    import flash.events.*;
 
    import org.papervision3d.core.*;
    import org.papervision3d.scenes.*;
    import org.papervision3d.objects.*;
    import org.papervision3d.cameras.*;
    import org.papervision3d.materials.*;
    import org.papervision3d.events.*;
 
    [SWF(backgroundColor=0x000000)]
 
    public class obj_GeodesicSphere extends Sprite
    {
 
        private var container : Sprite;
        private var scene     : MovieScene3D;
        private var camera    : Camera3D;
        private var rootNode  : DisplayObject3D;
        private var valx      : Number = 0;
        private var valy      : Number = 0;
 
        public function obj_GeodesicSphere():void
        {
            stage.frameRate = 60;
            stage.quality   = StageQuality.MEDIUM;
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
            this.addEventListener(Event.ENTER_FRAME, loop3D);
            init3D();
        }
 
        private function init3D():void
        {
            container = new Sprite();
            addChild(this.container);
            container.x = stage.stageWidth / 2;
            container.y = stage.stageHeight / 2;
            stage.addEventListener(Event.RESIZE, onStageResize);
 
            scene = new MovieScene3D( container );
 
            camera = new Camera3D();
            camera.z = 500;
            camera.focus = 500;
            camera.zoom = 1;
 
            rootNode = scene.addChild( new DisplayObject3D( "rootNode" ) );
 
            var shadeMaterial:ShadedColorMaterial = new ShadedColorMaterial( 0x00ccff );
 
            var icosa:GeodesicSphere = new GeodesicSphere(shadeMaterial, 300, 2);
            rootNode.addChild(icosa);
            icosa.x = 0;
            icosa.y = 0;
            icosa.z = 0;
        }
 
        private function loop3D( event:Event ):void
        {
            valx += this.container.mouseX / 50;
            valy += this.container.mouseY / 50;
            rootNode.rotationY = valx;
            rootNode.rotationX = valy;
 
            scene.renderCamera( camera );
        }
 
        private function onStageResize(event:Event):void
        {
            container.x = this.stage.stageWidth  / 2;
            container.y = this.stage.stageHeight / 2;
        }
 
    }
}

残念だったのが、正二十面体が作れることを期待してたのにできなかったことと、BitmapMaterialが貼れないこと。Sphereと違って『極』が無いから、

テクスチャが極に向かって収束しないで貼れそう。

Google Earth的なものが作れる?

とか妄想してたんだけど、いきなりずっこけてしまった。考えが浅すぎた。にしてもBitmapMaterialが貼れない理由がわからん。メッシュをアジの開きにした際に矩形にならないものはダメってことかなぁ。


Trackback URL : http://blog.r3c7.net/as3-software-rendering/109/trackback/

Leave a Reply