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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0131
アキアキノヒロロ固定フレームレートごとのアニメーション更新は?16解決


アキアキノヒロロ

リンク

2019/1/31(Thu) 12:13:24|NO.86444

; resフォルダ内にあるアニメーションを持ったモデル(ここでは例えば = sample.gpbファイル)を読み込む。
gpload id_model,"res/sample"

; 自動的にデフォルト設定として、アニメーション全体が無名(指定なし)の" "クリップとして設定される
; ことになるらしい。
( gpaddanim id_model, " ", , )

; また、次の命令で、アニメーションクリップ名(全体名) = "_idle" が得られるので、
; 自動的にデフォルト設定として、無名(指定なし)の" "クリップは、"_idle"と名付けられていることになる。
gpgetanim CLIP_NAME, id_model, , 16

; 全体(指定なし)の再生の長さ(ミリ秒単位)も、次の命令で得られるはず。
gpgetanim DURATION, id_model, , 2

; 上で取得した [DURATION] を [sample]ファイルの [FRAMES](「Blender」等での作成時のフレーム数) で割って
; [固定フレームレート] ( FIXEDFRAME_ms = 1フレームあたりの長さ(ミリ秒単位)) を求める。
FIXEDFRAME_ms = DURATION / FRAMES

; 以上のことから、
; [固定フレームレート]( = FIXEDFRAME_ms) ごとに アニメーションの更新をする命令は、次のようになるはず。
setreq SYSREQ_FIXEDFRAME, FIXEDFRAME_ms

 ところが、この命令をどう組み込んだら、固定フレームレートごとのアニメーション更新になるのか、さっぱり
分かりません。どなたか、その方法をお教え願えないでしょうか。


 なお、初期設定のままの「Blender」で作成したモデルの場合の [FIXEDFRAME_ms] を、上の式で求めたところ、
[41] になり、これは、「Blender」の初期設定=「秒間24フレーム」に一致しています。
24フレーム = 1秒
24フレーム = 1000ミリ秒
1フレーム = 1000/24ミリ秒
1フレーム = 41.6666ミリ秒
1フレーム ≒ 41ミリ秒



この記事に返信する


アキアキノヒロロ

リンク

2019/1/31(Thu) 12:59:59|NO.86445

 前のものと直接は関係しませんが、ブレンド係数、再生スピードの更新についても、疑問があります。
あるクリップのブレンド係数、再生スピードを変更再生したあと、別のクリップに切り替えて再生し、
再び元のクリップに切り替えると、ブレンド係数は、100 に初期化される一方、再生スピードの方は、
変更時のままです。この違いはどういうことなのでしょうか?



通りすがり

リンク

2019/2/7(Thu) 23:01:51|NO.86486

gpresetの前に置いても後ろに置いても効果は出ます。

setreq SYSREQ_FIXEDFRAME, FIXEDFRAME_msのFIXEDFRAME_msの値をいじって 
動かしてみると効果がわかるはずです



アキアキノヒロロ

リンク

2019/2/9(Sat) 07:33:34|NO.86509

 通りすがりさん、こちらにもご返答、ありがとうございます。気付かずにいて
すいませんでした。
(新着が急激に増えていて、自分のスレがずっと下がっていたので....言い訳です)

「setreq SYSREQ_FIXEDFRAME, FIXEDFRAME_ms」の件、確認しました。

 自分は、「Blender」の時の設定フレームレートの値を「FIXEDFRAME_ms」に入れて、
この命令を組み込めば、「gpaddanim」でクリップを設定する時、ミリ秒単位ではなく、
「Blender」の時のフレーム単位で出来るようになるもの、と思っていました。
「FIXEDFRAME_ms」は、初期値が「100」ようですね。「100」にすると、この命令を
組み込まない時と同じ結果になるようです。

 それと、色々と厚かましいようで、恐縮ですが、
 [ gpact ] 命令の複数のアニメーションクリップの同時再生とは?
の方にも、ご返答頂けるとありがたいです。お願いします。



通りすがり

リンク

2019/2/9(Sat) 21:33:21|NO.86528

使っているHGIMG4が違うかも。マニュアル不備の可能性もありますが

HGIMG4のランタイムリファレンス によると

・HSP3.5β5版との違い

HSP3.5β6版で追加変更された項目の概要は以下の通りです


・アニメーション更新を固定フレームレートに対応

