頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


SpriteKitの2D物理エンジンで自動車っぽい動き

iOS 7で登場したSpriteKitにはBox2Dのような物理エンジンがあるので、物体が衝突した時の挙動なんかも計算してくれるよね。
これを使って自動車を上から見た時の動きをシミュレートするにはどうしたらいいんだろうってお話。
横じゃなくて上から見た場合ね。

1) Before
単純に前輪部分でステアリングの角度を考慮した力を与えるだけだと、、、



↑とてもじゃないけど車に見えない。ハンドルをきったりぶつかったりすると簡単に回転してしまうんだけど、これっておかしいじゃない。自動車は四輪で地面と接していてタイヤの方向以外へは簡単には行かないはずだよね。


2) After



まだ完璧とは言えないけど少しマシになったかな?主に下の二つをやってみたのよ。
1)angularDampingプロパティを設定する
2)タイヤの左右方向への速度を小さくする

1)SpriteKitのSKPhysicsBodyクラスのangularDampingプロパティをいじっていなかった(デフォルトは0.1)ので、必要以上に回転していたみたい。これを大きくするだけでも車っぽくなる。

2)でも1)だけだとドリフトがそれっぽくならないし、回転の中心は図形の重心になるのでやっぱりよくみると車の挙動とは違うんだよね。
実際の車の挙動を考慮して、タイヤに相当する部分が横方向には拘束される、というのを物理エンジンで表現しようとしたんだよ。

モデル化

↑動画では車体の部分に画像を適用してるけど、物理エンジンで考慮する物体は車体の前後のタイヤ二つの合計三つでモデル化してる(濃い赤が前輪)。車体とタイヤはSKPhysicsJointPinでジョイント設定。
SKPhysicsBodyにはvelocityってプロパティがあってこれで速度を与えることができるのでこれを使うよ。自分で速度を決めるなんて物理エンジンどこ行った?って感じだけど、まあ仕方ない。

速度の成分

↑横方向の速度を調整。SKSceneの回転方向はどっちがプラスよ?とか何かと面倒だったりする。

横方向を完全にゼロにしちゃうとドリフトしてくれない。それも寂しいのでスピードを出し過ぎてたら滑って欲しかったりする。
それを考慮してしきい値を超えない場合は横方向の速度はゼロ、超えた場合は係数(<1.0)を掛けるようにしてみた。

いろんなパラメータのバランスの取り方が難しい、けどこういう処理で少しは車に近づけたかな。

ちなみに車を走行させてるのはiPad上で、車のハンドル操作はMultipeerConnectivityを使ってiPhoneをハンドル代わりにしてる。左上の数字はハンドル用iPhone側から受信したCoreMotionで得た値。

<< 拡大したビューに乗ってるビューをドラッグしたい   TopPage  YouTubeの動画を縦長でブログに埋め込む >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/818-7b2c4689




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad