準備

 HSP3付属のHGIMG4では、SET系命令を使えば各オブジェクトノード毎に持っているパラメータを変更できる。 というところまでは前回まででご理解いただけていると思います。 各オブジェクトノード毎に持っているパラメータにアクセスする方法は、SET系命令を使う方法以外にもMOC情報という方法が用意されています。 今回は、このMOC情報を使ってみようと思います。

 使用方法はこちらの章の最後の方に記載されています。
実数ベクトルサポート命令 - HGIMG4プログラミングガイド ( https://www.onionsoft.net/hsp/v36/doclib/hgimg4.html#VECTOR )

サンプル

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

 MOC情報を使う方法はまず、sel~命令でノードとアクセスしたいパラメータの種類を選択します。 次にobj~fv命令でパラメータにアクセスします。値の受け渡しは、fv値を使用します。

 set系だと1行で済むところを2行で書かなければいけないので少し面倒ですね。 そのためかサンプルが付属していません。無いので仕方なく書いてみました。


#include "hgimg4.as"

title "HGIMG4 MOC情報"

	gpreset

	setcls CLSMODE_SOLID, $404040
	;setreq SYSREQ_LOGWRITE,1		; 終了時にログを出力

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

	gpload id_model,"res/duck"		; モデル読み込み
	setang id_mode, 0, 3.141592		; モデルの回転を設定

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

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

repeat
	stick key,15
	if key&128 : end

	redraw 0			; 描画開始

	; 移動座標
	selpos id_model
	objgetfv fv
	fv2str fv
	mes "selpos   : " + refstr

	; 回転角度
;	selang id_model
;	objgetfv fv
;	fv2str fv
;	mes "selang : " + refstr

	; スケール
	selscale id_model
	objgetfv fv
	fv2str fv
	mes "selscale : " + refstr
	fvmul fv, 1.001, 1.001, 1.001	; 少しずつ拡大
	objsetfv fv

	; 移動量
	seldir id_model
	objgetfv fv
	fv2str fv
	mes "seldir   : " + refstr

	; R,G,Bカラー(Color)
	selcolor id_model
	objgetfv fv
	fv2str fv
	mes "selcolor : " + refstr

	; ワーク値
	selwork id_model
	objgetfv fv
	fv2str fv
	mes "selwork  : " + refstr

	; ワーク値2
	selwork2 id_model
	objgetfv fv
	fv2str fv
	mes "selwork2 : " + refstr
	
	gplookat GPOBJ_CAMERA, 0,0.3,0		; カメラから指定した座標を見る

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

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

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

loop

 実行すると回転するアヒルが表示されます。放置するとアヒルは徐々に巨大化します。

解説

 MOC情報で現在のパラメータを取得して左上に表示しています。 パラメータの変更例としてスケール値を変更しています。


	; スケール
	selscale id_model
	objgetfv fv
	fv2str fv
	mes "selscale : " + refstr
	fvmul fv, 1.001, 1.001, 1.001	; 少しずつ拡大
	objsetfv fv

 現在の大きさをフレームごとに1.001倍だけ拡大しています。 fvmul命令で、現在値(fv)に1.001を掛け算しています。 その結果(fv)をobjsetfv命令を使用してノードに設定し直しています。

 selangをコメントにしているのは、現在のバージョン(HSP3.7β1)ではselangに不具合があり動作していないためです。

MOC情報の運用をどうするか

 MOC情報は、setpossetangsetscalesetdirsetworksetwork2 命令がまだ実装されていなかった HSP2.61の時代から使われている命令です。 MOC情報を使ったアクセス方法は、実数が使用できない当時の環境(HSP2)では必要な機能でした。 (setcolor命令は、当時存在していましたが今とは違う機能のようですね。)

 しかし現在(HSP3以降)では実数が標準で使用でき、set系命令が登場したためsel系命令を使用したMOC情報へのアクセスは必ずしも必要な機能ではなくなっています。 記述がシンプルなFV値が使用できるメリットはありますが、アクセスする際に2行書く必要があるというデメリットもあります。

 hgimg3で開発した過去作品をhgimg4へ移植しやすくするために残されている機能と考えていいと思います。 それでももしメリットを活かしたいなら、fv値をset系命令のような記述で使えるようにマクロを書くとかすると便利かもしれません。 fv値は、「実数ベクトルサポート命令」が強力なのでそこは魅力的なんですよね。