質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
C#

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

Unity

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

Q&A

解決済

1回答

1044閲覧

unity GameObjectに直線を定義して相対角を計算したい

ryosan0201

総合スコア3

C#

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

Unity

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

0グッド

0クリップ

投稿2020/10/28 03:27

前提・実現したいこと

unityにてロボットアームの運動学計算をしたいと考えています。
計算のためにリンク同士の相対角を毎フレーム取得する必要があります。

発生している問題

リンク
上図のようなオブジェクトの運動学計算をしたいのですが(手書きですみません...)、unityのRotation値ではなく図中の赤直線同士の角度を出したいです。
(右下の図のようにリンクを直線で置きなおせれば運動学計算ができます)
本来はオブジェクトの詳細な寸法から計算できるのですが今回は図中の赤直線の距離程度しか分かっていません。

GameObjectの中に直線やベクトルを定義して、それら同士の相対角を計算することなどは可能でしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

角度を求めるとなると、Vector3.AngleまたはVector3.SignedAngleを使うのが順当ではないでしょうか?

下図のように各部位の赤線がオブジェクトの軸に一致するよう作ってあれば話が簡単になるかと思います。

図1

それぞれの赤線の向きとしてTransformの軸がそのまま使えますので、たとえば下記のようなスクリプトで角度を測定したところ...

C#

1using UnityEngine; 2using UnityEngine.UI; 3 4public class AngleInspector : MonoBehaviour 5{ 6 [SerializeField] private Transform boom; 7 [SerializeField] private Transform arm; 8 [SerializeField] private Transform bucket; 9 10 [SerializeField] private Text theta1Text; 11 [SerializeField] private Text theta2Text; 12 [SerializeField] private Text theta3Text; 13 14 private void Update() 15 { 16 var boomDirection = this.boom.forward; 17 var boomAxis = -this.boom.right; 18 var armDirection = this.arm.forward; 19 var armAxis = this.arm.right; 20 var bucketDirection = this.bucket.forward; 21 var bucketAxis = this.bucket.right; 22 23 var theta1 = Vector3.SignedAngle(Vector3.forward, boomDirection, boomAxis); 24 var theta2 = Vector3.SignedAngle(boomDirection, armDirection, armAxis); 25 var theta3 = Vector3.SignedAngle(armDirection, bucketDirection, bucketAxis); 26 27 this.theta1Text.text = $"Theta 1: {theta1:F2}"; 28 this.theta2Text.text = $"Theta 2: {theta2:F2}"; 29 this.theta3Text.text = $"Theta 3: {theta3:F2}"; 30 } 31}

下図のように表示されました。

図2

投稿2020/10/29 22:45

Bongo

総合スコア10811

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

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

ryosan0201

2020/10/30 02:24

ありがとうございます。 モデルの座標軸が今回計算したい軸と一致していないのが難点です... 今回使用しているモデルがassetファイルでしか配布されていないのですが、軸を変更できるツールなどありますでしょうか?
Bongo

2020/10/30 03:29

モデルを改変するのがアセットのライセンス的に問題なければ、何らかの3Dモデリングソフト(Blenderとか?)でお好みの向きに編集してしまうことは可能だろうと思います。 ですが姿勢をいじる程度でしたら、3Dモデルファイル自体を編集しなくとも何とかなるかもしれません。 たとえば空のオブジェクトを作ってモデルオブジェクトをそれの子階層に入れ、子階層の空間内でモデルオブジェクトを回してしまう手が考えられるでしょう。好都合な向きにしたのち、3Dモデルオブジェクト自体の代わりにその親の空オブジェクトを各部位として扱うことにすれば、オブジェクトの軸を書き換えたのと同等の動作をさせられるかと思います(参考: http://portaltan.hatenablog.com/entry/2016/04/15/134129 )。
ryosan0201

2020/10/30 03:49

子階層で回転させるのは思いつきませんでした! ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問