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


HSPTV!掲示板


未解決 解決 停止 削除要請

2022
0126
アキアキノヒロロ物理挙動の内部処理って?10解決


アキアキノヒロロ

リンク

2022/1/26(Wed) 15:52:46|NO.95190

パソコンの物理挙動は、どうしたって擬似的なものでしょうけれど、
その内部処理はどうなっているのでしょうか。
まるで同じ条件なのに、プログラム実行のたびに、その様子が変わってしまったりします。
まるで、乱数を使っているみたいですが......。

私のツイッターの動画
https://twitter.com/akiakinohiroro/status/1486145093824544769

どういう訳なのか。専門的なことは無理だけれど、そのことを初心者でも分かるように教えていただけないでしょうか。
色々、ググってみましたが、[Unity]などの設定についての解説ばかりで、その原理的な処理については、見つかりませんでした。



この記事に返信する


youdai

リンク

2022/1/26(Wed) 16:03:40|NO.95191

HGIMG4の物理演算の物理エンジンについてならば、HGIMG4プログラミングガイドの「44.著作権とライセンス」に記載されています。
Bulletといって、blenderや一部のゲームに実装されているものと同様のものです。

Bullet Collision Detection and Physics Library
Advanced Micro Devices, Inc.
http://bulletphysics.org



GENKI

リンク

2022/1/26(Wed) 23:03:52|NO.95194

最近は物理演算の普及で計算方法わからなくても設定値入力すればその通りに動くものが増えてて簡単でいいですね。
一方詳しい内部処理は、需要がないのか解説サイトって昔からあまり増えてない気がする。

内部処理の基本について昔の記事が残っているのでこちらをどうぞ。探せば一般向けのもっといい解説もあると思いますが、こちらはHSP用に書かれているので動かしながら読めると思います。

物理のおおまかな話
https://wiki.hsp.moe/%E7%89%A9%E7%90%86%E3%81%AE%E3%81%8A%E3%81%8A%E3%81%BE%E3%81%8B%E3%81%AA%E8%A9%B1.html


実行結果が毎回違うのは理由はわかりませんが、ゲーム用途なので許容できる変化です。
物理エンジンが意図的な揺らぎを与えて自然な動きに見せているのか、フレームレート変動などによる計算誤差による差なのか…。
原因はわかりませんが、そういうものらしいのでそういうものとして設計したほうがいいと思います。



usagi

リンク

2022/1/26(Wed) 23:19:47|NO.95195

>専門的なことは無理だけれど、そのことを初心者でも分かるように

Bulletのソースを読まないと正確な事は分からないのですが、
よく計算の結果が同じにならない事で多いのは、物理計算のマルチスレッドと浮動小数点誤差がありますね。

たとえば当たりをとっている場合はフレーム内でどの順番でどれと内部的に当たりをとっているかは
計算スレッドが実行される順番によりますから、計算誤差が積り伝搬していくので結果が異なります。

ゲームなどで、結果を固定したい時はアニメーションとして焼き込んだ物を使ったり、
順番を決めて整数で計算したりですかね。
(または途中まで物理で、途中からアニメーションとか)


>その原理的な処理
物理演算は「剛体の力学」等で検索すると計算式など原理的な部分が出てくると思います。
また、計算誤差は「浮動小数点 誤差」などです。
以下HSPでわかる一例です。


mes "例1:パソコンでの計算は数学的な解とは違うもの--------------" a = 1.23 / 0.1 ; 数学的には 12.3 のはず b = 12.3 mes "a簡単表示"+a : mes strf("a実際%.17f",a) mes "b簡単表示"+b : mes strf("b実際%.17f",b) if a==b : mes "一緒" : else : mes "一緒じゃない" mes "例2:誤差がつもる-------------" c = 0.01 sum = 0.0 repeat 10000 : sum = sum+c : loop ; 数学的には 100.0 になるはず mes ""+sum mes "c簡単表示"+sum : mes strf("c実際%.17f",sum) if sum > 100.0 : mes "cは100.0より大きいよ"

