Alternativa3Dを試してみる Part.07 : カメラをぶらして残像効果

Alternativa3D

Flash の 3D エンジンの一つである Alternativa3D (オルタナティバ 3D)を試してみるシリーズ第7回。3Dでのモーションブラーを作ってみました。次のデモは、ドラッグ&ドロップでカメラの視点を動かすことができ、左上のCaptureボタンで撮影・保存することができます。保存した画像は、モーションブラーが適用された写真となっています。

  • demo (要 Flash Player 10)
  • source (別途、BasicTemplateが必要)

※特定の角度でバグりますが、深度の調整していないだけなので、ご容赦。

モーションブラー

カメラの位置を微振動させて、都度キャプチャをとり透明度をずらしながらBitmapDataを重ね合わせるという方法で実現してみました。この技術手法はAlternativa3DでなくてもPapervision3DでもAway3Dでも同じようにできますが、流行らせたいこともありせっかくなのでAlternativa3Dで作ってみました。

下記の左上側がオリジナルで、右下側がモーションブラーを適用して保存した画像になります。(クリックで拡大)

モーションブラー

ソースコードでいうと次のような箇所。

        // ----------------------------------------------
        // Capture
        // ----------------------------------------------
        private function capture(e:Event):void{
            var o:Point3D = new Point3D(camera.x, camera.y, camera.z);

            var bd1:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, true, 0x00000000);
            bd1.draw(view);

            scene.root.removeChild(loader1.content);

            var bds:Vector.<BitmapData> = new Vector.<BitmapData>();
            for (var i:int = 0; i < 10; i++) {
                camera.coords = getRandomPos(o);
                scene.calculate();
                var bd:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, true, 0x00000000);
                bd.draw(view);
                //bd.applyFilter(bd, bd.rect, new Point, new BlurFilter(2, 2, 1));
                bds.push(bd);
            }
            bds.fixed = true;

            // make pictur
            var master:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, false, 0xFF000000);
            master.lock();
            master.copyPixels(bd1, bd1.rect, new Point());
            for (i = 0; i < bds.length; i++) {
                master.copyPixels(bds[i], bds[i].rect, new Point(), new BitmapData(stage.stageWidth, stage.stageHeight, true, 0x20000000), new Point, true);
            }
            master.unlock();

            var enc:PNGEncoder = new PNGEncoder();
            var fileRef:FileReference = new FileReference();
            fileRef.save(enc.encode(master), "capture.png");

            // reset
            camera.coords = o;
            scene.root.addChild(loader1.content);
        }

        private function getRandomPos(o:Point3D):Point3D {
            var len:Number = 15;
            return new Point3D(
                o.x + len * (Math.random() - 0.5),
                o.y + len * (Math.random() - 0.5),
                o.z + len * (Math.random() - 0.5)
                );
        }

※3Dデータはnote.xさんのところのズサさんご提供のものを使用しています。
http://blog.r3c7.net/?p=121
※ColladaファイルをBlenderで3DSファイルに変換したものを使用

Alternativa3Dの関連記事

投稿者 : 池田 泰延

BookMark

ブックマークはこちらからどうぞ。

このエントリーをはてなブックマークに追加