Unity 自転車を正常に動かしたい!
こんにちは team_vrサイクリングでコース作成をしているものです。
Unityについて詳しい方にお伺いしたいのですが、再生してyのrotation=0の時はz軸の正の方向にはゆっくりと正常に動き出すのですが、その他yのrotation=90,180,-90にした場合、途端に飛んで行ってしまいます。
どうしたら正常に動きますかね
rigidbodyとcapsole及びvisual studioは上記の画像の通りになっております。
こんにちは team_vrサイクリングでコース作成をしているものです。
Unityについて詳しい方にお伺いしたいのですが、再生してyのrotation=0の時はz軸の正の方向にはゆっくりと正常に動き出すのですが、その他yのrotation=90,180,-90にした場合、途端に飛んで行ってしまいます。
どうしたら正常に動きますかね
rigidbodyとcapsole及びvisual studioは上記の画像の通りになっております。
画像が参照できなかったので、考えられる原因で回答します。
それはおそらくUnityの内部計算の都合上で起こっているものだと考えられます。
例えば、適当なオブジェクトInspector上で(90, 0, 90)に回転させたのち、(90, -90, 0)に回転させてみてください。すると、なんということでしょう!回転が全く同じになります。
これは、Unity EngineではQuaternionという四次元回転系を使用しているために起こる不整合です。インスペクターではEuler(オイラー)という、私たち人間が理解し易いような表記三次元回転系になっています。
コンピューターからすれば、このような回転は意図したものではなく、180度回転したときなどは移動速度が無限大として認識されるので、特に物理演算とTransform計算を併用すると、あなたのように、オブジェクトが吹っ飛ぶなどの事例があります。多くの参考書で「物理演算とTransformの相性が悪い」といわれるのはこのためです。
もし、物理演算をベースにした自転車の挙動を実装したいなら、Transformでの計算はおすすめしません。
それでも
gameObject.transform.eulerAngles.y += 10f;
のようなオブジェクトの計算をTransformから扱いたいのなら、Quaternionで計算することをお勧めします。例えば、上のスクリプトではy軸を基準に+10度加算していますが、これをQuaternionでの計算にすると
gameObject.transform.rotation *= Quaternion.Euler(0, 10f, 0);
のような記述にすることをお勧めします。回転を上書きしたい場合は、
//この場合だと、オブジェクトの回転を(0, 10f, 0)に更新しています。
gameObject.transform.rotation = Quaternion.Euler(0, 10f, 0);
あとは、無理な回転をTransformで計算しないことですね。ところで、自転車の挙動では、ローカルX軸での回転は普通起こりません(あっても転倒?)が、)転倒なしにX=90度になってしまったのなら、モデルに不具合があるのでは?