ビルボードを使ってみる

Easy3Dのサンプルではマップ上に植えられた木で使用されていますね。
ビルボードとは、どの角度から見ても同じ方向(カメラの方向)を向けつづけるプレート(板)です。
スプライトとは違い3D空間に配置するため、カメラから遠い場所に置けば小さく見えるし、近くなら大きく見えます。 本来は板なので横から見れば薄っぺらなのですが、つねに面をカメラの方向に向けるため、薄っぺらに見えません。
ポリゴンモデルより軽いのでたくさん使いたい場合に使ったり、ポリゴンと違った表現が出来ます。

使い方


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

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

半透明とか


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

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

【例】 E3DSetAlpha2 -1, 0.6, bbid1

ビルボードIDがbbid1のビルボードの透明さを0.6に設定します。
アルファ値(透明さの値)は0に近いほど透明で、1に近いほど非透明になります。

サンプル

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

BMPファイルは自分で用意してもらってもいいのですが、こちら(e3d3018.zip)を ダウンロードしていただけば必要なBMPファイル(pict.bmp)が付属しています。
またこのzipファイルには今後公開するサンプルスクリプトで使用するファイルも含まれています。

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

#include "e3dhsp3.as"

	;/////////////////
	;
	;	初期化
	;
	wid = 0		;ウインドウID
	objid = -1	;オブジェクトID
	fullscreenflag = 0		;フルスクリーンフラグ
	bits = 16	;色数ビット数(fullscreenflag = 1 のときのみ有効)
	multisamplenum = 0		;アンチエイリアスのマルチサンプル数(0,2~16)
	;scid	スワップチェインID
	E3DInit wid, objid, fullscreenflag, bits, multisamplenum, scid

	;/////////////////
	;
	;	カメラの初期化
	;
	camposx = 2000.0 : camposy = 0.0 : camposz = 0.0
;	camposx = 0 : camposy = 0 : camposz = 4200	;デフォルト値
	E3DSetCameraPos camposx, camposy, camposz	;カメラ座標を設定
	targetx = 0		;注視点座標
	targety = 0
	targetz = 0
	upvecx = 0		;カメラの上方向のベクトル
	upvecy = 1
	upvecz = 0
	E3DSetCameraTarget targetx, targety, targetz, upvecx, upvecy, upvecz	;カメラの注視点を設定
	;プロジェクションの設定
	proj_near = 100.0 : proj_far = 50000.0 : proj_fov = 0.0
	E3DSetProjection proj_near, proj_far, proj_fov

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

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

	;ビルボード作成
	sdim pathbuf, 2048
	pathbuf = dir_cur + "\\Media\\pict.png"		;適当なサイズのbmpファイルを指定してください。
	;画像サイズ取得
	px=50
	py=50
	rr = 0.0

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

	;半透明などの処理
	E3DSetRenderState -1, -1, D3DRS_LIGHTING, 0	;ライトの無効化
;	E3DSetBlendingMode -1, bbid1, 1	;加算モード
	E3DSetAlpha2 -1, 0.5, bbid2		;半透明

;/////////////////
;
;	メインループ
;
*main
	E3DBeginScene	;-----シーンスタート
		;バックバッファへの書き込み作業を行う

		stick key
		if key&128 : goto *bye

		;ビルボードの運動処理
		;	自転
		E3DRotateBillboard bbid1, 8, 0
		E3DRotateBillboard bbid2, -2, 0

		;	円周移動
		E3DCos rr, rx
		E3DSin rr, rz
		E3DSetBillboardPos bbid1, rx*500+100, 0,rz*500
		rr+=1.0		;回転角度
		if rr>=360.0 : rr = rr-360.0

		E3DRenderBillboard scid1	;全ビルボードの描画

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

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

goto *main


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