地面の作成

 キャラクターが表示できたら、次は地面が必要です。(宇宙が舞台のゲームなら必要ありませんが。)

 Easy3Dでは複雑な地形も簡単に作成することが出来ます。
また複雑な起伏のある地面でも、キャラクターを起伏に合わせて地表を移動させることも出来ます。
ここでは地面の作り方だけを解説します。
なお多少説明不足な部分もありますのでEasy3Dの付属マニュアルe3dhsp_ground.htmも参照するようにしてください。


準備

 地面を作成するには、地面の高さ(座標)、道、川の3つの地形情報と、表示するための画像が必要です。
3つの地形情報と画像はそれぞれBMP画像ファイルで用意します。
今回は以下のような、3つ地形情報用画像を用意しました。
見やすいよう色分けしてありますが、色は黒でも何でも構いません。

山
地面の座標情報
道
地面の道情報
川
地面の川情報

 この地形情報を元に作成した地形に、地面や道らしい色、水や芝生の模様などを表現する画像を貼り付けます。
今回は分かりやすくなるように、こんなのを用意しました。
地面画像
地面、道、川の模様

まずはこの4つのBMPファイルを作成して用意しておいてください。







地面を作成

地面の作成はE3DLoadGroundBMP命令を用います。
後は通常のモデルと同様に扱います。


 E3DLoadGroundBMP 地面ファイル, 道ファイル, 川ファイル, 模様ファイル, maxx, maxz, divx, divz, maxheight, hsid

「地面ファイル, 道ファイル, 川ファイル, 模様ファイル」は、先ほどの説明した4つのファイルです。
hsid:地面モデルのID

maxx, maxzは、作成する地面の縦と横の辺の大きさを指定します。
maxx=10000,maxz=12000にすると、10000×12000の大きさの地面が作成されます。

divx, divzは、作成する地面の荒さを指定します。値が大きいほど画像で与えられた情報を正確に再現します。
たとえば、divx = 20, divz = 20を指定した場合、下図のような状態になります。このときE3DLoadGroundBMP命令は、 縦線と横線が交差した点の情報のみを読み取って地面を作成します。

maxheightは、作成する地面の最大高低差を指定します。
色の濃さが高さに対応します。

サンプル

用意したファイルを用いて地面を作成して表示するサンプルです。
カメラを動かしてみたり、光源を作成しない場合などを試してみてください。
実行に必要なファイル:e3d006.zip

前回のサンプルに追加した部分を赤色で表示してあります。


;
;	地面を作成する
;

#include "e3dhsp.as"

	;/////////////////
	;	初期化
	;
	E3DInit

	;/////////////////	
	;
	;	カメラの初期化
	;
	camposx = 0 : camposy = 2500 : camposz = 0
	E3DSetCameraPos camposx, camposy, camposz	;カメラ座標を設定
	targetx = 10		;注視点座標
	targety = camposy
	targetz = 10
	upvecx = 0		;カメラの上方向のベクトル
	upvecy = 1
	upvecz = 0
	E3DSetCameraTarget targetx, targety, targetz, upvecx, upvecy, upvecz	;カメラの注視点を設定
	E3DSetProjection 100, 50000


	;/////////////////	
	;
	;	ライトの設定
	;
	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, 4
	pathbuf.0 = curdir + "\\yama.bmp"	;地面の座標情報
	pathbuf.1 = curdir + "\\michi.bmp"	;地面の道の情報
	pathbuf.2 = curdir + "\\kawa.bmp"	;地面の川の情報
	pathbuf.3 = curdir + "\\bazou.bmp"	;地面、道、川の模様を決める、BMPファイル

	;地面作成用の値
	mapsize = 60000		;X,Z座標の最大値
	mapdiv = 60			;座標の分割数
	mapheight = 3000	;高さの最大値

	E3DLoadGroundBMP pathbuf.0, pathbuf.1, pathbuf.2, pathbuf.3, mapsize, mapsize, mapdiv, mapdiv, mapheight, hsid0
;	posx0 = 0 : posy0 = 0 : posz0 = 0
;	degx0 = 0 : degy0 = 0 : degz0 = 0
;	E3DSetPos hsid0, posx0, posy0, posz0	地面表示位置を設定
;	E3DSetDir hsid0, degx0, degy0, degz0	地面の向きを設定
	frameno0 = 0	;モーションは使用しない。


;/////////////////
;	メインループ
;
*main
	E3DChkInView hsid0	;モデルが、視野内にあるか判定
	E3DBeginScene	;-----シーンスタート
		;バックバッファへの書き込み作業を行う

		stick key
		if key&128 : goto *bye
		E3DRender hsid0, 0, frameno0, 0	;バックバッファにレンダリングする。(地面描画)

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


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



実行結果のサンプル画像 実行結果はこんな感じになります。
緑色の芝生「しば」の部分を見ると、つなぎ目がズレてしまわないように反転させるなどして並べられているのが分かります。
カメラが(0,2500,0)の座標にいるので、「山」「川」「道」の画像ファイルの左下の位置から見ていることになります。



- HOME -

GHP(仮)