3Dモデルのアニメーション再生時に、経過時間をベースにしていましたが
フレームの更新と同期した細かい制御が難しかったため、フレームレートに
応じたアニメーションの更新を行なうモードを追加しました。
setreq命令によりSYSREQ_FIXEDFRAMEパラメーターを設定することで、
固定フレームレートによるアニメーション更新となります。

例:
setreq SYSREQ_FIXEDFRAME,12 ; 12msごとにアニメーション更新

上の例では、12msごとにアニメーションが更新されます。
経過時間ベースの更新にする場合は、-1を設定してください。
デフォルトの挙動は、経過時間ベースに設定されています。

となっているので 初期値は-1になっているはず。


[ gpact ] 命令の複数のアニメーションクリップの同時再生とは?

 アニメブレンド(モーションブレンド)で解決しているのでは?

[hgimg4]の3Dモデルアニメーションクリップ操作

 こちらは「好きなように作ればいい」としか
     



アキアキノヒロロ

リンク

2019/2/9(Sat) 23:42:24|NO.86530

「初期値 = -1」確認しました。しかし、自分のプログラムでは、何故か「100」でも「-1」
と同様になります。「HSP」は、3.5β6かどうかは分かりませんが、最新の3.5安定版でも、
3.51pの方でも同じでした。
 もしかして、プログラムの仕方の違いではないかと思い、「takeshima」さんの
「tamane2clip2.hsp」で試してみると、確かに「FIXEDFRAME_ms」ごとのアニメーション
更新になっているようです。しかし、自分がテスト用にプログラムしたものでは「-1」か
「100」で、もとの動き、「100」以上で速くなっていきます。
失礼とは思いつつ、通りすがりさんのスクリプトでもやってみると、ふたつあるスクリプト
のどちらに組み込んでも、全く変化がありません。ご確認願います。
 で、「takeshima」さんのものとじっとにらめっこしていますが、なぜ三者三様になるのか
余計に分からなくなってしまいました。もっともっと「tamane2clip2.hsp」の理解に努めない
といけないようです。

 [ gpact ] 命令の複数のアニメーションクリップの同時再生とは?
の方ですが、このスレの題目と直接関係ないことを、ついでと言っては悪いですが、また
あらたに付け足してしまいました。2019/2/8(NO.86492)
 そちらを読んでいただけるとありがたいですが、
「takeshima」さんは、どうやって「HSP」の3Dデータ「high_school_girlSD.fbx」を
「blender」に取り込めたのか? という疑問についてです。自分は、どうやっても
うまく取り込めなかったので。

 色々と、お手数をお掛けします。



通りすがり

リンク

2019/2/10(Sun) 07:14:25|NO.86533

 現状のHGIMG4が敬遠されている理由は その辺にあるんですが(β版ですから当然)


 どうやって「HSP」の3Dデータ「high_school_girlSD.fbx」を
「blender」に取り込めたのか? という疑問についてです。自分は、どうやっても
うまく取り込めなかったので。

 これは面倒ですが新しいスレッドを作って質問してください。

ちなみに

「takeshima」さんは、どうやって「HSP」の3Dデータ「high_school_girlSD.fbx」を
「blender」に取り込めたのか?

 blenderで取り込んだのではなく Metasequoiaからgpbに変換するツールを作っている
ところ見ると たぶんMetasequoiaで取り込んでいるのではないでしょうか。



アキアキノヒロロ

リンク

2019/2/10(Sun) 08:57:13|NO.86534

 早速のご返事ありがとうございます。
最初にご紹介いただいた、「YouTube」の動画ですが、同じ方の「blender 20170419 tamane idol」
というのは、どう見ても「Metasequoia」ではなく「blender」ですが。

https://www.youtube.com/watch?v=w6y75Pl4xzg
https://www.youtube.com/channel/UCQhs8dsM5GIotfhJeWIjXqw/videos?shelf_id=0&view=0&sort=dd

お勧めに従って、新しいスレッドを作って質問させて頂くことにします。
同一スレッドに別の質問を持ちこんだ、こちらの落ち度です。不愉快な思いを抱かせてしまい、
申し訳ありませんでした。



通りすがり

リンク

2019/2/10(Sun) 11:54:14|NO.86535

hgimg4_animation_xxの原因は

288行目 await 100 ではなくawait 1000/60

ちなみに
「takeshima」さんと「blender 20170419 tamane idol」作者さんは別人



アキアキノヒロロ

リンク

2019/2/10(Sun) 17:22:17|NO.86538

「await」を「100」にしているのは、「title」や「mes」での表示のタイミングを決めるのに
やりやすかったと言うだけのためです。
 実際、「await」を「1」にしても「10」や「100」にしても「1000/60」にしても、「title」や
