2017-02-24 17 views
2

私は2つの任意の点V1とV2を持っています。私はV1からV2までのレイを定義し、レイがその平面に当たる正確な場所を探したいと思います。 コードを実行すると、ヒットポジションが間違った位置に上がります。あなたが見ることができるように、緑色の球は、V1とV2に位置合わせされていない光線の衝突位置を示しています。
enter image description hereレイキャストはオブジェクト上の適切な場所を検出しません

using UnityEngine; 
using System.Collections; 
public class RaycastLearning : MonoBehaviour { 

// Use this for initialization 
Vector3 v1; 
Vector3 v2; 
float MoveToLeft = 5f; 
void Start() { 
    GameObject plane = GameObject.CreatePrimitive (PrimitiveType.Plane); 
    plane.transform.rotation = Quaternion.AngleAxis (90f, Vector3.right); 
    plane.transform.position = new Vector3 (MoveToLeft, 0, 5); 

    v2 = new Vector3 (MoveToLeft, 0f, -10f); 
    v1 = new Vector3 (MoveToLeft, 0f, 10f); 
    GameObject SV1 = GameObject.CreatePrimitive (PrimitiveType.Sphere); 
    SV1.transform.position = v1; 
    SV1.name = "SV1"; 
    GameObject SV2 = GameObject.CreatePrimitive (PrimitiveType.Sphere); 
    SV2.transform.position = v2; 
    SV2.name = "SV2"; 

    RaycastHit r = new RaycastHit(); 
    if (Physics.Raycast (v1, v2, out r, 20f)) { 

      GameObject sphere = GameObject.CreatePrimitive (PrimitiveType.Sphere); 
      sphere.transform.position = r.point; 
      sphere.transform.position = new Vector3 (r.point.x, 0, r.point.z); 
      Material MaterialCol = new Material (Shader.Find ("Diffuse")); 
      MaterialCol.color = Color.green; 
      sphere.GetComponent<Renderer>().material = MaterialCol; 
      sphere.transform.localScale = 0.5f * Vector3.one; 
     } 

} 
// Update is called once per frame 
void Update() { 

} 
} 

それは私が(0,0,5)に平面を配置する場合ので、私にとって非常に興味深いですV1で(0,0,10)とV2で(0,0、-10 )正しい点を返しますが、他の角度と配置では正しい点を返しません。

問題を見つけるのを手伝ってもらえますか?

答えて

5

あなたはv1からv2までのポイントからレイキャストをしようとしていますが、(Point、Direction、RaycastHit、distance)を引数として渡すのではなく、(Point、point、RaycastHit、distance)次の行

if (Physics.Raycast (v1, v2, out r, 20f)) { 

レイキャストの第2のパラメータは、この場合、方向ベクトルはなくAPI当たりとして空間内の点です。したがって、単一性はv2変数を方向ベクトルとして扱います。 v1からv2への方向ベクトルを取得するには、単純にv2からv1を減算します。たとえば:

RaycastHit hitInfo = new RaycastHit(); 
if (Physics.Linecast (v1, v2 , out hitInfo)) {} 
:また

Vector3 delta = v2 - v1; 
RaycastHit hitInfo = new RaycastHit(); 
if (Physics.Raycast (v1, delta , out hitInfo, delta.magnitude)) {} 

、あなたは単にlinecastを行うことができます

関連する問題