2017-02-24 4 views
2

J'ai deux points arbitraires V1 et V2. Je définis un rayon de V1 à V2 et je veux trouver l'endroit exact où le rayon frappe le plan. Quand je cours mon code, la position de frappe est atterrie sur la mauvaise position! Comme vous pouvez le voir la sphère verte montre la position de collision de rayon qui n'est pas alignée avec V1 et V2.
enter image description hereRaycast ne détecte pas le bon endroit sur l'objet

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() { 

} 
} 

Il est très intéressant pour moi parce que lorsque je place le plan dans (0,0,5), V1 (0,0,10) et V2 (0,0, -10) il renvoie le point correct mais dans d'autres angles et placement ils ne renvoient pas les points corrects.

Pourriez-vous m'aider à résoudre le problème?

Répondre

5

Vous essayez de faire un Raycast des points v1 à v2 mais, au lieu de passer (point, direction, out RaycastHit, distance) comme arguments, vous passez (point, point, out RaycastHit, distance) dans la ligne suivante:

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

le second paramètre d'un raycast, dans ce cas, est une direction vectorielle, non pas un point dans l'espace, selon la API. Donc, l'unité traite votre variable v2 comme un vecteur directionnel. Pour obtenir un vecteur de direction de v1 à v2, soustrayez simplement v1 de v2. Par exemple:

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

Sinon, vous pouvez simplement faire un linecast:

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