オブジェクトノードの表示

 サンプルを触ってみれば、ノードオブジェクトの表示方法までは理解できたと思います。 次は表示したノードを動かいたいですね。物理エンジンを使えば簡単そうですが、 まずは物理エンジンを使わない移動から試してみます。

 基本はset系命令を使用することになります。set系が理解できれば、add系は加算なので説明は特に不要だと思います。

SET系命令のサンプル

 アヒルの素材を使用します。hgimg4のsampleフォルダからresフォルダをフォルダごとコピーして、作業フォルダに置いて下さい。 サンプルスクリプトを作業フォルダに置いて実行します。


#include "hgimg4.as"

title "HGIMG4 set系"

	gpreset

	setcls CLSMODE_SOLID, $404040

	setcolor GPOBJ_LIGHT, 1,1,1		; ライトカラーを設定
	setdir GPOBJ_LIGHT, 0.5,0.5,0.5		; アンビエントカラーを設定

	gpload id_model,"res/duck"		; モデル読み込み

	mdx= 10 : mdz = 13				; X,Z方向の個数
	px = 20.0/mdx : pz = 20.0/mdz			; 間隔を計算する
	z  = -10.0					; 配置開始Z座標
	dim id_clone, mdx * mdz
	idx = 0
	i = -1
	repeat mdz
		x=-10.0					; 配置開始X座標
		repeat mdx
			if i<0 {
				i=id_model
			} else {
				gpclone i, id_model	; 最初のモデル以降はクローン
			}
			setpos i, x,0,z
			x+=px
			id_clone(idx) = i
			idx++
		loop
		z+=pz
	loop

	gpfloor id_floor, 40,40, $00ffff	; 床ノードを追加

	setpos GPOBJ_CAMERA, 0,30,20		; カメラ位置を設定


	; ==========================================================================
	;ノード回転を設定
	r  = 0.0
	ir = 0.0
	zm = 0.5
	d  = 0.0
	w  = 1
	repeat 10
		; ノード回転 ラジアン
		setang  id_clone(cnt   ),  r,  0,  0	; X軸回転
		setang  id_clone(cnt+10),  0,  r,  0	; Y軸回転
		setang  id_clone(cnt+20),  0,  0,  r	; Z軸回転
		r  += deg2rad(36)

		; ノード回転 0~255
		setangr id_clone(cnt+30), ir,  0,  0	; X軸回転
		setangr id_clone(cnt+40),  0, ir,  0	; Y軸回転
		setangr id_clone(cnt+50),  0,  0, ir	; Z軸回転
		ir += 25.5
		
		; ノード倍率
		setscale id_clone(cnt+60),  zm, 1.0, 1.0	; X軸
		setscale id_clone(cnt+70), 1.0,  zm, 1.0	; Y軸
		setscale id_clone(cnt+80), 1.0, 1.0,  zm	; Z軸
		zm *= 1.2

		; 移動ベクトル(自動移動)
		; 自動移動を行なう設定が別途必要です。
		setdir id_clone(cnt+90), d, 0, 0
		setobjmode id_clone(cnt+90), OBJ_MOVE, 0	;  自動移動を行なう(XYZ移動量を参照する)
		d += 0.01

		; ワーク値
		; ユーザーが自由に設定できる項目なので、表示には影響がない。
		setwork  id_clone(cnt+100), rnd(10), rnd(10), 0.1*rnd(10)
		setwork2 id_clone(cnt+110), rnd(10), rnd(10), 0.1*rnd(10)

		; ノードRGBカラー
		; テクスチャが貼ってあるので反映されません。
		setcolor id_clone(cnt+120),   r, 256.0, 255.0	; X軸回転

	loop
	; ==========================================================================


repeat
	stick key,15
	if key&128 : end

	redraw 0			; 描画開始

	;	カーソルキーでカメラ位置を動かす
	if key&1 : addpos GPOBJ_CAMERA, -1, 0, 0
	if key&4 : addpos GPOBJ_CAMERA,  1, 0, 0
	if key&8 : addpos GPOBJ_CAMERA,  0, 1, 0
	if key&2 : addpos GPOBJ_CAMERA,  0,-1, 0

	gplookat GPOBJ_CAMERA, 0,0.3,0		; カメラから指定した座標を見る

	addang id_model, 0, 0.02		; ノード回転(Y軸回転)
	gpdraw				; シーンの描画


	; ==========================================================================
	;	描画命令
	color
	boxf 0, 30, 500, 110
	boxf 0, 30, 70, 170
	color 200,200,200

	; ノードワーク値
	getwork id_clone(100),x,y,z
	pos 10, 30
	mes "ノードワーク値  " + x + ", " + y + ", " + z
	getwork2 id_clone(110),x,y,z
	mes "ノードワーク値2 " + x + ", " + y + ", " + z

	; ノードRGBカラーを取得
	getcolor  id_clone(120),x,y,z
	mes "ノードRGBカラー " + x + ", " + y + ", " + z
	getcolori id_clone(120),x,y,z
	mes "ノードRGBカラー " + x + ", " + y + ", " + z

	mes "↑y"
	mes "├→x"
	mes "↓z"
	; ==========================================================================


	color 255,255,255
	pos 8,8:mes "HGIMG4 sample"

	redraw 1			; 描画終了
	await 1000/60			; 待ち時間

