2017-08-08 11 views
1

視覚教材幅対厚さ
(レイキャスティング使用):here厚さと幅の決定方法は?

は短いGIFを表示してください。
外筒と内筒があるため、厚さは幅とは異なります。厚さは、厚さが一方の端部から他方の端部までの間の中空空間を包含する他方の端部までの距離であるシリンダの任意の側の外壁/内壁の間の距離の測定値である。 GIFファイルに

クイック概要は
-Onを提供すべて((オレンジ)オーブは、距離を計算するために使用される場合、ユーザーがクリックと解釈エンドポイントを表すために作成された原点(青)と目的地点をクリックGUIに表示されます)。

原点は、オブジェクトコライダーのサーフェス上でクリックする場所を定義し、送り先は、原点のワールドY軸に垂直な点を定義します。第2のレイが第1のレイに向かって投射し、コライダー。

電流:

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 
RaycastHit hit; 
if (Physics.Raycast(ray, out hit)) 
{ 

//obtain the vector where the ray hit the collider. 
    hitPoint = hit.point; //origin point 
//offset the ray, keeping it along the XZ plane of the hit 
    Vector3 offsetDirection = -1 * hit.normal; 
//offset a long way, minimum thickness of the object 
    ray.origin = hit.point + offsetDirection * 100; 
//point the ray back at the first hit point 
    ray.direction = (hit.point - ray.origin).normalized; 
//raycast all, because there might be other objects in the way 
    RaycastHit[] hits = Physics.RaycastAll(ray); 
    foreach (RaycastHit h in hits) 
    { 
     if (h.collider == hit.collider) 
     { 
      hitBack = h.point; //destination point 
     } 
    } 
} 

現在、幅が場所で機能です。私は(gifに見られるように)オブジェクトの内部に入ることなく、厚さを計算したいと思います。

アメージング参照
http://answers.unity3d.com/questions/386698/detecting-how-many-times-a-raycast-collides-with-a.html

この男は、基本的には私と同じ疑問を持っていたし、おそらく仕事ができるソリューションを持っています。私はLinecastingとRaycastingがどのように連携しているか分かりません。

+0

[チャットでこのディスカッションを続行しましょう](http://chat.stackoverflow.com/rooms/151438/discussion-between-ryemoss-and-jthth) – ryeMoss

答えて

1

キープ:

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 
RaycastHit hit; 
if (Physics.Raycast(ray, out hit)) 
{ 

//obtain the vector where the ray hit the collider. 
    hitPoint = hit.point; //origin point 
//offset the ray, keeping it along the XZ plane of the hit 
    Vector3 offsetDirection = -1 * hit.normal; 
//offset a long way, minimum thickness of the object 
    ray.origin = hit.point + offsetDirection * 100; 
//point the ray back at the first hit point 
    ray.direction = (hit.point - ray.origin).normalized; 

置き換えますと

//raycast all, because there might be other objects in the way 
    RaycastHit[] hits = Physics.RaycastAll(ray); 
    foreach (RaycastHit h in hits) 
    { 
     if (h.collider == hit.collider) 
     { 
      hitBack = h.point; //destination point 
     } 
    } 

MirrorMirror's洞察に満ちた記事へのクレジットを、そして彼の楽器の助言と支援のため@ryemoss):

int counter = 0; 
bool calculating = false; //set this to true on click 
Vector3 Point, PreviousPoint, Goal, Direction; 
Point = ray.origin; 
Goal = hit.point; 
Direction = ray.direction; 

PreviousPoint = Vector3.zero; 
while (calculating == true) 
{ 
    counter++; 
    RaycastHit hit2; 
    if (Physics.Linecast(Point, Goal, out hit2)) 
    { 
     if(counter > 100) 
     { 
      hitBack = hitPoint; 
      counter = 0; 
      calculating = false; 
      break; 
     } 
     PreviousPoint = hit2.point; 
     Point = hit2.point + (Direction/10000f); 
    } 
    else 
    { 
     if (PreviousPoint == Vector3.zero) 
      hitBack = hitPoint; 
     else 
      hitBack = PreviousPoint; 

     calculating = false; 
     counter = 0; 
    } 
} 

Linecastレイキャスト対
レイキャストでは、開始点、方向、およびその方向を確認する距離を設定します。ラインキャストでは、単に開始点と終了点を設定し、2点の間をチェックします。

特定の方向をチェックインしたいが特定のエンドポイントがない場合は、linecastを使用して最終目的地を特に知っている場合は、raycastを使用します。

解決策
最初に、最初の点であるhit.pointを取得します。次に、ray.originを、コライダーの外側のワールド空間の点(最初に衝突したオブジェクトのコライダー)に設定し、最初の点でレイを直面するようにray.directionを設定し、ヒットします。ポイント。

最後に、whileループを使用して、レイで新しいラインキャストを作成します。ラインキャストがhit.pointに達するまで、オブジェクトとの衝突が発生するたびに、新しい位置を開始します(ラインキャストがhit.pointに達するまで、whileループを通して毎回更新されます)。 hit.pointに達すると、オブジェクトのすべてのサーフェスがヒットしたことを意味し、ヒットごとに、最初の最初のポイントhit.pointに達するまで新しいラインが作成されます。太さを計算するには、最初のヒットhit.pointとヒットしたリバース・ラインキャストのヒットとの距離をhit.point、PreviousPointとします。

UPDATE
1-見直し適切片面オブジェクト処理するコード(例:プレーン)。
2 - 計算が不可能な特殊なケースを防ぐためにカウンタを追加しました。
3 - 読みやすさが向上しました。

関連する問題