🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

3496閲覧

unity 移動量に応じてタイヤを回転させたい。

Um_kok

総合スコア39

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/02/05 03:29

編集2021/02/05 04:04

こんにちは、只今ゲーム制作をしております。
そこで詰まってしまったので、質問させていただきます。
今やっているのがNavMeshでAIを動かして、座標で計算してやっています。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class AiTire : MonoBehaviour 6{ 7 [SerializeField] private float roll = 200; // 回転スピート 8 // private float beforePos; // 前のポジションを格納 9 private Vector3 beforePos; 10 11 void Update() 12 { 13 WheelRotate(); 14 } 15 /// <summary> 16 /// AIタイヤを回転 17 /// </summary> 18 private void WheelRotate() 19 { 20 // var rotate = transform.position.z - beforePos; 21 // transform.Rotate(rotate * roll, 0, 0); 22 // beforePos = transform.position.z; 23 24 var rot = transform.InverseTransformPoint(transform.position - beforePos); 25 transform.Rotate(rot.z,0,0); 26 beforePos = transform.position; 27 } 28}

このやり方でやっているのですが、こっちでやっていしまうと、回転する向きが後ろに行ったり前に行ったりしてタイヤが回転しているようには見えないです。

C#

1 // var rotate = transform.position.z - beforePos; 2 // transform.Rotate(rotate * roll, 0, 0); 3 // beforePos = transform.position.z; 4

こっちは動いていないのにずっと回転してしまいます。

C#

1 var rot = transform.InverseTransformPoint(transform.position - beforePos); 2 transform.Rotate(rot.z,0,0); 3 beforePos = transform.position;

Wheel Colider は無しでお願いします。回答お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

後者の案は、位置変化をローカル空間に直して前後の移動量を求めようとしたものかと察しますが、なかなかいい発想のように感じました。ですがタイヤのローカル空間を使ったのでは、タイヤの回転によってローカル空間もクルクル回転してややこしくなってしまうんじゃないでしょうか?
ここは車本体のローカル座標系を使った方がいいように思うのですが、いかがでしょうか。

C#

1using UnityEngine; 2 3public class AiTire : MonoBehaviour 4{ 5 [SerializeField] private float wheelRadius = 1.0f; // タイヤの半径 6 [SerializeField] private Transform carTransform; // 車本体のTransform 7 private Vector3 beforePos; // 前のポジションを格納 8 private float rotationSign; // 回転方向の符号 9 10 void Start() 11 { 12 // タイヤの順回転・逆回転を決める 13 // タイヤのX軸が車本体のX軸に向くよう取り付けられていれば1、逆向きなら-1とする 14 rotationSign = Mathf.Sign(Vector3.Dot(carTransform.right, transform.right)); 15 16 // beforePosの初期値を設定しておく 17 beforePos = transform.position; 18 } 19 20 void Update() 21 { 22 WheelRotate(); 23 } 24 25 /// <summary> 26 /// AIタイヤを回転 27 /// </summary> 28 private void WheelRotate() 29 { 30 // ワールド空間における位置変化を求め... 31 var worldDeltaPos = transform.position - beforePos; 32 33 // 車本体のローカル空間に直し... 34 // (車本体のスケールは無視するべきかと思い、回転のみ考慮しました) 35 var localDeltaPos = carTransform.InverseTransformDirection(worldDeltaPos); 36 37 // そのZ成分から回転量を求める 38 transform.Rotate(rotationSign * Mathf.Rad2Deg * localDeltaPos.z / wheelRadius, 0, 0); 39 40 // beforePosを更新 41 beforePos = transform.position; 42 } 43}

図

投稿2021/02/05 11:05

Bongo

総合スコア10811

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Um_kok

2021/02/06 03:10

お返事遅れてすみません。 そうですね。コードが甘かったです。 Bongo様のご教示の実装の仕方で出来ました。 のですが、、、少しわからない事があるので質問させてください。 rotationSign = Mathf.Sign(Vector3.Dot(carTransform.right, transform.right)); このコードで内積を求めて回転方向を決めて、Rotate() の回転で rotationSign * Mathf.Rad2Deg * localDeltaPos.z / wheelRadius ここでrotationSign でタイヤの回転向きを指定しているのは分かるのですが、 Mathf.Rad2Deg でラジアン値を角度に変換して 移動量分回転する、、というのですがRad2Deg はどれを角度に変換しているのですか? あとその回転を wheelRadius で割る意味が分かりません。 ちゃんと理解したいので、教えてもらえないでしょうか?
Bongo

2021/02/06 05:49 編集

円を転がした時の移動距離を求める...みたいなシチュエーションの問題を学習した経験はありますでしょうか? タイヤが1回転すると、その円周の長さの分だけタイヤが移動するはずです(参考: https://www.rikasuki.jp/rika_no88/rika_no88.htm#sharinhttps://sci-tech.ksc.kwansei.ac.jp/~kawanaka/rad.pdf )。逆に、移動距離とタイヤの半径が分かればタイヤの回転量を求めることが可能なはずです(参考: https://www.honehakase.info/fan-central-angle/#i-4 )。だいぶ前に、別の方のご質問に対する回答として図を描いたことがあるのですが(https://teratail.com/questions/136005#reply-205984 )、イメージを掴むご参考になりますでしょうか?
Um_kok

2021/02/06 06:09

なるほどです。つまり移動距離/半径が「回転量」になるというわけですね。 そう言う公式みたいな感じで覚えます。詳しく教えてくださりありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問