3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

MIXI DEVELOPERSAdvent Calendar 2022

Day 24

正式リリースされたHavok Physics for Unityでニュートンのゆりかごは実現出来るのか

Last updated at Posted at 2022-12-24

はじめに

Havok Physics for Unityが製品リリースとなりました。
https://blog.unity.com/technology/havok-physics-now-supported-for-production

Unity Physicsに比べ、物体同士が重なっても安定してシミュレーションできるのが特徴のようです。
スクリーンショット 66.png

Unity Physics(右の例)は重なっている静的/動的なリジッドボディを1フレームで解決することを試みます。一方、Havok Physics(左の例)は数フレームにわたってスムーズに解決します。
https://blog.unity.com/ja/technology/havok-physics-in-unity

そこで今回は。ニュートンのゆりかごを検証に使い
誤差が生じやすい跳ね返りの運動について、
どの程度改善されているのかを確かめました。

検証環境

Macbook Air M1, 2020
macOS Monterey
Unity 2022.2.0f1

検証

EntityComponentSystemSamples-master
こちらのサンプルを改造していき、以下3つの物理シミュレーションで比較します。

  • PhysX(バニラのUnityプロジェクト)
  • Unity Physics(DOTS)
  • Havok Physics(DOTS)

なおHavok Physicsへの切り替えはスイッチ1つで行えるため、同一シーンでの検証が可能です。
スクリーンショット 67.png

1.単純な反発運動

まずはボールを床に自由落下させ、跳ねさせるシーンを作ってみます。
スクリーンショット 52.png

条件は以下のように設定してみます

  • ボールと床の反発係数を1にする
  • 摩擦や空気抵抗を0にする

エネルギー保存則から、もし理想的な動きをした場合は
ボールはスーパーボールみたいにはねてもとの高さに戻ると考えられます。

結果

Unity Physics、Havok Physicsともに
跳ね返るたびに最大到達点が減衰し、最終的には床で静止してしまいます。
スクリーンショット.png

一方PhysXでは逆の結果となります。
最初はこの高さでしたが
スクリーンショット 69.png
このようにどんどん高くなってしまいます。
スクリーンショット 70.png

この原因は、以下の動画でも説明されているように物体同士が潜り込んで誤差が生まれているからだと考えられます。

衝突したフレームを見ると確かにめりこんでいます。
このめりこみを解決するために、垂直上方向に余計な力が加わっているのでしょう。
スクリーンショット.png

この例では、PhysXはめり込みのせいで直感とだいぶ異なる動きをするものの、
Unity PhysicsとHavok Physicsの差はほぼ見られないという結果になりました。

2.ニュートンのゆりかご

PhysXでの例

PhysXで純粋なシミュレーションをしようとしている方がいたので動画を紹介します。やはり難しそうです。

実装

サンプルのJoint Paradeを改造し、複数の振り子を横に並べて
ニュートンのゆりかごを作ってみます。
画像ではボールが空中に浮いているように見えますが、上からロープで吊るされていると想像してください。
スクリーンショット.png

反発や摩擦の設定は1と同様で、
今度はボールはZ軸(奥)方向には動かさず、回転も固定していきます。
Rigidbodyではコンストレイントで設定できるものですね。
スクリーンショット 71.png

Physics Body(ECS)ではLimit DOF Jointなるコンポーネントで設定できます。
スクリーンショット.png

また、ロープで吊っているようなジョイントを設定するにはLimited Distance Jointを使います。
今回はロープはたるまず常にピンと張った状態にしたいので、Min DistanceとMaxDistanceは同じ値に設定します。
スクリーンショット 72.png

また衝突のめりこみ解決について、精度を上げるために iteration countを上げてみます。
スクリーンショット 73.png

結果

ボールの数を増やしたり、より高い位置から落としたりするとどうしてもうまく行かないようでした。しかしUnityとHavokで弾性衝突について差が見られたので紹介します。

ボールが2つのとき

以下のビリヤードの例のように、最初に動いていたのボールは衝突後にピタッと静止するはずです。

Unity Physicsでは、ボールは衝突後も静止せず、若干動いてしまっています。後半はより誤差が大きくなっていますね。

一方Havok Physicsでは、若干の動きはあるもののほぼ安定して動いているようです。

ボール5個の例

そのままではなかなかうまく動作しないので、ボール同士の間隔を若干増やしました。ピタッとくっついているとボール同士がすぐめり込んでしまうので、解決が難しそうですね。

Unity Physicsでは、2個の例と同じくボールが動いているせいで減衰が早いですね。

Havok Physicsでは、ある程度までの速度であれば上手に弾性衝突を処理してくれるようですが、ボールの高さを上げるとめちゃくちゃな動きになってしまいます。

まとめ

やはり純粋に物理シミュレーションだけでニュートンのゆりかごを実装するのは難しそうですが、Havok Physicsはめりこみ解決が上手く、弾性衝突そのものの動きがとてもそれらしく処理できていると感じました。
もちろん自前でうまく制御する手はありますが、それでもプロダクトの性質によっては選択肢に入ってくるかもしれませんね。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?