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

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

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

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

Unity

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

Q&A

解決済

1回答

4453閲覧

Unityにおいて物体接触時に法線ベクトルを求められるか

hiryt

総合スコア1

C#

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

Unity

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

0グッド

0クリップ

投稿2021/10/28 09:28

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

Unityでの問題です。接触物体面の法線ベクトルを取得する方法などは存在しますか。

該当のソースコード

C#

試したこと

接触面の3点が取得できればベクトルの外積を活用して計算できると考えましたが,接触時に得られるのは接触座標だけで計算しようにも座標が足りませんでした。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

Bongo

2021/10/28 10:31

「接触時に得られるのは接触座標だけで」とのことですが、ContactPoint.normal(https://docs.unity3d.com/ja/current/ScriptReference/ContactPoint-normal.html )はご所望のものとは違うということでしょうか? もしそうでしたら、取得したい法線についてもっと詳しくご説明いただけますでしょうか(たとえば、コライダーの法線ではなくて見た目通りのメッシュ自体の表面の法線である...とか)。
hiryt

2021/10/29 02:38

あまり知識がなく、雑な質問方法になってしまって申し訳ないです。物体に接触したときの法線ベクトルの座標?(x,y,z)のように取得してそれを活用したいと考えていました。おもにメッシュなどではなく法線は物体と接触したときの反力の方向として活用できると考えて、どんな物体でも接触時に法線ベクトルがわかったりするのかなと思い質問させていただきました。
hiryt

2021/10/29 02:39

意図した回答になっていない場合、申し訳ないです。
hiryt

2021/10/29 03:12

教えていただいたサイトのものを活用するとすべての物体接触時に一定の法線ベクトル座標?の数値を得られました。(おそらくですが..)とにかくベクトルを...と考えてごちゃごちゃになっていたので本当に有難い内容とコメント、ありがとうございます。
guest

回答1

0

ベストアンサー

接触しているかどうかはColliderコンポーネントによって判定することになりますが、
BoxColliderの場合は、CollisionFlagsを用いればどの面が接触したかがわかりますので、接触した際のオブジェクトのrotationから法線ベクトルが求められるかと思います。
*接触した面がSideの場合は接触座標から判定するコードが必要になります。

また、接触した座標は以下で取得できます。

void OnCollisionEnter(Collision collision) { foreach(ContactPoint contact in collision.contacts) { Debug.Log(contact.point); } }

ただ、BoxColliderの場合は接触箇所がわかれば接触面の判定・法線ベクトルは算出可能ですが、
MeshCollider等の場合は接触箇所がわかったところで法線ベクトルが求められるかは疑問です。

投稿2021/10/28 10:05

編集2021/10/28 10:12
YOshim

総合スコア1085

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

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

hiryt

2021/10/29 02:06

基本的に、boxや応用として複雑な立方体をメインで扱うのでMeshを使うことはあまりないのかなという風に考えています。必須で使うとなるのはBoxとsphereかとおもいます。
YOshim

2021/10/29 02:18 編集

>必須で使うとなるのはBoxとsphere なるほど。Boxについては上記コメントの通りです。 Sphereについては少し難しそうですね。
hiryt

2021/10/29 02:46

この方法ではBox関連は可能でもSphereの法線は取得が難しいんですね...。法線自体を使うというよりかは、その法線ベクトル座標を活用したいと考えていました。 方針としては 1.接触したときの反力の方向として法線座標を活用する 2.その座標を正規化?して1,0の数値で座標を得る 3.座標を用いてプログラムからSDKを通し、どの物体に接触しても一定の力を伝える みたいに考えていました。 わけのわからない構想であることと、具体的に説明していなかったことが申し訳ないです..。
YOshim

2021/10/29 02:58

>接触したときの反力の方向として法線座標を活用する 上記が目的であればSphereの場合は法線ベクトルを使用しなくともオブジェクトの中心を結んだベクトルを反力の方向としても問題なさそうですがどうでしょう。
hiryt

2021/10/29 02:59

形としては他の装置で動かしている物体が、Unity上に設置されている物体に接触したときに接触物体の法線ベクトル座標を取得してその装置のスクリプトに活用したいという感じです。
hiryt

2021/10/29 03:07

一度お教えいただいた方法で試してみます!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問