プログラミング工房
TOP
Flex基本
開発環境 JavaScript連携 PHP連携1 PHP連携2(AMFPHP) ウィンドウ ボタンスキン 矩形スキン ローカルファイル(テキスト) F5等の対策 ローカルファイル(イメージ) ダウンロード、アップロード 1枚の画像のカラーを変更 時間のかかる計算処理 外部SWFの読込み
Flexで3D
Flexだけで3D Papervision3Dを使ってみる 3Dオブジェクト カメラ、前後判定の工夫しました 自由な形状を作成
Flexでクラス
Class1(白黒ゲームの盤) Class2(白黒ゲームのプレイヤー) Class3(プレイヤーを外部SWF)
PHP
共通関数1
Flexの作品
お問合せの説明 サンプルのソース表示の説明 分子構造の表示(PDBファイル) マンデルブロ集合の画像作成 swf参加型白黒ゲーム(Reversi) ストップウォッチ WEB素材
AIR
AIRを使ってみる ソースファイルのHTML変換を作る
etc.
マンデルブロ集合のギャラリー ジュリア集合のギャラリー wonderflを使ってみました お問合せ

Flexで3D-自由な形状を作成

■2011.04.04:作成
サンプル サンプルのソース

TriangleMesh3Dで自由な形状を作成

Papervision3Dの標準で提供されている立体(平面、球、立方体等)でない形状を作るには
3角形を組み合わせて作ります。(標準の立体も3角形を組み合で出来ています。)

今回はX,Yを与えると立体的なX値を返す式(fncGetZ関数)を利用します。
(式の説明は重要でないので省きます、私自身もよくわかりません。)

まず、利用する3Dの座標(Vertex3D)を「TriangleMesh3D」に登録します
(登録していない座標は使用できないようです)
次に、登録座標を利用して「Triangle3D」で3角形を作っていきます。
(この時、3点を反時計回り(?)方向に結んだ面が表です。
私の場合、「compoMat.doubleSided = true;」をコメントにして表・裏の確認を行います。)
    //マテリアル定義
    var compoMat:CompositeMaterial = new CompositeMaterial();
    var matShade:FlatShadeMaterial = new FlatShadeMaterial(light, 0xaaffaa, 
                              0x668866);
    var matWire:WireframeMaterial = new WireframeMaterial( 0x000000, 0.2);
    compoMat.addMaterial(matShade);
    compoMat.addMaterial(matWire);
    compoMat.doubleSided = true;  //裏表示
    //使用する座標を求める
    var arrVec3D:Array = new Array();
    var mesh:TriangleMesh3D = new TriangleMesh3D( compoMat,
                                     new Array(), new Array(), null );
    for (var x:Number = -200; x <= 200; x += 20) {
        for (var y:Number = -200; y <= 200; y += 20) {
            var v3dP:Vertex3D = new Vertex3D(x, fncGetZ(x, y), y);
            arrVec3D.push(v3dP);
            mesh.geometry.vertices.push( v3dP );
        }
    }
    //形状の作成
    for (var i:Number = 0; i < 20; i++) {
        for (var j:Number = 0; j < 20; j++) {
            //三角2枚で四角を作成
            mesh.geometry.faces.push( new Triangle3D( mesh, 
                    new Array(
                        arrVec3D[i+j*21],
                        arrVec3D[i+21+j*21],
                        arrVec3D[i+1+j*21])
                    , null,null ));
            mesh.geometry.faces.push( new Triangle3D( mesh, 
                    new Array(
                        arrVec3D[i+1+j*21],
                        arrVec3D[i+21+j*21],
                        arrVec3D[i+22+j*21])
                    , null,null ));
        }
    }
    rootNode.addChild(mesh);

    //回転角度の初期化
    onClear();
}
//XYからZ値を求める式
private function fncGetZ(x:Number, y:Number):Number {
    var z:Number = 30.0 * (Math.cos(Math.sqrt(x * x + y * y)*Math.PI/180.0) 
                + Math.cos(3.0 * Math.sqrt(x * x + y * y)*Math.PI/180.0));
    return z;
}

プログラミング工房