「mes」での表示のタイミングや時間は変わりますが、モデルの動きの速さは変わらないです。
「await」で生じるプログラム内に流れる時間とは別に、PCのシステムから計った時間でもって
アニメーションは、更新されるのでは。この言い方があっているかよくわかりませんが、この言い方
で言えば、PCのシステムから計った時間を
setreq SYSREQ_FIXEDFRAME, FIXEDFRAME_ms
で、FIXEDFRAME_ms単位のものに変換して、アニメーション更新に使うということになると思います。
「-1」が初期値になるとは、PCのシステム側からの時間に手を加えないということなのでしょう。
でも、「await」を「100」にすれば、「FIXEDFRAME_ms」は「-1」または「100」で初期の状態になり、
「1000」にすれば、「-1」または「1000」、「1000/60」にすれば、「-1」または「1000/60」が初期
の状態になります。通りすがりさんのスクリプトでは、「FIXEDFRAME_ms」は、何が入っても初期状態
です。頭がこんがらがってきて、この意味がよくわかりません。

「YouTube」は別人ですか。「takeshima」さんは、動画は「YouTube」でなく、「ニコ動」ですしね。
自分は、「HSP物置- JPN takeshima」と「動画置き場」が勝手に結び付いてしまってました。
「YouTube」については、全く知識がないものですから。
 ただ、「NO.86492」の終りのほうにも書きましたが、「fbx」ファイルを「FBXConverter」で変換
すれば、「blender」インポート可能です。
以下は、別スレッド「「high_school_girlSD.fbx」を「blender」に取り込むのは?」に移ります。



通りすがり

リンク

2019/2/10(Sun) 20:22:21|NO.86540

tamane2clip2.hspのスクリプトは正常なら、違うところを見つければいいだけです。

スクリプトを見た時点でわかるのは、

・メインループ内で gosubを使ってない。
・メインループ(goto *main)が repeat loop

この2つあたりが 正しく動いていないスクリプトとの違いなので tamane2clip2.hspの
上の2か所を 書き換え 正しく動かなくなったら そこが問題なはず。

それでも ダメならどうしようもないので 次のバージョンアップを待ちましょう。



アキアキノヒロロ

リンク

2019/2/11(Mon) 09:16:49|NO.86547

setreq SYSREQ_FIXEDFRAME, FIXEDFRAME_ms(ミリ秒単位)

上の命令が [固定フレームレート]ごとのアニメーション更新をするというのは、
次のような理解の仕方になるのでは。 と、ふと思いました。

もし、描画命令のセット
redraw 0 ; 描画開始
gpdraw ; シーンの描画

redraw 1 ; 描画終了
await 〇〇 ; 待ち時間(ミリ秒単位)
を組み込んだ「loop」の待ち時間、すなわち、上の「await」の「〇〇(ミリ秒単位)」を
「FIXEDFRAME_ms(ミリ秒単位)」にすれば、「loop」の中での 描画を「loop_cnt」に
連動させることで、一回の「loop」単位で、すなわち、FIXEDFRAME_ms(ミリ秒単位の
[固定フレームレート])で、描画(=アニメーション)を更新できる、
ということなのでは。
 こう考えれば、「await」の待ち時間を「FIXEDFRAME_ms」に入れれば、初期の動きに
なる訳が分かります。冒険のつもりで、逆も真なりをやってみました。
「FIXEDFRAME_ms」に「-1」を入れるか、あるいはこの命令を組み込まずに
await -1
エラーになると思いきや、変わらない動きです。どうもこの考えでいいみたいです。

この方法で少し試してみます。



アキアキノヒロロ

リンク

2019/2/11(Mon) 09:28:32|NO.86548

でも、そうすると
「hgimg4」での「await」って、設定の意味、分らなくなってくる。



通りすがり

リンク

2019/2/11(Mon) 22:02:29|NO.86554

HSP拡張ランタイムリファレンスをよく読んでください。(doclibフォルダ内にあります。)

await 画面書き換え待ち時間 
await -1にしたらマシンパワー全開ループしますからフリーズの元です。
この値はソフト全体の速度を変える時以外いじらない。

 setreq SYSREQ_FIXEDFRAME,p1 1フレームに p1アニメカウントを進ませる
この命令を使用しないと 1フレームに進むアニメカウントが不安定だったので それを固定させる命令

 これを見れば意味が分かるかもしれない
 ttps://aniduku.com/2016/08/29/frame/
 


