ビルボードを使ってみる

Easy3Dのサンプルではマップ上に植えられた木で使用されています。
どの角度から見ても同じ方向(カメラの方向)を向けつづけるプレート(板)です。
ポリゴンモデルより軽いのでたくさん使いたい場合に使ったり、ポリゴンと違った表現が出来ます。


使い方


E3DSigLoad mediadir, hsid1 ; E3DSetPos hsid1, 0, 0, 0 E3DCreateBillboardでビルボードを作ってE3DSetBillboardPosで配置します。
E3DRenderBillboard は、形状データ(*.sig)でのE3DRenderに相当する命令です。メインループ内で使用してください。
E3DRenderと違い、作成されたビルボード全てを描画します。

形状データとビルボード用命令の対応
形状データ ビルボード
E3DSigLoad E3DCreateBillboard
E3DSetPos E3DSetBillboardPos
E3DRender E3DRenderBillboard


半透明とか


 画像の背景を透明にするには、透過させたい範囲を黒(0,0,0)で塗りつぶしておきます。
あとはE3DCreateBillboardtransparentflagを有効にしてやると、黒の部分が透けて表示されます。

 加算モードと半透明モードでの表示が可能です。(E3DSetBlendingMode
半透明の透明さはE3DSetAlpha2で指定します。

【例】 E3DSetAlpha2 -1, 2, 3, bbid1

ビルボードIDがbbid1のビルボードの透明さを約0.67に設定します。
HSP2では小数の取扱いが不得意なのでアルファ値(透明さの値)の設定には分数を使用します。
この場合は、2/3≒0.67となっています。このような指定方法はEasy3Dではよく使用されています。
また、アルファ値(透明さの値)は0に近いほど透明で、1に近いほど非透明になります。


fps値の表示を安定させる


 ビルボードは関係ありません。
スペース余ってるので今回はfpsの表示をちょっといじってみたのでその解説を。
 指定したfpsで安定していればいいのですが、実際はなかなか安定しないので 1/60秒ごとに数字が行ったり来たりで読み取れません。
そこで、fps値をある程度安定させて表示させることにしました。
 今回は、常に60回分(1秒)のfps値を合計して平均を取ることで安定表示させます。
サブルーチンfps_anteiでこの処理を行なっています。
過去1秒間の平均なのでちょっと反応が遅いです。


サンプル

BMPファイルをビルボードで表示します。回転しながら移動するサンプルです。

BMPファイルは自分で用意してもらってもいいのですが、こちら(e3dbb01.zip)を ダウンロードしていただけばBMPファイル(pict.bmp)が付属しています。

大きな更新個所のみ赤色で表示しています。


;
;	ビルボードを使用する
;

#include "e3dhsp.as"

	;/////////////////
	;
	;	初期化
	;
	mes "Please wait..."
	E3DInit
	dim keybuf, 256		;キー入力
	E3DCreateFont 24,12,400,,,,"MS ゴシック",fontid	;フォントの設定
	dim wtimeall,61		;FPS表示を安定させるのに使用。


	;/////////////////	
	;
	;	カメラの初期化
	;
	E3DSetProjection 100, 50000


	;/////////////////	
	;
	;	ライトの設定
	;
	E3DCreateLight lid1		;光源を作成
	lightdirx1 = 0		;平行光の向き
	lightdiry1 = -1
	lightdirz1 = -1
	lightr1 = 255	;平行光の色
	lightg1 = 255
	lightb1 = 255
	E3DSetDirectionalLight lid1, lightdirx1, lightdiry1, lightdirz1, lightr1, lightg1, lightb1	;光源を平行光源に設定


	;/////////////////	
	;
	;	形状データのロード
	;

	;ビルボード作成
	sdim mediadir2, 2048
	mediadir2 = curdir + "\\pict.bmp"		;適当なサイズのbmpファイルを指定してください。
	;画像サイズ取得
	buffer 2 : picload mediadir2
	px = winx : py = winy
	gsel 0, 1

	;モデル配置
	E3DCreateBillboard mediadir2, px*3, py*3, 1, bbid1, 1, 1	;表示画像サイズの調整はここでやる。
	E3DSetBillboardPos bbid1, 0, 0, 0
	E3DCreateBillboard mediadir2, px*3, py*3, 1, bbid2, 1, 1
	E3DSetBillboardPos bbid2, 100, 200, 0

	;半透明などの処理
;	E3DSetBlendingMode -1, bbid1, 1	;加算モード
;	E3DSetAlpha2 -1, 2, 3, bbid1		;半透明



;////////////////////////////////////////////////////////////////

;/////////////////
;
;	メインループ
;
*main
	E3DGetKeyboardState keybuf	;キー状態取得
	if keybuf.VK_ESCAPE = 1 : goto *bye	;[ESC]で終了

	;バックバッファへの書き込み作業を行う
	E3DBeginScene	;-----シーンスタート
		;ビルボードの運動処理
		;	自転
		E3DRotateBillboard bbid1, 8,1,0
		E3DRotateBillboard bbid2, 2,1,0

		;	円周移動
		E3DCos rr, 1500, rx
		E3DSin rr, 1500, rz
		E3DSetBillboardPos bbid1, rx+100, 200,rz
		rr+=2	;回転角度
		if rr>=360 : rr = rr-360

		E3DRenderBillboard	;全ビルボードの描画

		E3DDrawTextByFontID fontid, 10,40, "" + wtime + " fps", 255,255,255,255

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

	;FPSを設定する。
	E3DWaitbyFPS 60 : await 0
	gosub *fps_antei

goto *main

;////////////////////////////////////////////////////////////////
;
;	サブルーチン
;

;/////////////////
;
;	終了処理
;
*bye
	E3DDestroyLight lid1	;ライトを破棄
	E3DBye
	end

;/////////////////
;
;	fps値の表示安定化
;
*fps_antei
	;60回の実測値平均を取る。
	;値が不安定だとどのくらいのFPSが出ているのか読み取れないので、この対策。
	;FPSはE3DWaitbyFPSで指定した値以上にならないよう調整されるため、指定した値以下になっても以上にはならない。
	;	このため普通は設定値より少し小さいFPSが表示される。
	i=0 : wtimesum = 0 : wtimeall.60 = stat
	repeat 60
		i++
		wtimeall.cnt = wtimeall.i
		wtimesum += wtimeall.cnt
	loop
	wtime = wtimesum / 60
	return





- HOME -

GHP(仮)