LoginSignup
3
2

More than 5 years have passed since last update.

Flash(+Stage3D)の背景を透明化する

Last updated at Posted at 2014-09-03

Stage3Dが現れる前(FlashPlayer10以前)はFlashの透過は割と簡単だったのですが、Stage3Dのせいでややこしくなったようです。
Stage3DってのはFlashで(まあまあ)本格3Dを扱うための機能なので、結構重要です。

Flash(Not Stage3D) + HTML

HTML上で以下のオプションを設定

wmode="transparent"

Flash(Not Stage3D)+NativeWindow

AIRのアプリケーション記述XMLのinitialWindowの項目に以下の設定を追加します。

<systemChrome>none</systemChrome> 
<transparent>true</transparent> 

Flash(Stage3D) + HTML

できないような気がします。
wmodeにtransparentとdirectの両方を設定したいのですが、それが無理なので。。。

Flash(Stage3D)+NativeWindow

ここからが本題です。
AIRのアプリケーション記述XMLのinitialWindowに以下の設定を追加します。

<systemChrome>none</systemChrome> 
<transparent>true</transparent> 
<renderMode>direct</renderMode>  

ただしこのままだと透明色でクリアしたとしても背景が残ります。

context3D.clear(1, 0, 1, 0);//アルファ0なのに表示されちゃう!

2014-09-03_17h44_19.png

画像の紫の部分が透明になって欲しい部分です。

つまり3D描画は背景のみ透明で表示とかできないっぽいです。
というわけで考えたのがFlashの昔ながらのSpriteに3Dを転写して表示する方法です。

Context3DのdrawToBitmapDataというメソッドを使うと、Bitmapクラスに描画することができるのでそれを使います。
BitmapクラスならいつものようにStageにaddChildで追加して表示できます。

1.Windowの大きさのBitmapクラスをaddChildします。

var bitmap:Bitmap = new Bitmap(new BitmapData(stage.stageWidth, stage.stageHeight, true));
addChild(bitmap);

2.Stage3Dを不可視にします。

初期化とかは通常通りでいいと思います。
描画前にvisibleをfalseにします。

stage3D.visible = false;

3.画面を0でクリアします

context3D.clear(0, 0, 0, 0)

4.Bitmapに3Dを描画します。

context3D.drawToBitmapData(bitmap.bitmapData);

これで完了です。

一番苦労したのは3番です。
r:0、g:0、b:0、a:0だと描画されないのですが(つまり黒にはならない)、r:1、g:0、b:0、a:0とかにすると赤色になってしまうのです。(アルファ0なのに!)
ちょっと仕様として信用してよいのか微妙ですが、とりあえずこれでWin7,8、Macでは背景透明に出来ました!

2014-09-03_18h02_04.png

サンプルは下記URLとかで手に入るらしいですよ(ステマ)
Live2D SDK マニュアル 「Flashでデスクトップマスコットを作ろう」
https://sites.google.com/a/cybernoids.jp/cubism2/simple-app/desctopmascot

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2