hgimg4のリファレンスのコピペ
・初期化と描画の方法

初期化を以下の手順に従って行なって下さい。

gpreset ; hgimgの初期化

gpreset命令は、システム全初期化を行なう命令です。
初期化はいつでも、何度でも行なうことが可能です。

初期化が終わったら、いつでも登録されているオブジェクトを表示可能な
状態になります。
HGIMG4では、描画を以下のようなループで行ないます。

;------------------------------------------------------------------
*main
; 描画メイン
;
redraw 0 ; 描画開始(画面クリア)

;
; 各種描画を行なう
;

redraw 1 ; 描画終了
await 1000/60 ; 時間待ち(60フレーム/秒)
goto *main
;------------------------------------------------------------------

画面の書き換えに関するソースは、redraw 0で描画開始を知らせて、
redraw 1により描画終了タイミングを知らせるようにしてください。
通常のHSP3とは違い、「redraw 0」を指定することにより、スクリーンが
一旦クリアされます。

描画を開始してから、box、mes等の描画命令を自由に記述することができます。
その後、await命令で時間待ち(ウェイト)をします。「await 10」の場合は、
最低でも10msだけの待ち時間を入れます。


・アニメーション更新を固定フレームレートに対応

3Dモデルのアニメーション再生時に、経過時間をベースにしていましたが
フレームの更新と同期した細かい制御が難しかったため、フレームレートに
応じたアニメーションの更新を行なうモードを追加しました。
setreq命令によりSYSREQ_FIXEDFRAMEパラメーターを設定することで、
固定フレームレートによるアニメーション更新となります。

例:
setreq SYSREQ_FIXEDFRAME,12 ; 12msごとにアニメーション更新

上の例では、12msごとにアニメーションが更新されます。
経過時間ベースの更新にする場合は、-1を設定してください。
デフォルトの挙動は、経過時間ベースに設定されています。





  



アキアキノヒロロ

リンク

2019/2/12(Tue) 09:18:14|NO.86555

 通りすがりさん、ありがとうございます。私のような初心者レベルの者を相手にしてくださって
本当に感謝しています。このご解答、ご指摘、頭にガツンと一撃、でした。しっかり、勉強し直します。

 もう一つ、謝らないといけないことを白状します。通りすがりさんのスクリプト、時間をかけて見直し
ました。「setreq SYSREQ_FIXEDFRAME, FIXEDFRAME_ms」を組み込んだもの、しっかり機能していました。
自分のミスです。謝ります。値や位置を変えたりしていた時の不注意でした。すいません。

 感謝と謝罪を踏まえてのことですが、「await」と「FIXEDFRAME」の関係、いまだにしっくりとは
わかりません。
 「await」は、PCへの命令をミリ秒単位で一時的に止めること、この理解でいます。
なので、その時だけ、わずかな停止をしようとする時は「await」に小さな数字を置きます。キー入力
のタイミングをとる待ちをさせたい時などです。「loop」の中で「loop」そのものに使う「await」に、
そのような小さな数字を置けば、わずかな時間間隔で、「loop」内の命令を繰り返す。なので、負荷の
大きな「hgimg4」の描画処理をするための「loop」内では、「loop」そのものに使う「await」にその
ような小さな数字を置けば、PCへ無理をさせかねないから、ダメ。そういう理解でやってきました。
今回、「await」に「-1」を入れたのは、そのことを承知で、実験としてやってみたのです。
実際のプログラムを作る時、そうしようとは全く考えていません。
あと、これとは直接関係ないことですが、「await 0」とは、一時停止時間=0、「await -1」とは
どう違い、どういう関係なのか、なんていう疑問が湧いたりしました。

 数学は、中学レベルも怪しい頭の、今の自分の有様です。この現状で、今までの、通りすがりさんの
ご返事を可能な限り理解しようと努力しています。紹介していただいたサイト、よくわかります。
「blender」の仕組みを調べていた時にも、似たような説明を目にしました。で、「blender」の
初期設定が「秒間24フレーム」とは、1秒間(1000ミリ秒間)に24フレームが収められる設定なのだ、と。

また、「HGIMG4 REFERENCE MANUAL」も、もう一度見直すと、「フレームレートの取得」の項に

;------------------------------------------------------------------
getreq命令により、描画時のフレームレートを取得することができます。

getreq fps,SYSREQ_FPS

