距離を求めたい
Unity初心者なのですが、あるオブジェクトの面とある三次元座標の距離を算出したいです。
On colision Enterのような当たり判定はあることを知っていますが、
planeのような平面を持ったオブジェクトとある点との最小距離とその平面上での座標を求めたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答2件
0
ベストアンサー
「平面」というのが「水平線まで広がる平面」であれば、UnityEngine.Plane
というそのまんまの名前のクラスがあります。
cs
1#define USE_PLANE 2using UnityEngine; 3using System.Collections; 4 5// Create -> Planeなどで作ったオブジェクトにこのスクリプトをアタッチして実行。 6// Hierarchyでこれ自身やtargetのオブジェクトを動かすと、平面上にresultのオブジェクトが表示される。 7public class Test01 : MonoBehaviour { 8 Transform target; 9 Transform result; 10 11 void Start() 12 { 13 // 検証対象となる球を作成 14 { 15 GameObject gameObj = GameObject.CreatePrimitive(PrimitiveType.Sphere); 16 gameObj.name = "target"; 17 this.target = gameObj.transform; 18 this.target.position = this.transform.TransformPoint(Vector3.up * 2.0f); 19 Material material = new Material(Shader.Find("Standard")); 20 material.color = Color.red; 21 gameObj.GetComponent<MeshRenderer>().material = material; 22 } 23 // 結果位置を示す球を作成 24 { 25 GameObject gameObj = GameObject.CreatePrimitive(PrimitiveType.Sphere); 26 gameObj.name = "result"; 27 this.result = gameObj.transform; 28 Material material = new Material(Shader.Find("Standard")); 29 material.color = Color.green; 30 gameObj.GetComponent<MeshRenderer>().material = material; 31 } 32 } 33 34 void Update() 35 { 36#if USE_PLANE 37 // 自身のトランスフォームのXZ平面の定義 38 Plane plane = new Plane(this.transform.up, this.transform.position); 39 // XZ平面上の点を求める。 40 this.result.position = this.target.position - plane.normal * plane.GetDistanceToPoint(this.target.position); 41#else 42 // まぁ、この程度の計算であれば、内積で簡単に求められるんですけどね。 43 this.result.position = this.target.position - this.transform.up * Vector3.Dot(this.transform.position - this.target.position, -this.transform.up); 44#endif 45 } 46} 47
ちなみにUSE_PLANEをUpdateで使っている深い意味とかはあるんですか?
c#
1 void Update() 2 { 3 // 自身のトランスフォームのXZ平面の定義 4 Plane plane = new Plane(this.transform.up, this.transform.position); 5 // XZ平面上の点を求める。 6 this.result.position = this.target.position - plane.normal * plane.GetDistanceToPoint(this.target.position); 7 }
現状のままであれば、Update
は上記のように動作しますが、
c#
1//#define USE_PLANE
というように、USE_PLANE
の定義をコメントアウトすると、
c#
1 void Update() 2 { 3 // まぁ、この程度の計算であれば、内積で簡単に求められるんですけどね。 4 this.result.position = this.target.position - this.transform.up * Vector3.Dot(this.transform.position - this.target.position, -this.transform.up); 5 }
上記のようになります。
要は、USE_PLANE
の定義の有無で、動作の切り替えを行い、簡単に両方の動作の検証をするためのもので、大した意味はありません。
ただ、ifディレクティブ、#defineディレクティブの使い方は、知っておいたほうが良いかもしれません。
投稿2019/08/07 11:09
編集2019/08/09 11:40総合スコア3582
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/07 21:07
2019/08/07 23:01
2019/08/09 08:27
2019/08/09 08:56