そういえば物理エンジンの精度ってどうなん?
Ғылым және технология
反発係数について精度を調べてみました
【Twitter】
こーじ物理エンジン: / physicskj
【公式LINE】
物理エンジンこーじ:lin.ee/GG4tG0n
(タイムラインに動画を挙げます)
【サブチャンネル】
/ @ko-ji2
【ゲームチャンネル】
/ @ko-ji_vt
【主な使用ソフト】
・Unity
・Blender
【使用させて頂いている音源】
MusMus:musmus.main.jp/
Music is VFR:musicisvfr.com/
フリー効果音 On-Jin ~音人~:on-jin.com
効果音ラボ:soundeffect-lab.info/
フリーBGM DOVA-SYNDROME:dova-s.jp/
#こーじ #物理エンジン
Пікірлер: 154
数学に誤差解析とかいう深淵の分野がありましてね…
@luasimt2514
2 жыл бұрын
数学っていうより計算機科学な気が 追記:なぜ計算機科学なのかというと、数学的な誤差伝播の理論が実数を浮動小数点数で近似する計算機には全く通用しないからです。例えば浮動小数点数の加乗算には結合法則が成り立たないなどがあります。
@Zeia-
2 жыл бұрын
ヒエッ
@user-ls1wf1xg5m
2 жыл бұрын
制度保証付き数値計算
今回の検証では、反発係数を到達地点の高さの比で表しているので、 単純に分母が大きい(刻みが細かい)方が値が正確に出るのだと思います。
@orange_alien
2 жыл бұрын
高さがある分回数が多いって事は秒あたりの物理計算増やしてるのと同じってこと?
@user-ev3bw6ed7n
2 жыл бұрын
@@orange_alien 反発係数がeのとき、 落とす前の高さhと、反発したあとの最高到達点の高さh'には、 h' = e²h という関係が成り立つのですが、 (例:100mの高さから、反発係数0.8の物体を落とすと、 0.8² × 100 = 64 となり、64mまで跳ね上がる) 今回は逆に、跳ね上がった高さから反発係数を計算しているので、 e = √(h'/h) という計算をしているはずです。 仮に0.01m(1cm)刻みで高さを計測しているとすると(実際はもっと桁が多いはずですが)、 例えば10.00mから落として、6.40m まで上がったら、反発係数は0.8と出るのですが、 次にバウンドすると、4.096m跳ねるはずですが、コンピュータは普通切り捨てを行うので、4.09m となり、これで計算すると 反発係数は0.79941… となり、0.8という理想的な値からずれます。 更に次のバウンドでは、2.6176m まで上がりますが、先程同様、切り捨てが行われるので、 2.61mとなり、 反発係数は0.79883… となり、更に精度が悪くなります。 つまり、高さが低くなってくると、 反発係数を求めるための計算で、切り捨てが行われたり、分母の数値が小さくなることによる値の刻みの粗さが顕著に現れるようになり、精度が下がると思われます。 極端な話、 0.01mから落とすと、最高到達点の高さは0.0064m となりますが、 切り捨てられてしまうので0mになってしまい、 反発係数は0 になってしまうわけです。
@hico5447
2 жыл бұрын
@@user-ev3bw6ed7n 言っていることはわかるけど、こういう計算は浮動小数点で計算するので、あんま変わらん気もする。 10mから落とす場合は、1.00×10^1 0.1mから落とす場合は、1.00×10^-1 ならどちらも有効精度3桁で変わらない。
@user-cv6lw2nu6j
2 жыл бұрын
文系なので簡単に説明してほすぃ
@user-qw4je9hr1g
2 жыл бұрын
@@user-cv6lw2nu6j 例えば跳ねた後の高さが1mmなのか、1.000…1mmnなのかの違いを見ないといけない場合(つまり高さが低い場合)、 コンピューター君は、そんな高さの差なんてわからんわ!大体このくらいやろ!ってなる。 すると大体の高さで出す分、精度が落ちる
ちょうどやっている範囲だから助かる
コメント欄にそれっぽい詳しそうな人達が集まってるのを超素人目で眺めるのが好きです
ずっとぴょんぴょんしてる物体可愛い
unityは座標系に32bit浮動小数点を使ってるから丸め誤差の影響もありそう
こうしたらどういう結果になるかな?と予想するのもおもしろいですね。確かにこれ遊べそうですね。使い方覚えるのが大変そうだけど
それ地味に気になってたから助かる!
1000mから落としても、反発係数0.2だったら全然跳ね返らないの面白い
どんどん高くなってるのは、衝突した瞬間に ボールが地面にめり込む(時間は離散的なのでボールの位置が地面にピッタリくっつく瞬間が物理演算のサンプリングしたタイミングで一致することはあり得ない) →めり込みを戻すために少し位置を補正する →ボールの速度を跳ね返った方向にする みたいな処理をやってる時の、めり込み補正での誤差なんじゃないかと思います 補正ではめり込んだ位置を元に戻す際に高さが少し高くなるはずなので、この方法での反発係数の測定での誤差の出かたと一致してると思います
@himadajin
2 жыл бұрын
あとは、0.1とかの2^(-n)の和で表すことのできない小数は2進数では無限小数となるので、10進数ではキリの良い数でも内部的には打ち切り誤差が発生しているのでそれも関係あるかもしれません
@Yoshi-wc8hr
2 жыл бұрын
@@himadajin この手の実数演算は浮動小数点数で実装されるのが定石だと思います 固定小数点数ではなく浮動小数点数なので、小数桁数による打ち切り誤差というより有効桁数による精度の問題かと
@himadajin
2 жыл бұрын
@@Yoshi-wc8hr 論理回路&コンパイラあたりが専門なので承知しております。 小数の誤差の話は非常に闇が深い()ので水掛け論になっちゃうかもしれません。 あなたの言ってることも正しいので、これに関しては文章の解釈や単語の使い方の違い程度のことなんじゃないかと思います。
@Yoshi-wc8hr
2 жыл бұрын
@@himadajin なるほどです 実例の演算誤差の起因は外部から推し量るのも難しいですしね ただ、元の表現だと前提知識を持ち合わせていない人が読めば「じゃあ数を大きくして計算させれば解決する」という固定小数点っぽい視点になるかもと思い一言お添えしました
大学の頃数値計算学んでましたが、演算頻度は細かくても荒くても誤差の元ですからねぇ…。モデルに見合った頻度を設定するのは中々に難しいです。
高校物理の実験をunityで色々やってみて、理論値と実測値を比較してみてほしいです
着地した時に表示される反発係数は最後の反発の反発係数で、その高さが小さいほど(シミュレーションの最小単位による影響が相対的に大きくなって)誤差が大きくなるものと思われます。 しかし、最後の反発の高さは最初の位置に単純に比例するものではないため、単純に高い/低いほど本来の値に近い値が出る、ということではないと考えられます。
問題なし(適当)
精度と高さが云々というよりは最下点から最高点まで上がるのにかかる時間に対して時間ステップが十分小さいかどうかで精度が決まると思います。低いところから落としてなおかつ反発係数が小さくても、計算する時間ステップを細かくすれば精度は良くなるはずでは。 なんか時間ステップの細かさの議論がいつの間にか高さとかの長さでの議論にすり替わっててめちゃくちゃ奇妙だな… クーラン数などを使って議論するとわかりやすいかもしれません
物理演算は完璧で、ずれはy座標の切り捨てと循環小数の計算でのずれのせいだと思う
衝突関係は、運動量を計算してると思うので、速度が高いほど計算誤差が小さくなって、反発の精度も良くなるのかなと。
@imge9
2 жыл бұрын
intの計算だとそれは成立するかもしれませんが、普通はこのような計算はfloat32以上を使います。floatの計算だとexponentに割り当てられたbitが桁数の差を吸収するので関係ないですね。
大昔の話で恐縮ですが 50年前 研究室の電子計算機(日立HITAC10 16bitミニコンピュータ)で卒論の数値解析をやっていました。 微分方程式を解くのにHITACのFORTRANの計算精度が悪く 誤差が誤差をよび 解が発散してしまいました。 方針を変え 積分方程式にして面積を求めるプログラムにかえて精度を確保しました。当時図書館で"数値計算法"と"誤差論"を学んだのを思い出しました。笑い話ですが ネットのない時代で 研究室の先輩はHITACの大型コンピュータを使うため京大まで阪急の定期券を買って通学してました。当時世界最高速は IBM370 その次に 東大京大のHITAC M180でしたか。
@Larphy002
2 жыл бұрын
@@osamumazemura2617さんへ 凄いですネ ドクターなんですね。 大学でのFORTRANの授業はなく 富士通の社員が夏季コースで教えてくれました。HITAC10 Mainメモリー8kw(16kBite)本体600万円+データタイプライター150万円 紙テープに穿孔してプログラム入力でした。 本体の16bitのレジスタのランプが点滅するのが見える超低速のスピードでした。 そうそう高橋洋一さんも数値計算をやってたそうですね。私は入社後 日研のIBM3033を実習でのみ使いました。原子力の先輩は炉心計算や耐震計算に従事していました。
ハードウェアやOSによって浮動小数点の計算方法が違ったりするので誤差の出方も違ったりする。 これのせいでマルチプラットフォームに出すソフトのリプレイ機能を作ったりするときにはとても困ったりする。
重力加速度を変えるとどうなるんでしょう、おそらく大きい方が位置の更新が大きいので誤差が出やすいんでしょうか
プログラムを作ったの!?!? すごい……!
工学的には無視できても現実との乖離が 計算回数が高さで差が出るから、低い方が悪くなるみたいですね
unityは本当に色んなところ削ってるからな... でもこういったプログラム書けるのが羨ましい Houdiniとかでやったりしたら変わりそう!
サンプルタイムを1msecから0.1msecへ変更したら、低い位置からの反発係数の精度が向上できないのでしょうか?
Unityの斜方投射は放物線運動にならないですよね…
微分方程式をどれくらいの精度で数値的に解くか? という問題に帰着しますよね。
高さが精度を上げているのではなく、落下時間の延長による物理計算の回数の増加が精度向上の鍵では?
みんな頭良すぎる...
サンプリング数を増やせば精度は上がり続けるのかな? それとも演算器の浮動小数点のビット数を増やさないと一定程度で精度は打ち止めになるのかな?
この動画に関係ないですが 衝突させて円周率求めるやつで何故かめり込んで吹っ飛びますどうすれば治りますか?
跳ね返る高さを計算するところでどうしても小数が絡むからそこで誤差でちゃうのと、レンダリングの座標の加算でまた誤差がでてそう。
複数回跳ねる場合は誤差が累積するので,悪くなっていくのかな?
0.8の時の立方体が荒ぶるの面白い
重力加速度と距離と計算速度の関係で物体と衝突した瞬間に必ず少しめり込むかめり込む直前で跳ね返っているはずです、そこで誤差が生じてしまい、距離によって誤差自体に差が出るのではないですかね。
有効数字の桁数が少ないほど不確かさが大きくなるということを示してくれている
高さの違い=有効数字の違いによる影響かも知れませんね 最大速度も小さくなりますし、複合的に精度が下がりやすいのかも
1秒間に1000回計算させた時、反発係数が与えた値より小さくなる予想だったのに大きくなったのはなんでなんだろう?
落ちる高さに比例して制度上がるの楽しい()
以前、VRアトラクションやってたらバグってUnityのロゴが視界いっぱいに広がったことある
反発係数が素数だと桁落ちしやすくなって精度落ちやすいとかないですかね?
テキスト表記の関数をfixedUpdate内に書き込めばもっと精度上がる説
どの実験でも落下距離が長いほど精度が高くなっていた。 20回/秒の試行回数の時、時間が経つにつれて反発係数1に近づいていっていたけど、 そのまま実験を続けていったらどの高さで帳尻が合って反発係数1に収束するんだろうか?と気になった。 1000回/sで100mとすると、20回/sでは5000mまでには反発係数1に落ち着くかな?
こういう電算系の小技で精度上げるために0.1を0.10にするとかあったけどUnityはどうなんでしょうね。入力時に0を消されるかなあ。
浮動小数の丸め誤差の影響が大きい気がします。 浮動小数では、正確な0.2とか9.8とかは表現できませんので。
反発係数の制度がこれってことは,ブロックの衝突回数から円周率が求められるアレ,いつものノリでやったらうまく動かないのかな
ゲームで物理エンジンがバグってものすごい動きする時って、一時的に物理計算の頻度が落ちてるってことなのかな
Unity使ってたんですね… なにか専用のソフトがあると思ってた…
これUnityだったんですね... Unityはモデリングでしか使ったことがなかった
元々物理シュミじゃないのは初めて知った でも大体正確なの凄いですねホント
数字が小さいほど結果に対する丸めの影響が大きいのかな?
こーじさんのパソコンのスペック知りたい
ロベカルのフリーキックをやって欲しいです
高さがなぜ制度に影響するのかというと数字が大きいほうが有効数字が増えるので計算時に端数がすくなくなるからです
地球の重力なら加速度が整数ではないから初期値の時点で誤差があるし 初期の高さによって衝突時に埋まる量が違うことにより生じる誤差とか Tickあたりの移動距離に誤差が出るとか色々要因はありそう 反発とは違うけど誤差の話だと 64bitのWindowsはFMA3対応後とそれ以前の環境でSystem.Mathの三角関数の計算結果がわずかに違うとかで Windows同士だから大丈夫だろうと考えて計算値を比較に使うとよろしくないという話なんかもある
2:48 エネルギー保存則の崩壊ww
跳ねてる間に何回計算できるかが重要な気がする(=跳ねてる間の時間が長いほど精度が高い?)
落とすたびに高くなるなら発電できますね!
元々「unity」ってゲーム開発ソフトだったんですね 全く知りませんでした 物理演算シミュレーションは、本来の使用用途から若干ズレた使い方なんですねw
昔のロックマンでタイム連打でジャンプ距離が伸びるのはこれか
@h870ghbg
Жыл бұрын
ロックマン2は、ポーズすると今の加速度がリセットされるみたいですね
よくわからないけど見てると頭良くなって来てる気がするん
NASAとかの軌道計算になってくると使えないぐらいの誤差にはなっちゃうのか・・・
反発し続けるのになんで最後止まるんだろう?
関係ないかも知らんが、どうやら神様はサイコロを投げるのが大好きらしいで
ぜひ力学的エネルギーが保存されるシミュレーションをしてみてください。オイラー法という手法でシミュレーションされているならだんだんと力学的エネルギーが増えて行くと思います
どんどん跳ね上がるの割と謎だな…… 何故反発係数が書き換わる……?
なるほど!わからん!
数学ダメダメマンにはよー分からん けどとりあえずunity作った人は凄い
反発係数e>1は永久機関完成するぞ
多分「落ちる高さ」は反発後の最高地点で毎回更新されるだろうから最初の高さは最後辺りの計測には関係ないと思う ただ反発係数が1.0未満なら精度は次第に下がるだろうし1.0より大きいと「落ちる高さ」も高くなっていくから次第に精度が上がると思う 試してないから知らんけど
単純にサンプリングの誤差が高さによって出てくるということでは
Unityでリジットボディ付けて遊んでたなぁ
ふむふむ…
反発係数って速度の比ってことを頭に入れたほうが良くない?(意外とそうでもない?)
3:01 それは こりん星w
もし反発係数1超えた部屋でスーパーボールを投げたら、跳ね返り続けていずれ凶器のような速さになって空気抵抗で破裂したりするのかな
多分単精度なんかな?あとはタイムステップ2のべき乗にしてほしいです
最初落とした高さよりも高くバウンドするなら精度の低さ利用して永久機関作れそうw
少しずれるくらいの精度はむしろ現実により近いと思う。
ルート計算の精度はどうなんだろう。。 オブジェクトの速度取れるなら、衝突前後の速度比にすればルート要らないね。前後の検出方法は分からん。。
高校物理で√(h1/h2)が反発係数になるって言うの求めたなあ...w 単に力学的エネルギー保存の法則使うだけなんだけども
V&Vもうやりたくねぇ
Unity用の物理エンジンといえば新しくUnityPhysicsとHavokが追加されてますが、そっちの精度はどうなんでしょう?
二進数で割り切れない少数を設定するとずれが大きくなるね。
計算回数と少数演算で二進数の端数がズレてる? いや計算したんじゃなくて直感的にそうなのかなって… 落下距離以外にも他のパラメータ要素あるし適当言ってるだけなんですが… これ空気抵抗とかの要素は0にしてあるんですよね、多分…
Unity入れなきゃ
大学で勉強したなー 数値計算の誤差累積
もし反発係数が1より大きければ戻ってくる球は元の高さより高くなるの?
反発係数1.1とかの物体があるんならそれでスーパーボール作って欲しい()
@LExp-kb4qn
2 жыл бұрын
狭い部屋に放り投げたら数日後亜光速に達してそう
@yakitako_yakitako
2 жыл бұрын
エネルギー無限に取り出せそう
現実世界でも反発係数1の物体同士で計算速度を減らせば永久機関が出来る・・・ってコト?!
低いと物理計算する回数が減るからじゃないですか?
e>1ならエネルギー革命起きそう
【リクエスト】 高性能な電動髭剃りで髭を剃っても剃り残しがある。なぜなのでしょう。
@user-tv2uo2yn1m
2 жыл бұрын
刃と肌が適切な角度で当たっておらず、隙間が出来るからです。 更に、毛が斜めに出ている場合、鋭角側から当てると断面が斜めになり、残りがはみ出します
人の言っている事がわからん頭の悪い人の気持ちが良く理解できる動画
反発係数1なのに跳ね返りが大きくなる現象なぜか不明でした。FixedTimestampが原因だったのかなと。
このソフト無料だったんだ、驚いた。
0:21 赤い球の半径を考えると反発係数√0.4くらいでは
高さの有効数字の問題では
誤差の原因は演算回数の差だと思います
反発係数が1超えだとSCP-018に
いつから声出ししてたんだ... 好き