youdaiさん、返答ありがとうございます。
HGIMG3のXファイルで可能とのことですが、HGIMG4の.gpbファイルではモデルのノード値を取得・設定する手段はありませんでしょうか?
プロ生ちゃん.fbx形式データをXファイルにエクスポートすることがBlenderでできたようですが、Blenderの最新では出来ないようですので、できれば.grbファイルでの取得設定が出来ないかと考えています。
getxinfo、setxinfoで実現できるかも・・とのことでしたので、Xファイル形式の珠音サンプルを使って、ボーン取得設定するように改良して調査しました。
#include "hgimg3.as"
#enum AX_X = 0
#enum AX_Y
#enum AX_Z
#enum AX_MAX
// ソース元:hsp36beta\sample\hgimg3\tamane1.hsp
// 使用:fontchr.bmp tamane_r.x tamane_s.x tamane_w.x body.tga head.tga
screen 0,800,600,0
cls 4
hgini
; テクスチャフォント表示の準備
setfont 16,16,12,1 ; font Tex select(cx,cy,px,mode)
texload "fontchr.bmp" ; フォントテクスチャの登録
;
clscolor $80
; Xモデル登録
xmodel = "tamane_w.x" ; _r走る _s立つ _w歩く
addxfile m_girl,xmodel
; オブジェクト登録
regobj obj, m_girl
setscale obj,0.05,0.05,0.05
; カメラ
setpos HGOBJ_CAMERA, 0,-10,30 ; カメラ位置の設定
; ライト
setdir HGOBJ_LIGHT,100,100,100
setang HGOBJ_LIGHT, 9.8, 4, 0
; ノードIDの情報取得
gosub *getNodeInfo
ndID_R = getNodeID("ude_R_") ; ID取得
ndID_L = getNodeID("ude_L_") ; ID取得
if (ndID_R < 0 | ndID_L < 0) : dialog "getNodeID Error", 1 : end
onexit goto *owari
*main
stick key,$3ff
hgdraw
fprt "HGIMG3 Test kai(ESC=Quit SPC=Rot Cursor=Ang +Ctrl=Pos)",8,8
getIDPos(ndID_R) ; ワールド座標取得
getIDPos(ndID_L) ; ワールド座標取得
getIDAng(ndID_R) ; 回転角度取得
getIDAng(ndID_L) ; 回転角度取得
x = ndPos(ndID_R,AX_X) : y = ndPos(ndID_R,AX_Y) : z = ndPos(ndID_R,AX_Z)
sInfo = strf("R Pos(%2d) X:%7.2f Y:%7.2f Z:%7.2f",ndID_R,x,y,z)
fprt sInfo, 8, 24
x = ndAng(ndID_R,AX_X) : y = ndAng(ndID_R,AX_Y) : z = ndAng(ndID_R,AX_Z)
sInfo = strf("R Ang(%2d) X:%7.2f Y:%7.2f Z:%7.2f",ndID_R,x,y,z)
fprt sInfo, 8, 40
x = ndPos(ndID_L,AX_X) : y = ndPos(ndID_L,AX_Y) : z = ndPos(ndID_L,AX_Z)
sInfo = strf("L Pos(%2d) X:%7.2f Y:%7.2f Z:%7.2f",ndID_L,x,y,z)
fprt sInfo, 8, 56
x = ndAng(ndID_L,AX_X) : y = ndAng(ndID_L,AX_Y) : z = ndAng(ndID_L,AX_Z)
sInfo = strf("L Ang(%2d) X:%7.2f Y:%7.2f Z:%7.2f",ndID_L,x,y,z)
fprt sInfo, 8, 72
hgsync 16
if key&128 : goto *owari
if (key&16) : addang obj, 0, 0.05
if ((key&64) == 0) {
if (key&2) : ndAng(ndID_R,AX_Z) -= 0.5 : ndAng(ndID_L,AX_Z) -= 0.5
if (key&8) : ndAng(ndID_R,AX_Z) += 0.5 : ndAng(ndID_L,AX_Z) += 0.5
if (key&4) : ndAng(ndID_R,AX_Y) += 0.5 : ndAng(ndID_L,AX_Y) += 0.5
if (key&1) : ndAng(ndID_R,AX_Y) -= 0.5 : ndAng(ndID_L,AX_Y) -= 0.5
setIDAng(ndID_R) ; 回転角度設定
setIDAng(ndID_L) ; 回転角度設定
} else {
if (key&2) : ndPos(ndID_R,AX_Y) += 0.5 : ndPos(ndID_L,AX_Y) += 0.5
if (key&8) : ndPos(ndID_R,AX_Y) -= 0.5 : ndPos(ndID_L,AX_Y) -= 0.5
if (key&4) : ndPos(ndID_R,AX_X) += 0.5 : ndPos(ndID_L,AX_X) -= 0.5
if (key&1) : ndPos(ndID_R,AX_X) -= 0.5 : ndPos(ndID_L,AX_X) += 0.5
setIDPos(ndID_R) ; ローカル座標設定
setIDPos(ndID_L) ; ローカル座標設定
}
goto *main
*owari
getAllNodePosSv("E")
getAllNodeAngSv("E")
hgbye
end
; ノードIDの情報取得
*getNodeInfo
; ノードIDの最大数の取得
getxinfo info, obj, -1
fn = strf("%s_nodeID.txt", getpath(xmodel, 1))
exist fn : if (strsize < 0) : bsave fn, info
p = 0 : ndMax = 0
repeat
getstr dummy, info, p, '\n'
if (strsize == 0) : break
p += strsize : ndMax ++
loop
; 減算しないとgetxinfoのMaxID指定で強制終了する
ndMax --
; ノード名の取得
sdim ndName, 1, ndMax
p = 0
repeat ndMax
getstr ndName(cnt), info, p, '\n'
p += strsize + 1
loop
ddim ndPos, ndMax,AX_MAX
getAllNodePosSv("S")
ddim ndAng, ndMax,AX_MAX
getAllNodeAngSv("S")
return
; ノードのX,Y,Zワールド座標の取得と保存
#deffunc getAllNodePosSv str _ext_
svBuff = ""
repeat ndMax
getIDPos(cnt) : n = ndName(cnt)
x = ndPos(cnt,AX_X) : y = ndPos(cnt,AX_Y) : z = ndPos(cnt,AX_Z)
svBuff += strf("(%2d)%-10s:%7.2f:%7.2f:%7.2f\n",cnt,n,x,y,z)
loop
fn = strf("%s_Pos%s.txt",getpath(xmodel,1),_ext_)
bsave fn, svBuff, strlen(svBuff)
return
; ノードのX,Y,Z回転角度の取得と保存
#deffunc getAllNodeAngSv str _ext_
svBuff = ""
repeat ndMax
getIDAng(cnt) : n = ndName(cnt)
x = ndAng(cnt,AX_X) : y = ndAng(cnt,AX_Y) : z = ndAng(cnt,AX_Z)
svBuff += strf("(%2d)%-10s:%7.2f:%7.2f:%7.2f\n",cnt,n,x,y,z)
loop
fn = strf("%s_Ang%s.txt",getpath(xmodel,1),_ext_)
bsave fn, svBuff, strlen(svBuff)
return
; ノードID名称よりノードIDを取得
#defcfunc getNodeID str _name_
ret = -1
repeat ndMax
if (ndName(cnt) == _name_) : ret = cnt : break
loop
return ret
; ノードIDよりワールド座標を取得
#deffunc getIDPos int _id_
getxinfo info, obj, cnt, 1
p = 0
getstr sPosX, info, p, ',' : p += strsize
getstr sPosY, info, p, ',' : p += strsize
getstr sPosZ, info, p
ndPos(cnt,AX_X) = double(sPosX) : ndPos(cnt,AX_Y) = double(sPosY)
ndPos(cnt,AX_Z) = double(sPosZ)
return
; ノードIDよりローカル座標を設定
#deffunc setIDPos int _id_
x = ndPos(_id_,AX_X) : y = ndPos(_id_,AX_Y) : z = ndPos(_id_,AX_Z)
setxinfo obj, _id_, 1, x, y ,z
return
; ノードIDより回転角度を取得
#deffunc getIDAng int _id_
getxinfo info, obj, cnt, 2
p = 0
getstr sAngX, info, p, ',' : p += strsize
getstr sAngY, info, p, ',' : p += strsize
getstr sAngZ, info, p
ndAng(cnt,AX_X) = double(sAngX) : ndAng(cnt,AX_Y) = double(sAngY)
ndAng(cnt,AX_Z) = double(sAngZ)
return
; ノードIDより回転角度を設定
#deffunc setIDAng int _id_
x = ndAng(_id_,AX_X) : y = ndAng(_id_,AX_Y) : z = ndAng(_id_,AX_Z)
setxinfo obj, _id_, 2, x, y ,z
return
getxinfoとsetxinfoを使ってキーボードで両腕の角度を変える処理を作ったつもりですが、getxinfoにてノード値の取得は出来ているようですが、回転角度のノード設定の変化が反映されないようです。
両腕の座標も確認しましたが、取得値からだいぶ離れる結果となり、腕が離れた座標に飛ばされます。。ただ動かすことは出来るのでノードIDはあっているようです。
Xファイルについて詳しくないのですが、珠音のデータでは常にアニメーションをしているのが気になりますが、設定できないことと関係あるのでしょうか?