###前提・実現したいこと
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#
###ご教示ください(><)
困っています(´・ω・`)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/08/21 09:01