実現したいこと
2枚目の画像の角度θを求めたいです。仮の値として赤い面はX30°Y10°回転させています。数学的な質問になってしまって申し訳ないのですが、よろしくお願いいたします。また、この角度を求めるのに使えそうなメソッドがあれば教えていただきたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
ご質問者さんの図を拝見しまして、私の場合は「2枚の板の交線を求めて、それとワールド空間水平面との角度を得たい」ということだろうかと解釈しました。
そこで下記のようなスクリプトにしてみたのですが、いかがでしょうかね?
C#
1using UnityEngine; 2 3public class IntersectionAngleCalculator : MonoBehaviour 4{ 5 // インスペクター上でこれらのフィールドに白板、赤板をセットしておく 6 [SerializeField] private Transform whitePanel; 7 [SerializeField] private Transform redPanel; 8 9 private void Update() 10 { 11 // スペースキーを押したら角度を計算する 12 if (Input.GetKeyDown(KeyCode.Space)) 13 { 14 // 交線の向きは白板の法線と赤板の法線の外積の向きになるはず 15 var cross = Vector3.Cross(this.whitePanel.forward, this.redPanel.forward); 16 17 // 外積ベクトルの長さを求める 18 // ※ささやかながら計算量節約のため、実際には長さの2乗を使いました 19 var crossSqrMagnitude = cross.sqrMagnitude; 20 21 if (crossSqrMagnitude > 0.0f) 22 { 23 // 外積ベクトルを正規化し、交線の向きとする 24 // ※使うのはY成分だけなので、実際にはY成分だけ求めました 25 var intersectionDirectionY = cross.y / Mathf.Sqrt(crossSqrMagnitude); 26 27 // Y成分のアークサインが交線と水平面の角度になるはず 28 // ※とりあえず正負は無視して、正の値として求めるようにしました 29 var angleInRadians = Mathf.Abs(Mathf.Asin(intersectionDirectionY)); 30 31 // コンソールに結果を度数法で表示する 32 Debug.Log($"Angle: {angleInRadians * Mathf.Rad2Deg}"); 33 } 34 else 35 { 36 // 白板と赤板が平行だと交線を求めることができない 37 Debug.LogError($"{this.whitePanel.name} and {this.redPanel.name} are parallel."); 38 } 39 } 40 } 41}
投稿2022/09/09 23:39
総合スコア10807
0
2次元平面上での2直線の成す角というのは,両直線の法線がわかってれば求められるよね(e.g. 単位法線同士の内積から cosθ がわかるよね).
そしたら,例えば角度を考えている2次元平面が灰色の面なのだとしたら,この2次元平面上での2直線の法線があればよい,と.
- 赤面の法線Nから Nの灰色面の法線方向の成分 を取っ払ったベクトル N' を求めれば,それが,角度を考える2次元平面上での斜めの線(:赤灰2面の交差する直線)の法線である.
- フリーハンドで引いてる赤い線の側については向き(法線)は当然既知なのだろう
…ってことで,角度θを求められるであろう,と見えます.
#Unityのことは全く知らんです.
投稿2022/09/09 01:26
編集2022/09/09 01:28総合スコア11658
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。