太郎日記’79J

「やったろうやないの。」な太郎のblog
技術ネタはタロタローグに任せて、こっちはニュースメインで。
<< June 2018 | 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 >>
 
RECOMMEND
MySQLによるタフなサイトの作り方
MySQLによるタフなサイトの作り方 (JUGEMレビュー »)
佐藤 真人,桑野 章弘,岡田 達典,大黒 圭祐
MySQLだけでなく、DBサーバやアプリの設計など、あらゆる手段を使ってタフなサイトを作る本である
最新記事
あわせて読みたい
あわせて読みたい
なかのひと
ClusterMaps
CM by JUGEM
スポンサーサイト

一定期間更新がないため広告を表示しています

- | 個別記事 | - | -
LOAD TO NEGI〜Papervision3Dで初音ミク〜(2):アルファマップの作り方

さて、Metasequoiaクラスがアルファマップを読み込んでないと言う話だが、
とりあえず一歩前進した。
ひとまず、アルファ画像とテクスチャ画像を読み込み、
透過すべき部分を透明表示できるようになった。
ということで、今後はMetasequoiaクラスのテクスチャ構築ロジックを改造し、
テクスチャとアルファからビットマップを生成してマテリアルとして利用できるようにするわけだ。

と、言うわけでサンプルで試してみたものがこれ。

左から、テクスチャ画像、アルファマップ画像、生成したテクスチャの順に並んでる。
ソースは下に。
鍵は、
bmp.bitmapData.copyChannel(bmpAlpha.bitmapData , 
                           bmpAlpha.bitmapData.rect , 
                           new Point(0,0) , 
                           BitmapDataChannel.RED , 
                           BitmapDataChannel.ALPHA);
の部分。
色々調べてたんだが、
BitmapDataを簡単にマスクする方法(BeInteractive!)
に答えが載ってた。
この方法に従って、テクスチャ画像にアルファ画像でマスクをかける。
アルファ画像はモノクロなので、RGBどのチャンネルを使ってもいける。
package {
    import flash.display.*;
    import flash.events.Event;
    import flash.geom.Point;
    import org.papervision3d.cameras.FreeCamera3D;
    import org.papervision3d.materials.*;
    import org.papervision3d.objects.*;
    import org.papervision3d.scenes.Scene3D;

    [SWF(width='300',height='300',backgroundColor="#cccccc", frameRate="30")]
    public class AlphaTest extends Sprite
    {
        [Embed(source="data/taro_alpha.png")]private var Alpha:Class;
        [Embed(source="data/taro.png")]private var Taro:Class;
        private var container:Sprite;
        private var scene:Scene3D;
        private var camera:FreeCamera3D;
        private var rootNode:DisplayObject3D;
        private var alphaPlane:Plane;
        private var maskPlane:Plane;
        private var normalPlane:Plane;

        public function AlphaTest()
        {
            container = new Sprite();
            container.x = 100;
            container.y = 100;
            addChild( container );


            scene = new Scene3D( container );

            // カメラ作成
            camera = new FreeCamera3D();
            camera.x =60;
            camera.y = 20;
            camera.z = -900;
            camera.zoom = 100;
            camera.focus = 10;

            rootNode = scene.addChild( new DisplayObject3D("rootNode") );

            //透明マップを読み込み
            var bmp:Bitmap = new Taro();
            var bmpAlpha:Bitmap = new Alpha();

            //不透明用
            var bmp2:BitmapData = bmp.bitmapData.clone();

            //透明化する
            bmp.bitmapData.copyChannel(bmpAlpha.bitmapData , 
                                                     bmpAlpha.bitmapData.rect , 
                                                     new Point(0,0) , 
                                                     BitmapDataChannel.RED , 
                                                     BitmapDataChannel.ALPHA);

            //透明マテリアル作成
            var materialA:BitmapMaterial = new BitmapMaterial(bmp.bitmapData);
            materialA.oneSide = false;
            //不透明マテリアル作成
            var materialN:BitmapMaterial = new BitmapMaterial(bmp2);
            materialN.oneSide = false;
            //マスク用画像をマテリアルにする
            var materialM:BitmapMaterial = new BitmapMaterial(bmpAlpha.bitmapData);
            materialM.oneSide = false;


            alphaPlane = new Plane(materialA , 100 , 100 , 8 , 8);
            normalPlane = new Plane(materialN , 100 , 100 , 8 , 8);
            maskPlane = new Plane(materialM , 100 , 100 , 8 , 8);

            maskPlane.x = 100;
            alphaPlane.x = 200;

            rootNode.addChild(alphaPlane);
            rootNode.addChild(normalPlane);
            rootNode.addChild(maskPlane);
            //フレームごとの処理
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }

        private function onEnterFrame( event:Event ):void {
            alphaPlane.rotationY += 3;
            normalPlane.rotationY += 3;
            maskPlane.rotationY += 3;
            scene.renderCamera( camera );
        }
    }
}
ちなみに、バンプマップは無理。

スポンサーサイト
- | 個別記事 | - | -
ドミノ・ピザでも食べながら、コメントをどうぞ。
コメントする









 
トラックバック
この記事のトラックバックURL(記事と無関係なトラックバックは削除される可能性があります)
※記事が投稿されてから30分の間、トラックバックを行うことが出来ません。
http://tarotaro.jugem.cc/trackback/1608
 

Copyright (C) 2004 paperboy&co. All Rights Reserved.

Powered by "JUGEM"