HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
1105
zezenanahgimg4で3Dモデルのボーンを動かしたい9解決


zezenana

リンク

2020/11/5(Thu) 11:06:29|NO.91735

すみません、いろいろ調べて手詰まったので質問させてください。

hgimg4のプロ生ちゃんのサンプルソース(hsp36beta\sample\pronama3d)を調べていて
gpaddanim、gpactによるアニメーションではなく
3Dモデルの関節を動かしたい(ポーズモデルの作成)と思っていますが、
HSPのhgimg3や4では可能でしょうか?

動かすイメージとしては、GooglePlayにある「プロ生ちゃんポーズ」のようなイメージです。
https://play.google.com/store/apps/details?id=biz.flyingwhale.ProNamaPoseLT&hl=ja

単純にgpload、setang、addpos、addangだと、足元を起点に全体が
動くだけなので関節ごとにIDを取得するのだとイメージしているのですが、

ボーン名称は、プロ生ちゃんVer2(OldVer)のFBXデータを使って
Blenderでfbxインポートを行ってわかっているのですが
その名称からノード?ジョイント?のIDを生成するとかなのでしょうか?
IKのボーン名称も入っていましたが、角度によるFK操作をイメージしています。

HSPのhgimg3/4では実現可能でしょうか?それとも他の3Dモデルdllの導入等が必要なのでしょうか?
実現可能であれば、どのような命令でIDを取得しsetang等で動かせますか?

古い情報でEasy3DとRokeDeBone2というのも検索していて見つけましたが、質問とは別な趣旨のものと判断しています。

HSPでは未対応というのであればその情報がわかるだけでも助かります。

理解不足ですみませんがご教授のほどよろしくお願いします。



この記事に返信する


youdai

リンク

2020/11/5(Thu) 15:25:35|NO.91737

HGIMG3では標準で、Xファイルのモデルのノードの値の取得と設定が可能です。別途のdll等は必要ありません。
getxinfoが取得、setxinfoが設定を担っています。
ボーンに該当するノードを任意に取得、設定すればHGIMG3上でボーンを操作することができるかもしれません。
ボーンの操作ができない、もしくは操作できても思ったように頂点が動いてくれない場合でも、
頂点に該当するノードを直接変更すれば結果的に同様の効果が得られると思います。
ノードの構造はXファイルの中身によって異なるので自分で調べる必要があります。
ノードがHGIMG3上でどう再現・構成されているかは、前記したgetxinfoで調べられます。



zezenana

リンク

2020/11/6(Fri) 06:53:32|NO.91739

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ファイルについて詳しくないのですが、珠音のデータでは常にアニメーションをしているのが気になりますが、設定できないことと関係あるのでしょうか?



youdai

リンク

2020/11/6(Fri) 13:41:49|NO.91744

>HGIMG3のXファイルで可能とのことですが、HGIMG4の.gpbファイルではモデルのノード値を取得・設定する手段はありませんでしょうか?
HGIMG4については自分は研究中なので、分からない部分が多く無責任なアドバイスはできません。
ですが、現バージョンのHGIMG4でその機能に該当する命令はなかったように思います。
自分もモデルのノードを取得する方法があればいいなと思っています。
HGIMG4は発展途上のシステムだと思うので、開発者のおにたまさんにリクエストしてみるのもいいと思います。

>プロ生ちゃん.fbx形式データをXファイルにエクスポートすることがBlenderでできたようですが、Blenderの最新では出来ないようですので、できれば.grbファイルでの取得設定が出来ないかと考えています。
blender2.79なら、Xファイルの出力が可能です。
FBXやOBJでblender2.79にモデルを読み込むことで、Xファイルで出力することができます。
自分はblender2.90.1でモデルを作って、それを上記の方法でXファイルに出力するという方法を使っています。
結果的には2.90.1で出力したものと同じモデルが出力できます。

>Xファイルについて詳しくないのですが、珠音のデータでは常にアニメーションをしているのが気になりますが、設定できないことと関係あるのでしょうか?
HGIMG3ではアニメーションするXモデルを読み込むと、自動的及び強制的にアニメーションするようになっていたと思います。
停止している状態のXモデルが必要な場合、アニメーションが設定されていないXファイルが必要だったと思います。
アニメーションを追加する場合、最初にその停止している状態のXファイルを読み込んで、
そこからアニメーションしているモデルを追加していくといいと思います。
Xファイルのアニメーション関連の命令としてはアニメーションのスピードを設定するobjspeed、取得するgetanim命令があるようです。

それで、setxinfoで値を正しく設定できないことについてですが、自分は数日前に同様の質問を開発者のおにたまさんにしたのですが、まだ返答はありません。
もしかしたら自分と同じことが起きているのかもしれません。
詳しくは、その「hgimg3のgetxinfoとsetxinfoで扱う頂点座標の構造体の仕様について教えて下さい」のスレッドを読むと経緯が分かると思います。



zezenana

リンク

2020/11/6(Fri) 13:44:45|NO.91745

珠音サンプルの改造コードでsetxinfoを使って回転角度の設定が反映されない件について自己解決しました。

結局自分で懸念していた「常にアニメーションをしている・・」ことが原因でして、Xファイルがテキストファイルであることがわかったのでデータ解析しました。