マルチスレッドはそのままか「スレッドセーフ」などで検索すると情報あるかと思います。
3Dの描画処理や物理計算は時間がかかるのでよくある実装は別スレッドにします。

イケてない)
スタート

ゲーム処理

物理処理 // ここで時間かかると

描画処理 // ここが間に合わない

ループ

イケてる)
・メインスレッド
スタート

ゲーム処理

経過時間をサブスレッドに伝える

描画処理 // ここに余裕ができる(描画をすぐに始められる)

ループ

・サブスレッド
スタート

メインスレッドから経過時間を受け取る

物理処理 // 受け取った経過時間で差分を計算する。(余裕があれば細かく計算したりなど)

ループ

※Windows自体もマルチスレッドですし、
受け取る経過時間が違うので、誤差がつもったり。

あくまでもゲーム的なリアルタイムで処理する場合の一例ですので、
今回の実態は分からないので検討違いかもしれませんが、
何か調べの参考になればと思いコメントいたしました。



Drip

リンク

2022/1/27(Thu) 03:21:31|NO.95200

こんにちは。Dripです。

HGIMG4の物理挙動が毎回異なってしまう問題は私も困っております。
現状では物理がONになった時点でもうリプレイ系の処理は諦めねばなりません。
(リプレイの関与しない演出的な用途にしか使う事ができなくなってしまいます。)
またパズル系のゲームでも正解がBulletのご機嫌次第で不正解になってしまったりおかしな挙動になってしまいますね。
物理挙動を一時停止することもできませんし、他にも動作に色々と問題があるため本格的にゲームに使うことはまだ難しい印象を受けております;

なんとか改善されると良いんですけどね^^;



アキアキノヒロロ

リンク

2022/1/27(Thu) 04:21:56|NO.95201

[hgimg4]に関してのスレッドを立てて、一度にこれほどの方々から、反応を頂いたのは、初めてのように思います。
皆さん、有難うございます。うれしいです。

またもや、勉強することが増えてしまって、頭が痛いですが、うれしい悩み事にも思えます。
一筋縄では行かないことだけは確かなようですので、初心者同然のものとしては、勉強は続けていきますが、このスレはここで切り上げと致します。



アキアキノヒロロ

リンク

2022/1/27(Thu) 06:58:23|NO.95202

切り上げ、と言っておきながら、一つだけ。

Drip さんの「物理挙動を一時停止することもできません」については、はしけむ さんがツイッターでおっしゃっている方法が使えそうです。
(はしけむ さん、無断ですいません.... m(._.)m ....)
https://twitter.com/kemuduino/status/1481971954865573897

これは、はしけむ さんが、youdai さんの
https://hsp.tv/play/pforum.php?mode=all&num=92295#92411
を紹介して下さったことに対する、私のツイッターでのリプライに対して、はしけむ さんがわざわざ教えて下さった方法です。

[Blender]からFBX単位スケールでの出力、かつ、"name"パラメータにオブジェクト名を入れての[gpload]という手立てでないとうまくいかないようですが。
[gppset ID,GPPSET_ENABLE,0]で、物理演算を停止させ、[setpos,setang]ets.するというのです。

まだ、自分もうまく利用できていませんが、目からウロコの方法です。
「物理がONになった時点」の問題にも、強引とも言えますが、それなりに対処できそうです。



アキアキノヒロロ

リンク

2022/2/18(Fri) 09:36:26|NO.95456

切り上げ、と言っておきながら、一つだけ。

と言っておきながら、またです。お許しを。


私の別スレ、「[hging4] 列車用の物理挙動用ノードについて」からです。
そこでの Drip さんや、ここでの usagi さんがおっしゃっていることが、やっと分かってきました。

youdai さんのお勧めに従って、色々と調べてみました。


『HGIMG4プログラミングガイド』を見ると、
物理動作を実際に担当しているのは、[HSP]ではなく、[Bullet Physics Library]なのであって、
[HSP]側は、物理に関する様々な条件設定に使うデータ数値を、[Bullet Physics Library]に送るだけであり、
あとの物理計算を処理してもらう訳です。

