2007.09 Monthly archives

Papervision3Dメモ #30

2007.09.28

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が貼れない理由がわからん。メッシュをアジの開きにした際に矩形にならないものはダメってことかなぁ。

中秋の名月

2007.09.26
p9264548.jpg

ただの天体写真になってしまった。

Papervision3Dメモ #29

2007.09.23

CurlingPlane.as を試す

lee felarca氏のblogで随分前に公開された、CurlingPlane.asの使い方が全然解んなくてずっと放置してたんだけど、やっとこさ理解できたので氏のサンプルと同じようなものを作ってみた。

e_curling.jpg

curling_Plane.swf(要:FlashPlayer9)
画像をドラッグするとページをめくれる。

このクラスの使い方は、

var planeObj:CurlingPlane = new CurlingPlane ( BitmapData,  CurlingPlaneの分割数);
planeObj.rotate(0);
scene.addChild( planeObj );

のような感じ。

rotate()メソッドで、ページのめくれ角度を0〜180で指定する。
長いことハマってたのは、rotate()メソッドで、角度を指定しないと画面に表示されないことに気が付かなくて、関係ないことばっかりやってたから。

また、lee felarca氏の別のエントリのコメント欄で紹介されているパッチをCurlingPlane.asに追記すると、

var planeObj:CurlingPlane = new CurlingPlane ( BitmapData,  CurlingPlaneの分割数, 裏返すかどうかのフラグ:Boolean);

のように、CurlingPlaneを定義できる。ページめくりには表と裏の2枚のPlaneが必要なんだけど、lee felarca氏のオリジナルクラスには、裏返しにするための処理が含まれてないので、このパッチを当てたほうが扱いやすい。

[Papervision3D] PV3D + modestmaps

2007.09.06

Maps.swf(要:FlashPlayer9)
※負荷が心配なのでスグ消すかも。

PV3Dとスクロールマップサービスを連動させて、バードビューな表示をするための習作。
せめてドラッグスクロールできるようにはしてみたい。
サクっと出来ると思ってたのに、MovieMaterialにMapオブジェクト突っ込んだ途端「Sandbox違反」。そういうことなのか〜。悩みに悩んだ挙げ句、Perlスクリプトを間に挟んで回避するというヤンチャな手段に打って出た。YahooMaps AS-Flash API使ったほうがぜんぜん楽チンだったかもしれない。GoogleMapsは確実にライセンス違反だろうから断腸の思いで見送る方向で。

Papervision3Dメモ #28

2007.09.01

Line3Dを試す

Andy Zupko氏による、PV3D用クラス「Line3D」を試してみた。
3Dフラクタルの木。ありがちー。しかもアルゴリズムが良くないのでやたら重い。むー。

e_tree3d.jpg

tree3d.swf(要:FlashPlayer9)

Line3Dは、

var varray:Array = new Array();
var v1:Vertex3D = new Vertex3D(x,y,z);
var v2:Vertex3D = new Vertex3D(x,y,z);
varray.push(v1);
varray.push(v2);
var obj_Line:Line3D = new Line3D(varray, 線の色:int, 線のアルファ:Number , 線の太さ:int);
scene.addChild( obj_Line );

みたいにして使う。もしくは、

obj_Sphere = new Sphere(new ColorMaterial( 0x0099cc), edgeSize, seg, seg);
var obj_Line:Line3D = new Line3D(obj_Sphere.geometry.vertices, 線の色:int, 線のアルファ:Number , 線の太さ:int);

って感じで。

早速Tweenerと連携させてる人とかもいたりして、いろいろできそう。
今のところ公式のクラスじゃないので、ダウンロードは上記のAndy Zupko氏のblogから。