魔法陣で召喚 その2

前回の問題点

前回のやり方では透明度が0.03となっているため完全な透明にはならず、よく見るとうっすらと輪郭が分かっていました。
そのため、色は材質設定などを設定して輪郭を目立たなくする処置が必要でした。
中には肉眼では気づかない方もいたかもしれませんが、スクリーンショットを取り、ペイント(Windows標準付属ソフト)で塗りつぶしを行うと、輪郭がはっきりと確認することが出来ます。

完全に透明にしてしまうと、モデルが非表示になってしまうので、完全な透明化はムリなのかなとあきらめていたのですが、 先日ジオさんにより完全な透明化の方法が発見され、Easy3DサンプルWikiでサンプルが公開されました。
今回はこの方法をまとめてみました。

やり方

やり方は簡単で、透明ボックスの設定を次のように設定します。

  • 頂点のアルファ値を0.0に設定する。
  • 半透明モードの設定を頂点アルファ値による半透明モードか頂点アルファ値による加算モード(アッドモード)に設定します。

スクリプトの記述ではこのようになります。

	E3DSetAlpha2 透明ボックス, 0.0, -1, 1
	E3DSetBlendingMode 透明ボックス, -1, 0

このように頂点アルファ値を使用した方法を用いることで、透明度0.0にしても非表示にならず、 完全な透明として表示されるようになります。

デフォルトのままでは頂点アルファ値を使用しないようになっているようです。


隠したいモデルを透明にする入れ物を勝手ながら「透明ボックス」と呼ぶことにしました。概念が近いものに「透明マント」 というのがあるのでボックスだから透明ボックスという感じです。

やっぱり問題点

しかしこれでもやはり問題点はあります。
隠したいモデルが複数ある場合、手前に透明ボックス、その向こう側の影にまた別の透明にしたいモデルが会った場合、 その別のモデルまで見えなくなってしまうことがあります。
この問題を回避するには、カメラからの距離で描画(E3DRender)する順番をうまくソートしてやる必要があります。
しかし、それらのモデル同士が重なってしまった場合、部分的に順番が入れ替わったりすることがあるため、 単純なソートでは対応できない場合が予想されます。

使い方がなかなか難しいところです。


しかし、問題点が分かっていれば運用側で対策する方法もあります。
まず特別なシーンの演出効果として1つだけ使用する方法が考えられます。
また位置関係が変わらず、十分距離がある場合なら複数の使用も難しくは無いでしょう。
今のところは運用でうまくカバーするしかないようです。

モデルを準備する

今回の方法ではあとから頂点アルファ値を設定するので、魔法陣透明ボックスは分けて作成しました。
一応E3DSetAlpha2命令を使用するので、パーツ番号で指定すれば透明ボックスだけに頂点アルファ値を設定できるのですが、 今回はパーツ番号を調べるのが面倒だったのと、汎用的なサンプルとして分かりやすくするため分けて作成しました。
分けておいたほうが魔法陣を色々変更しても、透明ボックスを再利用できるというメリットもありますね。(あ、ディスプレイスイッチ使えばいいのか。)


メタセコイア

魔法陣
板モデルを作成してテクスチャを貼りましょう。座標はY座標を0.0にしておくと後で使いやすいと思います。
透明度を1.0より小さい値、0.99ぐらいに設定するのを忘れずに。(RokDeBone2でも設定できます。)
両面表示するようにしておくのも忘れないようにしましょう。(これもRokDeBone2でも設定できます。)
透明ボックス
魔法陣の端の部分にあわせて大きさを決め、まっすぐに下に伸ばした柱上のモデルを作成します。隠したいモデルが隠れるくらい十分な長さで作ってきます。
先ほど作った魔法陣のモデルを表示しながら調整するといいですね。
モデルの上面の座標は先ほど作った魔法陣と同じY座標にしておくといいでしょう。
材質を設定する必要はありません。

RokDeBone2

魔法陣
階層構造エディタから魔法陣を右クリックしてSig Paramsダイアログを表示します。
表示面を「3:両面」にします。
面の色の透明度が1.0より小さくなっていることを確認します。(0.9999など)
OKをクリックして設定を反映させます。
設定が反映されたことをメイン画面で確認します。
透明ボックス
何もする必要はありません。そのままsigファイルに出力してください。

完全な透明化が出来るため、目立たなくする必要がない分だけ前回に比べるとずいぶん楽になりました。
では作成したモデルを使ったサンプルを見てみてください。

サンプル

サンプル実行結果(見た目同じなので前回の画像)

魔法陣でタコを召喚するサンプルです。
魔法陣の方が上下に動いて、タコを出したり消したりします。
キーボードの上下キーでカメラ位置を変更できますので好きな位置から見てください。

タコモデルのファイルtako.sigとタコ用テクスチャファイルtako01.bmpを用意しておいてください。
下のファイルを解答するとMediaフォルダが出てきますのでその中にコピーしてください。
実行に必要なファイル:e3d3039.zipmd_mapdata.zip
下のスクリプトは前後省略してあります。

	…

	;/////////////////
	;
	;	形状データのロード
	;
	x = 5000.0 : y = 0.0 : z = 5000.0
	sdim mediadir, 2048
	;	タコ
	mediadir = dir_cur + "\\Media\\tako.sig"
	E3DSigLoad mediadir, hsid(1)
	E3DSetPosOnGroundPart hsid(1), hsid(0),, mapheight,, x, z

	;	魔法陣
	mediadir = dir_cur + "\\Media\\魔法陣.sig"
	E3DSigLoad mediadir, hsid(2)
	E3DSetPos hsid(2), x, y+500.0, z

	;	透明ボックス
	mediadir = dir_cur + "\\Media\\透明ボックス.sig"
	E3DSigLoad mediadir, hsid(3)
	E3DSetPos hsid(3), x, y+500.0, z
	;透明化処理
	E3DSetAlpha2 hsid(3), 0.0, -1, 1
	E3DSetBlendingMode hsid(3), -1, 0	;blendmodeは2でもいい

	pdy = 10.0


;/////////////////
;
;	メインループ
;
*main
	E3DGetKeyboardState keybuf	;キー状態取得


	E3DBeginScene	;-----シーンスタート

		;モデルが、視野内にあるか判定
		repeat 4
			E3DChkInView scid, hsid(cnt)
		loop

		if keybuf.VK_ESCAPE = 1 : goto *bye ; [ESC]で終了
		gosub *MoveChara		;キャラクター移動
		gosub *MoveCamera		;カメラ移動

		;オブジェクトの描画をする
		E3DRender scid1, hsid(0), 0, 0, 0	;地面
		E3DRender scid1, hsid(2), 0, 0, 0	;魔法陣
		E3DRender scid1, hsid(3), 0, 0, 0	;透明ボックス
		E3DRender scid1, hsid(2), 1, 0, 0, 0, 0, 1	;魔法陣
		E3DRender scid1, hsid(3), 1, 0, 0, 0, 0, 1	;透明ボックス
		E3DRender scid1, hsid(1), 0, 0, 0	;タコ描画(透明化したいオブジェクトは一番最後に描画する)

	E3DEndScene			;-----シーン終了
	E3DPresent scid1	;バックバッファの内容を、プライマリバッファに転送。描画する。

	E3DWaitByFPS 60, chkfps1 : await 0
	title ""+chkfps1 + " FPS"

goto *main

	…