跳ねない、回らない、止まらない 

実はあのゴルフボールには、ノーマルマップが貼ってあったのです!
takayama_130402_1.jpgこの美しい凹凸が。
意味ないけどね。。。
きっとカップインするときに、カメラを動かして寄るはずだ。たぶん。


ボールを飛ばすチュートリアルをやったあとには、発展させてパターゴルフを作ろうというのは、誰でもが思いつく発想だろう。
ところが、意外と一筋縄ではいかない。
Unityは、ちょっと3Dモデルを出してみるとかは簡単だが、実際にゲームアプリを作ってみようと思うと結構大変かもしれない。

まず、何も考えなくても物理挙動が組み込めるのはすばらしいが、思ったような挙動には、なかなかならない。
跳ねない、回らない、止まらない(泣


まず、一番最初にハマるのが、ボールを上から地面に落としても、バウンドしないということだろう。

Sphere ColliderとRigidbodyを追加すれば、重力に従って落ちはする。
ところが床に着地すると、その瞬間に停止する。

物理パラメータを、別途与えてあげなければならない。
Mass(質量)とかのパラメータは始めから持ってるんだから、全部持っとけばいいのに。
まぁ、使いまわすためだろうか。

Assets > Create > Physic Material で、物理マテリアルを作成する。
テキトウにPM_Ballとか名前を変更。
takayama_130402_2.jpgBouncinessに適当な数値を入れる。動摩擦係数と静止摩擦力も適当に入れる。
CombineがAverageだと、地面との半分の値になるので、片方にしか設定しない場合はMaximumにする。
そしてこれを、Sphere ColliderのMaterialに与える。

自分は実際には、ボールは全て1にして、グリーンや岩などの方に数値を入れ、Multiplyにしている。
こうすれば、ボールの方を変更すれば全体を変えられるので、天候変化時に全体を滑りやすくするとかができるかも。



次に、思ったほど、というか全然ボールが回らない。
rigidbody.AddForce(x,y,z)でボールを打ち出すが、押し出される感じで、なかなか転がらない。
押し出されて転がらないために、高速で打ち出すと摩擦がかかって、急ブレーキがかかってしまう。最初は、完全な真横の力がマズいのかと思い、微妙に上に打ち出したり方向をかえてみてもダメ。

ググってもよく分からず、かなりの時間を悩んだが、結局のところ、何故だか回転速度にデフォルトではリミットがかかっているかららしい。
これは正直、意味が分からない。かけたければ掛ければいいけれど、デフォルトは外しておいて欲しい。
Edit > Project Settings > Physics で開く PhysicsManager の
"Max Angular Velocity" に適度な大きい数値を入れることで、ボールが普通に回転するようになる。


ところが、これでもまだ思ったようには動かない。
最初に設定したPhysic Materialの動摩擦係数に大きな値を入れても、思ったようにボールが止まらない。
いつまでも転がり続ける。

これもなんでかなぁと思ったけれど、よくよく考えてみたらパラメータが足りてない。
箱を動かす場合には、静止摩擦力と動摩擦でいいけれど、ボールとかタイヤの場合は"転がり抗力"の方が重要なはず。
調べてみると、Rigidbodyが持っているパラメータの "Drag" が空気抵抗で、"Angular Drag"が回転に対する抵抗とのこと。
これか!。
takayama_130402_3.jpg

これで、なんとかそこそこ思うとおりの動きになった。
ただ、Angular Dragにネットとかで書かれている数値を入れても小さすぎて効果がない。現在 "1" にしているが、なんとなくで適当。

他にも必要なパラメータがあるからなのか、単位が違うのか、そもそも転がり抵抗って何よってのもよく分かってないが。


Unityは物理演算が組み込まれてるのがウリだけど、それでもこれだけトラぶってしまう。
DirectXでPhysXをやってた方が、このくらいならスンナリいく気がしなくもない。
すでにライブラリもあるしね。

始めたばっかりだけど、まだまだ先は長いと感じた。

 



 

コメントをお願いします 

Name:  ※必須(ニックネームでOK)
URL: 名前とURLを記憶
コメント:(HTMLタグは使用できません)
 

 

トラックバックURL