Xファイルの「Anim・・・」で始まる範囲コードがアニメーション動作であることがわかったので検索し全て削除した所、アニメーションが停止し、キー入力で腕がドリルのように回転するようになりました。ノードIDを肩や手に変更した所、角度が追従するFKの動きもできました。

tamane_s.x の場合
AnimTicksPerSecond {}の範囲削除
AnimationSet {}の範囲削除
Animation {}の範囲削除
AnimationKey {}の範囲削除

ですので、現在の不明な点としては、HGIMG4の.gpbファイルでは3Dモデルのノード値を取得・設定する方法はあるのか?(出来れば指関節などボーンの多いプロ生ちゃん等のデータを動かしたい)と、HGIMG4では出来ないのであれば、.gpbファイルをXファイルにエクスポートすることが出来るか?です(Blenderの古いVerがあれば行けそうな気もします)

引き続き、情報をお持ちの方がいればご教授願います。



zezenana

リンク

2020/11/6(Fri) 13:49:17|NO.91746

コメント頂けていたことに気づかず投稿してしまいました。。読ませていただきます。



youdai

リンク

2020/11/6(Fri) 13:56:02|NO.91747

丁度いいので逆に質問したいのですが、いいでしょうか?
setxinfoで正しく値が設定できたとのことですが、
上記のレスの「hgimg3のgetxinfoとsetxinfoで扱う頂点座標の構造体の仕様について教えて下さい」の問題で自分はそこで躓いております。
自分はsetxinfoの頂点に関する部分にズレのバグがあると思っていたのですが、どうやって値を正しく設定できたのでしょうか?
回転は正常にできて、頂点だけはダメということなのでしょうか?



zezenana

リンク

2020/11/6(Fri) 16:38:46|NO.91751

youdaiさん、返答ありがとうございます。

私も調べた限り、HGIMG4に該当する命令が現時点でないので現在開発中(そういえばベータなことを忘れていた・・)ということでこれについてはクローズしたいと思います。将来的にサポートされることを期待して待とうと思います。

> blender2.79なら、Xファイルの出力が可能です。

これについても私がネットで調べた情報と一致します。が、私の持っているのは古くて2.83なので、なんとか2.79のアプリケーションを探してみたいと思います。XファイルのエクスポートBlender最新バージョンでも復活してほしいものです。

アニメーションについては、実はsetxinfoのヘルプに載っていたのをさっき知りました(スミマセン)。。これについては投稿したとおりXファイル直接書き換えのゴリ押しで解決しました。わざわざご説明ありがとうございます、

-----

それとyoudaiさんの逆質問について回答しますと、ノードIDの回転角度についてはアニメーションを外した所、設定ができています。期待していた通りのFK操作ができています。座標が飛ぶ問題についても解決しました(掲載した改造サンプルのままでは問題があるので動きません)

結局の所、getxinfoとsetxinfoヘルプファイルにある「ワールド座標」と「ローカル座標」は同一の意味なのか?を突き詰めまして、getxinfoの取得値とsetxinfoの設定値は別パラメーターであると判断して、角度や座標を個別管理にしたところ、動作するようになりました。

・setxinfoの設定値はすべて初期角度・座標XYZを0にした。
・getxinfoの取得値は角度や座標を見るだけとし設定値に反映させない。

ローカル座標とは3Dモデルの初期位置を0,0,0としたもので、
ワールド座標とは画面上(空間上)の位置を示していると考えました。

ただし、getxinfoにはクセがあり、必要なノードIDの情報だけを取得すると数値が更新されない問題?があるようで、全ノードIDを個別取得するとなぜか数値が更新されました。

以上、既に知っている範囲のことかもしれませんが、回答になってますでしょうか?



youdai

リンク

2020/11/6(Fri) 16:47:04|NO.91752

返信ありがとうございます。
助かります。成功例があるのとないのとでは雲泥の差ですから。

blender2.79は、こちらのblenderの公式サイトのrelaseにあります。
https://download.blender.org/release/Blender2.79/



zezenana

リンク

2020/11/7(Sat) 12:45:08|NO.91761

お役に立てたのなら良かったです。
こちらもhgimg3やhgimg4の情報が少ない所、情報頂けたので助かりました。

既に知っているかもしれませんが、getxinfoやhgimg3について掲示板を調べていて暇人さんという方がhgimg3のことについて書き込まれていたものがあります。

> hgimg3で使えるx形式データを作ったりテキストデータからテクスチャ画像を一つのバッファに並べて一枚のテクスチャにするモジュール
http://hsp.tv/play/pforum.php?mode=pastwch&num=75192

こちらに載っているコードの中に「画像を一枚のテクスチャに纏めたり簡単なX形式のモデルデータを作るモジュール - mod_addxfiletex.hsp」というのがあり、getxinfoの頂点座標について取り扱っていたと思います。
構造体がどうとかはわかりませんが、データ構造の解析に役に立つでしょうか?

Blender2.79のダウンロード先教えていただき、ありがとうございます!

早速、Blender2.79でプロ生ちゃんをXファイルにエクスポートして10MBほどのデータが出来ました。しかし、getxinfoで取得するノード情報一覧のバッファが壊れて最初しか取得されないので、情報が膨大な3Dモデルは無理なのかもしれません。なので軽めのプロ生ちゃんに代わる3Dモデルを探すことにしました。

質問したことについては全て解決したのでクローズします。



ONION software Copyright 1997-2023(c) All rights reserved.