上の例では、変数fpsにフレームレート(1秒間に画面が描画された回数)を代入します。
フレームレートは、基本的に描画ループ(redraw 0〜redraw 1の繰り返し)で指定される
await命令の待ち時間で決定されます。
フレームレートを一定に保ち、画面のちらつき(ティアリング)を防止するために、
VSYNC待ち(垂直同期待ち)を指定することができます。

setreq SYSREQ_VSYNC,1
gpreset

上のように、gpresetの前でsetreq命令によりVSYNC待ちを有効にしてください。
これにより、通常は秒間60フレームごとの動作となります。
(その場合でも、await命令は入れるようにしてください)
;------------------------------------------------------------------

迂闊にも、初めて気付いた項目なので、理解しきれていませんが、これで見ると、基本的に
「await命令の待ち時間」=「フレームレート」
と考えていいのかな。
「通常は秒間60フレームごとの動作となります。」
というのは、
通常は「await 1000/60」としているから、それに合わせている、ということなのかな、と。
通常「await 1000/60」とする意味ですが、自分は次のような適当な理解ですませています。
一分は60秒だし、一時間は60分だから、「loop」命令に使う「await」は、一分以上、ときには
一時間以上繰り返される可能性もあるから、分や時に合わせた方がいいんだ、と。
だから、そこまで気にしないなら、無理のない程度に「await 100」にしてもいいや、と。
実際、「await 1000/60 (≒16)」より「await 100」の方が負荷は小さくなるんだから、と。
こんな程度の理解でやっている自分です。

それで、通りすがりさんの

 setreq SYSREQ_FIXEDFRAME,p1 1フレームに p1アニメカウントを進ませる

という「p1アニメカウントを進ませる」とは、「1フレーム進ませるために p1ミリ秒 await」
させる、という理解でいいでしょうか。


 どうも、こういう説明は苦手で、回りくどいものになってしまいました。
 通りすがりさん、すいません。



通りすがり

リンク

2019/2/12(Tue) 23:45:07|NO.86563

awaitの理解で心配なら 過去ログ
http://hsp.tv/play/pforum.php?mode=pastwch&num=51067


getreq fps,SYSREQ_FPSは 
 setreq SYSREQ_FIXEDFRAME, FIXEDFRAME_msと一緒に使うとfpsに0を返すだけなので
注意してください。 


フレームレートは 検索すれば 1番上に説明があります。わからない単語は検索です。

コピペ
 フレームレートは、動画において、単位時間あたりに処理させるフレーム数(静止画像数、コマ数)
である。 通常、1秒あたりの数値で表し、fps(英: frames per second=フレーム毎秒)という単位で表す
映像に対するサンプリング周波数とも言え、単位にヘルツが使われる場合もある。


「1フレーム進ませるために p1ミリ秒 await」
 awaitはいりません。
1フレーム進ませるための「 p1ミリ秒 」を固定の値にする命令です。

まるぺけさんのHPです。(有益な記事が多いです)
 ttp://marupeke296.com/DXG_KeyFrame.html


 
  



アキアキノヒロロ

リンク

2019/2/13(Wed) 14:44:53|NO.86568

フワット・ベベさんが[NO.51251]でご自分の理解の仕方を次のように述べていますが、

【実際の1ループ時間】=【プログラムが流れる時間】+【waitの指定時間】
【実際の1ループ時間】=【awaitの指定時間】

私もこの理解と言っていいです。論理的にこれが正解かどうか、わかりませんが、
感覚的にこれで済ませてしまっています。とすると、1ループ時間ごとの描画を
フレームレートとするなら、「wait」は使えない、「await」じゃないと、フレーム
レートを一定に保てない。それでも、PCという機械に仕事をさせているのだから、
無理が利く範囲内でなければ、「await」の時間を守らせることは出来ない。守らせた
としても、PCという機械は命令されたことを全てきちんとやれているかどうかは
また別問題。あれやこれやで、きっちりした時間は完全には保証できない。それでも
細かいタイミングを取りたいゲームなどでは、もともとモデルが作られた時のフレーム
レートを一定にしたい。そこで、
  setreq SYSREQ_VSYNC,1
  gpreset
というようなことも考え出された。
 また、まわりくどくなってしまいましたが、「await」と「フレームレート」の関係は
自分としては、こんな理解に落ち着きました。

 まるぺけさんのHP、自分には難しすぎますが、なんとなくイメージ的には、わかる気が
します。もう少し勉強が進んだら、改めて向かいあいたいと思います。

 通りすがりさん、何回となくお付き合い頂き、ありがとうございました。
 この題目としては、ここで一区切りといたします。



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