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

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

新規登録して質問してみよう
ただいま回答率
85.31%
Unity

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

Q&A

解決済

2回答

4853閲覧

平面のオブジェクト(Plane)とある点との距離を求めたい

RyosukeSHIBATA

総合スコア11

Unity

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

0グッド

2クリップ

投稿2019/08/07 08:09

距離を求めたい

Unity初心者なのですが、あるオブジェクトの面とある三次元座標の距離を算出したいです。
On colision Enterのような当たり判定はあることを知っていますが、
planeのような平面を持ったオブジェクトとある点との最小距離とその平面上での座標を求めたいです。

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

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

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

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

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

guest

回答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
katsuko

総合スコア3582

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

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

katsuko

2019/08/07 23:01

なるほど、「ClosestPoint」って意味がわからなかったのですが、ソースコードを見れば一発ですねw
RyosukeSHIBATA

2019/08/09 08:27

ほんとにドンピシャのコードをご教授いただきありがとうございます
RyosukeSHIBATA

2019/08/09 08:56

ちなみにUSE_PLANEをUpdateで使っている深い意味とかはあるんですか?
guest

0

単純に2点の距離を求めるのであれば、Distance()magnitude等で求める事が出来るかと思います。使い方くらいはご自身で調べる事をおすすめします。

平面上での座標、というのがいまいちピンとこないのですが平面を持ったオブジェクトから見てある点がどの座標にいるのか、という事でしたら

それぞれを親子関係にして、ローカル座標で取得する
(比較する2点がオブジェクトであるという前提)

2点の座標から差を求める

そのあたりが簡単そうなのかなと。

投稿2019/08/07 09:18

simapiko

総合スコア332

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問