@pockyklly

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Unity 自転車を正常に動かしたい!

【HELPME】Bicycle - SampleScene - Windows, Mac, Linux - Unity 2022.3.19f1 DX11 2024_03_01 14_23_50.png
Bicycle - Microsoft Visual Studio 2024_03_01 14_28_00.png

こんにちは team_vrサイクリングでコース作成をしているものです。

Unityについて詳しい方にお伺いしたいのですが、再生してyのrotation=0の時はz軸の正の方向にはゆっくりと正常に動き出すのですが、その他yのrotation=90,180,-90にした場合、途端に飛んで行ってしまいます。
どうしたら正常に動きますかね

rigidbodyとcapsole及びvisual studioは上記の画像の通りになっております。

0 likes

1Answer

画像が参照できなかったので、考えられる原因で回答します。
それはおそらく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度になってしまったのなら、モデルに不具合があるのでは?

0Like

Your answer might help someone💌