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

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

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

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Unity

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

4709閲覧

Unityで2直線の最接近点を求める方法

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Unity

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/08/19 00:09

###前提・実現したいこと
Unityで平行ではなく交差しない2直線が再接近する座標を求めたいのですがその方法がわかりません。

###発生している問題・エラーメッセージ
ネットで検索したところDirectXを用いた処理があったのでそれを改造してUnity仕様にしてみたのですが動きません。

internal bool Calc2LineNearestDistAndPos( //これが全部この関数の引数 ref Vector3 pp1, ref Vector3 pv1, ref Vector3 pp2, ref Vector3 pv2, ref float pOut_dist, ref Vector3 pOut_pos1, ref Vector3 pOut_pos2 //ここまで関数が求める引数 ) { Vector3 v1 = new Vector3(0, 0, 0), v2 = new Vector3(0, 0, 0); Vector3.OrthoNormalize(ref v1, ref pv1); Vector3.OrthoNormalize(ref v2, ref pv2); float D1 = Vector3.Dot( (pp2 - pp1), v1); float D2 = Vector3.Dot( (pp2 - pp1), v2); Vector3 cross = new Vector3(0, 0, 0); cross = Vector3.Cross(v1, v2); float Dv = cross.sqrMagnitude; if (Dv < 0.000001f) { if (pOut_dist != 0) { Vector3 v = new Vector3(0, 0, 0); v = Vector3.Cross((pp2 - pp1), v1); pOut_dist = v.magnitude; } return false; } Dv = Vector3.Dot(v1, v2); float t1 = (D1 - D2 * Dv) / (1.0f - Dv * Dv); float t2 = (D2 - D1 * Dv) / (Dv * Dv - 1.0f); Vector3 Q1 = pp1 + t1 * v1, Q2 = pp2 + t2 * v2; Vector3 vv = new Vector3(0, 0, 0); if (pOut_dist != 0) { vv = (Q2 - Q1); pOut_dist = vv.magnitude; } if (pOut_pos1 != new Vector3(0, 0, 0)) { pOut_pos1 = Q1; } if (pOut_pos2 != new Vector3(0, 0, 0)) { pOut_pos2 = Q2; } return true; }

###元になったネット上から拾ってきたDirectXで動作する2直線の最接近座標を求める関数

bool Calc2LineNearestDistAndPos( D3DXVECTOR3* pp1, D3DXVECTOR3* pv1, D3DXVECTOR3* pp2, D3DXVECTOR3* pv2, float* pOut_dist, D3DXVECTOR3* pOut_pos1, D3DXVECTOR3* pOut_pos2 ) { D3DXVECTOR3 v1, v2; D3DXVECTOR3 & p1 = *pp1, &p2 = *pp2; D3DXVec3Normalize(&v1, pv1); D3DXVec3Normalize(&v2, pv2); float D1 = D3DXVec3Dot(&(p2 - p1), &v1); float D2 = D3DXVec3Dot(&(p2 - p1), &v2); D3DXVECTOR3 cross; float Dv = D3DXVec3LengthSq(D3DXVec3Cross(&cross, &v1, &v2)); if (Dv < 0.000001f) { if (pOut_dist) { D3DXVECTOR3 v; *pOut_dist = D3DXVec3Length(D3DXVec3Cross(&v, &(p2 - p1), &v1)); } return false; } float Dv = D3DXVec3Dot(&v1, &v2); float t1 = (D1 - D2 * Dv) / (1.0f - Dv * Dv); float t2 = (D2 - D1 * Dv) / (Dv * Dv - 1.0f); D3DXVECTOR3 Q1 = p1 + t1 * v1, Q2 = p2 + t2 * v2; if (pOut_dist) *pOut_dist = D3DXVec3Length(&(Q2 - Q1)); if (pOut_pos1) *pOut_pos1 = Q1; if (pOut_pos2) *pOut_pos2 = Q2; return true; }*/

###試したこと
とりあえずDirectXの機能と同等なUnityの機能に置き換えていったのですがうまくいきません。
それからif (pOut_dist)やif (pOut_pos1)等の意図がよくわかりません。
これは何を判定しようとしているのでしょうか。

###補足情報(言語/FW/ツール等のバージョンなど)
Unity 2017.1
C#

###ご教示ください(><)
困っています(´・ω・`)

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

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

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

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

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

guest

回答1

0

ベストアンサー

まず、数学的にどう計算するのかを学んだ方がいいです。

一般に、空間座標における直線は、通る点と直線の向きによって定まります。直線上の一点の位置ベクトルをa、直線に平行な向きを持つベクトル(これを直線の方向ベクトルという)をdとすると、この直線上の任意の点の位置ベクトルpは実数tを使って、
p=a+td
と表せます。今、二本の直線上の点の位置ベクトルp1p2について、
p1=a1+t1d1
p2=a2+t2d2
と定めます。この差
h=p1-p2
が二本の直線両方に垂直であるとき、つまり
hd1=0 かつ
hd2=0
が成立する時、二直線間の最短になります。
これはt1とt2についての連立方程式になるので、これを解けばp1p2hがわかります。

投稿2017/08/19 07:46

swordone

総合スコア20649

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

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

退会済みユーザー

退会済みユーザー

2017/08/21 09:01

大変納得しました、こういう原理から説明してくれるの大好きです(`・ω・´)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問