そして、
『Bullet 2.76 Physics Japanese Manual』
http://bulletjpn.web.fc2.com/04_LibraryOverview.html
「統合について」を見ると、

値を指定するデータは、
>質量:動的力学オブジェクトに対しては正の値、静的オブジェクトには0を与えます。
>衝突形状:長方形、球、円錐、凸形、凹形、三角メッシュなど。
>摩擦係数や反発係数といった物質の性質

であり、フレーム毎の更新は、[stepSimulation]メソッドで実施します、とあります。

「stepSimulationを呼び出すと、btDiscreteDynamicsWorldはごく短いタイムステップでシミュレーションを行うのではなく、
その間を補間することにより、タイムステップ変数を考慮しつつ自動的に実行します。内部の固定タイムステップは60Hzです。
stepSimulationは衝突判定、物理シミュレーションを処理します。」

ともあります。

1秒間にプラスとマイナスが入れ替わる回数が周波数だから、「60Hz」は1秒間に60回、ということ。
すなわち、
> await 1000/60 ; 待ち時間
[HSP]側がこの[await]で描画をループすることを基本にする理由です。

また、
「デバッグ用描画」には、
「シミュレーションデータ構造を視覚的にデバッグできると、非常に効率的です。
例えば、物理シミュレーションデータがグラフィックデータと一致しているかどうかを確認することができます。
またスケーリングの問題、拘束条件の設定ミスなどを特定することができる場合もあります。」

とあり、「物理シミュレーションデータ」(物理計算処理結果データ)と、「グラフィックデータ」(描画処理データ)は、
必ずしも一致するものではない、誤差があることを前提としていることがわかります。


固定タイムステップ(60Hz)ごとに、「物理シミュレーションデータ」の結果を出し、
そこから「グラフィックデータ」を出して、それを[Bullet]が[HSP]に渡している。
そのデータに基づいて、[HSP]がPCに描画命令を出している。
PCが描画に時間がかかれば、先に進む固定タイムステップに間に合わない。誤差が出るのは避けられないようですね。
その中でさえ誤差がある[Bullet]と、キャッチボールしている[HSP]との間でも、誤差が生じてしまう。

別スレに書いたことが、そのまま結論です。
「これは、現状、もう仕方ないこととして受け入れ、そういう誤差を最小にする工夫を施し、
その誤差内で不都合にならないように、プログラムする、そう腹を括るのが賢明ということになるのでしょう。」



アキアキノヒロロ

リンク

2022/2/21(Mon) 02:58:29|NO.95509

色々と、調べてみたことを書き足したくなってしまいました。
以下、長文をお許し下さい。


私の別スレへ、Drip さんから頂いたご返答に

>awaitにいかなる固定値を指定したところで
>動作環境によってリアルタイムと僅かに誤差が生じてしまいますから、
>何とか誤差を小さくすることはできても、
>誤差を無くすことは残念ながら現状不可能に思えます。
>Hgimg4にフレーム単位の計算結果を出力する機能が欲しいところですが^^;

これを読んでいて、私の大分前のスレ
固定フレームレートごとのアニメーション更新は?
http://hsp.tv/play/pforum.php?mode=pastwch&num=86444
を思い出しました。

アニメーションと、物理の2つを組み込んだ、Hgimg4のプログラムを実行した場合、
そこには、3つの並行して進むものがあるようです。
1つは、モデルが持っているアニメーションを作るために使っている単位時間。
1つは、物理を扱っている[Bullet]が使っている単位時間。
1つは、それらを受け取って、HSPが描画のために使っている単位時間。

ところが、外部のソフトで作ったアニメーションも、物理の[Bullet]も、HSP側からその単位時間は操作できない。
では、どうするか。

[Bullet]は、内部の固定タイムステップが60Hz。
なので、それに合わせるため、描画のための単位時間(メインループのawait)に、1000/60(60Hz)を基本とする。
アニメーションの方は、そのawaitの間、どれだけのコマ送りにすればいいか、
言い換えるなら、1コマを受け取る時間はどれだけにすればいいかを割り出して、
それに合わせて、受け取っていけばいい。