loop

 実行すると、アヒルがたくさん並んで表示されます。13行×10匹。 1行ごとに同じ命令で、異なるパラメータを設定しています。各行の命令は次の通り。

  1. ノード回転 X軸回転(ラジアン)
  2. ノード回転 Y軸回転(ラジアン)
  3. ノード回転 Z軸回転(ラジアン)
  4. ノード回転 X軸回転(0~255)
  5. ノード回転 Y軸回転(0~255)
  6. ノード回転 Z軸回転(0~255)
  7. ノード倍率 X方向拡大
  8. ノード倍率 Y方向拡大
  9. ノード倍率 Z方向拡大
  10. 自動移動 X方向
  11. ワーク値
  12. ワーク値2
  13. ノードRGBカラー

 hgimg4の座標系は、右手系です。サンプルの画面で言えば、+Xが画面右手方向、+Yが上方向、+Zが画面手前側方向です。

 回転は、右ねじ方向。右手でサムズアップ、親指を軸の+方向に向けたとき、人差し指から小指が向いている方向が回転のプラス方向です。 上から6行までが回転なので見比べて確認してください。

 ノード倍率は、ノードを拡大するだけなので特に問題はなさそうですね。潰れているようにも見えますが、これは一つの方向にだけ拡大しています。

自動移動

 自動移動を設定すると、メインループ内で特に何もしなくてもフレーム毎に一定速度で移動してくれます。

 自動移動は、setdir命令でパラメータを設定しただけでは動きません。 setobjmode命令でOBJ_MOVE(自動移動を行なう(XYZ移動量を参照する))オプションを有効にする必要があります。
 HDLには、まだ説明が記載されていないので、詳細はプログラミングガイドを参照してください。 →オブジェクトのモード設定 - HGIMG4プログラミングガイド( https://www.onionsoft.net/hsp/v36/doclib/hgimg4.html#MODE_OBJ )

 移動速度を確認するサンプルも作ってみました。


#include "hgimg4.as"

title "HGIMG4 自動移動"

	gpreset

	setcls CLSMODE_SOLID, $404040

	setcolor GPOBJ_LIGHT, 1,1,1		; ライトカラーを設定
	setdir GPOBJ_LIGHT, 0.5,0.5,0.5		; アンビエントカラーを設定

	gpload id_model,"res/duck"		; モデル読み込み

	pz = 10.0					; 間隔
	z  = -5.0					; 配置開始Z座標
	gpclone id_clone, id_model	; クローン
	setpos  id_model, -10.0, 0, z
	setpos  id_clone, -10.0, 0, z+pz

	gpfloor id_floor, 40,40, $00ffff	; 床ノードを追加

	setpos GPOBJ_CAMERA, 0,20,20		; カメラ位置を設定


	; ==========================================================================
	; 移動ベクトル(自動移動)
	; 自動移動を行なう設定が別途必要です。
	setdir id_clone, 0.1, 0, 0
	setobjmode id_clone, OBJ_MOVE, 0	;  自動移動を行なう(XYZ移動量を参照する)
	; ==========================================================================

	; カメラを真上に設置
	setpos   GPOBJ_CAMERA, 0.0, 30.0, 0.1
	gplookat GPOBJ_CAMERA, 0.0,  0.0, 0.0
	x = -10.0

repeat
	stick key,15
	if key&128 : end

	redraw 0			; 描画開始

	; ==========================================================================
	; 手動で移動と自動移動を比較
	; 毎フレームごとに移動する速度と自動移動で設定した速度は同じ。
	x += 0.1
	setpos id_model, x, 0, 0
	; ==========================================================================
	
	gpdraw				; シーンの描画

	color 255,255,255
	pos 8,8:mes "HGIMG4 sample"

	redraw 1			; 描画終了
	await 1000/60			; 待ち時間
	;await 1000/60*2		; 待ち時間を変えても速度が変わらない
	;await 1000/60/2		; 待ち時間を変えても速度が変わらない

loop

 setdirで設定した数値分だけ、フレームごとに移動するようです。 自動移動を使わない場合は、この例のように毎フレームsetpos命令で動かす必要があります。

ワーク値

 ワーク値とワーク値2は、ユーザーが自由に使用できる領域です。X,Y,Z情報として使えば、ワーク値は2つあるので2点分の座標を格納できます。 また、6個の実数型変数と見なせば、アイテムボックスとして使ったりキャラクターのステータスを格納することにも使えます。

 6個もあるので直接使っても十分余裕があると思います。もし足りないようであれば、 別に用意した配列変数のインデックスとして使用すれば、無制限に情報を格納することができますね。

ノードRGBカラー

 サンプルとして使用しているオブジェクトノード(アヒル)には、テクスチャが貼り付けてあるので色を変えてもわかりませんね。 これはまたの機会に確認することにします。