misskey-dev / misskey

🌎 An interplanetary microblogging platform 🚀
https://misskey-hub.net/
GNU Affero General Public License v3.0
9.81k stars 1.32k forks source link

[drop-and-fusion] 物体間のファンデルワールス力が強すぎる Van der Waals force is too strong #12994

Open MineCake147E opened 7 months ago

MineCake147E commented 7 months ago

💡 Summary

image 下の5円硬貨は、どう考えても100円硬貨を支えられるとは思えませんが、100円硬貨は落下しません。 image 1000円紙幣の角に500円硬貨が半分以上乗り出した状態で安定しています。 image 100円硬貨の下にある1円硬貨がヤモリのように天井や壁に張り付いています。 ヤモリは高密度の剛毛と壁面の分子との間にファンデルワールス力を発生させることで天井に接着しています。 上記の現象はおそらく物理エンジンの不具合によるものと思われますが、この現象を「ファンデルワールス力」と呼ぶことにします。

その他にもファンデルワールス力に関連する様々な現象を確認しています。

  1. 例:50円硬貨が落下する時に、落下する前に足場となっていた500円硬貨を引き寄せつつゆっくり落下する
  2. 例:50円硬貨が落下する時に、落下する前に足場となっていた500円硬貨をわずかに引き寄せるがそれ以降そのまま落下する
  3. 例:5円硬貨が壁と10円硬貨の間に入る時、落下の最終段階で10円硬貨を引き寄せつつゆっくり落下し、10円硬貨に隣接していた50円硬貨を引き寄せる

本家🍉ゲームでは同様の現象は滅多に発生しません。 一定確率で発生しない事があり、挙動が予測しづらいので、修正していただけますと幸いです。

🥰 Expected Behavior

物体間のファンデルワールス力は無視できる程度に抑えられている。 (バブルゲームの物体や壁にヤモリのような微細な剛毛は生えていないので...)

🤬 Actual Behavior

上記のように物体同士が過剰に引き寄せ合う事がある。

📝 Steps to Reproduce

  1. バブルゲームをプレイする
  2. 一定確率で発生する

💻 Frontend Environment

* Model and OS of the device(s):
  - PC: Custom built PC
    - OS: Windows 11 Home 22H2 (22621.2861)
    - CPU: Intel(R) Xeon(R) w5-2455X   3.19 GHz
    - RAM: 32 GB DDR5 ECC RDIMM
    - Graphics: NVIDIA GeForce GTX1060(6 GB)
    - Storage: 
      - OS(C:) : WD_BLACK SN770 1TB PCIe 4.0 NVMe M.2 SSD
      - DATA (D:) : Western Digital WDC WD10EZEX-22MFCA0 1000.2 GB 7200RPM SATA HDD
      - WORKSPACE (E:) : Seagate ST1000DM003-1ER162 1000.2 GB 7200RPM SATA HDD
* Browser: Mozilla Firefox 121.0
* Server URL: misskey.io
* Misskey: 2023.12.2-io.2e

🛰 Backend Environment (for server admin)

No response

Do you want to address this bug yourself?

syuilo commented 7 months ago

slop値を下げれば解決するけど今度はfrictionを高くしても摩擦力がほとんど発生しなくなるのと不安定になる

MineCake147E commented 7 months ago

slopのデフォルト値は0.05のようですが、1.0というとても大きな値を採用している理由は何ですか? https://brm.io/matter-js/docs/classes/Body.html#property_slop https://github.com/misskey-dev/misskey/blob/d92aaf81c42dc91a915d38168996536d19d36cf8/packages/frontend/src/scripts/drop-and-fusion-engine.ts#L1139 slopが1であることにより、このpositionImpulseが負になり、結果として衝突物体間に引力が働くように考えられます。

positionImpulse = pair.separation - pair.slop * slopDampen;

https://github.com/liabru/matter-js/blob/7ec38a1f1c7cbfc5e37cc2a1c1b9a2978dc06ab0/src/collision/Resolver.js#L96C64-L96C64 より引用

syuilo commented 7 months ago

今度はfrictionを高くしても摩擦力がほとんど発生しなくなるのと不安定になる

のが理由ですね

syuilo commented 7 months ago

Planck.jsとかの方が良さそう