『HSP拡張ランタイムリファレンス』の
「hgimg4のリファレンス」
「・アニメーション更新を固定フレームレートに対応」に、次のようにあるのは、それらの経緯を言っている訳でしょう。
注.) 通りすがり さんによると、doclibフォルダ内にあるそうですが、
どうしても、その『HSP拡張ランタイムリファレンス』が見つからないので、
通りすがり さんの、コピペのコピペ(孫引き)ですが
http://hsp.tv/play/pforum.php?mode=pastwch&num=86444#86554

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

ただ、実際に描画するのは、PCであって、その描画能力に左右される。
もちろん、[Bullet]が物理計算するのも、実際に計算するのは、PCであって、その計算能力に左右される。
これらが、2つとも十分である保証はないから、誤差が出る訳だ。

厄介なことに、もう一つ単位時間があるようです。
モニタ側の「1秒間に更新可能な画面の描画枚数」と言う、リフレッシュレート。
これと同期させるのが垂直同期というものだそうで、つぎの命令で行うようです。
>setreq SYSREQ_VSYNC,1

『HGIMG4プログラミングガイド』の「32.フレームレートの取得」
および
>PC:フレームレート・垂直同期・リフレッシュレート
https://tkent.blog.jp/archives/27872387.html

もう、これ以上の深入りは、やめておきます。



zrs90(5さい)

リンク

2022/2/21(Mon) 07:53:49|NO.95510

アキアキノヒロロ さんへ
●HSP拡張ランタイムリファレンス ですが
正体が分かりました。

『hgimg4.txt』です。

実はコレ、3.6には、収録されてません。
修正時に、抜け落ちたようです。
念の為、そちらでも、エクスプローラで
ファイルの存在を確認して下さい。

(※ちなみに、ウチのはzip版の3.6です。
3.7βは知りません。)

一応、3.5に『hgimg4.txt』がありましたので
TeraPad を使い、『3Dモデルのアニメーション...』
を検索した所、283行目で引っかかりました。

ただ、3.5なので、バージョンアップで
この辺りの仕様が、変わっているなら
役に立たないはず。...その辺りの判断は
私程度では分かりません。

ファイルの存在確認、おにたまさん への報告等は
お任せします。

...眠いので、そろそろ失礼します。では。



アキアキノヒロロ

リンク

2022/2/21(Mon) 14:12:04|NO.95519

zrs90(5さい) さん、毎回、情報提供、ありがとうございます。

『hgimg4.txt』確認致しました。([hsp35]&[hsp351]のdoclibフォルダ内)
[hsp361]以降では、『hgimg4.txt』は『hgimg4.html』に置き換わっており、
『HSP拡張ランタイムリファレンス』ではなく、『HGIMG4プログラミングガイド』という名前になっていました。

「・アニメーション更新を固定フレームレートに対応」は、
『HSP拡張ランタイムリファレンス』では、「・HSP3.5β5版との違い」という項目立ての中にありました。

『HGIMG4プログラミングガイド』でそれに対応するのは、「10.HSP3.5版との違い」という項目のようですが、
その中身はだいぶ違っていて、該当するような表現の記述も見当たりませんでした。
そのことが、どういうことを意味するかは分かりませんが。


追記.)
物理設定を利用する場合の[hgimg4]では、誤差を最小にする工夫として、

[Bullet]の固定タイムステップ60Hzに合わせて、[await 1000/60]のループで描画を行なう。

アニメーション更新は、デフォルトの挙動である経過時間ベースの設定にしておき、
固定フレームレート更新の [setreq SYSREQ_FIXEDFRAME] は、使わないか、
[setreq SYSREQ_FIXEDFRAME,-1] とする。

垂直同期 [setreq SYSREQ_VSYNC,1] を使ってみる。

このくらいがあると思うが、△蓮▲▲縫瓠璽轡腑鵑亙理とは別管理だから、意味がないのかも知れない。


結局のところ、私の理解の範疇に収まってくれる問題ではないようです。



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.95190への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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