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

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

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

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

Q&A

解決済

1回答

3769閲覧

[Unity3D] 法線ベクトルに垂直なベクトルをランダムに一つ取得する方法

YutoHayashi

総合スコア8

Unity

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

0グッド

0クリップ

投稿2020/11/18 14:06

編集2021/02/14 09:49

タイトルの通りなのですが、 数学的知識の不足とUnityのベクトル計算に不慣れで実装方法がわかりません。

2つのベクトルから法線ベクトルを取得する方法などは調べるとメソッドが出てきましたが、その逆がわかりません。
平面の位置は原点を通る形で想定してもらえればと思います。
何卒よろしくお願いします。

解決したので下にメソッドを軽く貼っておきます。

C#

1//最終的なメソッドの形 2//ある法線ベクトルに対して垂直な原点を通る平面上のベクトルを一つ取り出す 3Vector3 GetPerpendicularVec(Vector3 vec){ 4 var randomNum1 = 0f; 5 var randomNum2 = 0f; 6 while(randomNum1 == 0f || randomNum2 == 0f){//ベクトルの長さが0である可能性について 7 randomNum1 = Random.Range(-1f, 1f); 8 randomNum2 = Random.Range(-1f, 1f); 9 } 10 11 float number; 12 Vector3 targetVec = Vector3.zero; 13 14 if(vec.x != 0){ 15 number = (-randomNum1 * vec.y - randomNum2*vec.z) / vec.x; 16 targetVec = new Vector3(number,randomNum1,randomNum2); 17 }else if(vec.y != 0){ 18 number = (-randomNum1 * vec.x - randomNum2*vec.z) / vec.y; 19 targetVec = new Vector3(randomNum1,number,randomNum2); 20 }else if(vec.z != 0){ 21 number = (-randomNum1 * vec.x - randomNum2*vec.y) / vec.z; 22 targetVec = new Vector3(randomNum1,randomNum2,number); 23 }else{ 24 Debug.LogAssertion("与えられたベクトルの長さが0です"); 25 } 26 return targetVec.normalized; 27 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

法線ベクトルとは、本来、平面を定義する為のベクトルです。
法線ベクトルと平面上の任意の1点が定まると、平面が定まり、平面上の任意のベクトルは、法線ベクトルと垂直となります。

法線ベクトルが(a,b,c)の時、原点(0,0,0)を含む平面の式は、
ax + by + cz = 0 となります。

求めるベクトルの長さに制限がないのなら、x,yをランダムに決め、zのみ、上記の式から求めれば、垂直なベクトルを取得できます。
ただし、長さ0の場合、ベクトルとして意味を持ちませんので、x=0 かつ y=0は除外する必要があるでしょう。

投稿2020/11/18 15:57

YT0014

総合スコア1708

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

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

YutoHayashi

2020/11/19 03:40 編集

早速の回答ありがとうございます! 教えていただいた形でトライしているのですが、 z = (-ax -by)/c となった時、(a,b,c) = (0,1,0)などの場合に困ったことになっています…。 これはどのように解決するのが良いでしょうか? あとこれはUnityの環境についての補足で恐縮なのですが、Unityは左手系の座標を扱っているので、おそらくxとzをランダムな値にしてyを算出するのが良さそうです。
YT0014

2020/11/19 04:37

考慮漏れ、失礼しました。 それならば、a,b,cのうち、0でない値によって、ランダム設定の値と、算出される値を決めるべきでしょう。 例えば、aが0でないなら、xを算出対象に、a=0、b≠0なら、yを算出対象に、a=0,b=0なら、zを算出対象にと、分けておいたほうが良いでしょう。 法線ベクトルが(1,0,0)も、当然、あり得ますから。
YutoHayashi

2020/11/20 09:45

なるほど、平面とベクトルの関係が理解できていませんでした! 右手系どうこうというのも関係がなかったんですね。 ありがとうございました!解決しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問