2017-09-19 2 views
2

J'ai 4 vecteurs pointant sur 4 coins d'un carré. Je voudrais détecter s'ils sont dans une certaine proximité d'un autre vecteur pointant ailleurs et si oui, agir en conséquence. J'ai trouvé un algorithme dit à mesurer la distance la plus courte entre deux segments de ligne, mais il ne fonctionne pas correctement, je pense:Comment mesurer la distance entre deux segments de ligne dans Unity3d

public class Test : MonoBehaviour { 
    public void FixedUpdate() { 
     var source = new Vector3(0, 0, 0); 
     var target = new Vector3(0, 0, 4); 
     var otherSource = new Vector3(1.6f, 0, -0.5f); 

     foreach (var dir in new[] { 
      new Vector3(source.x + 1, source.y, source.z + 1), 
      new Vector3(source.x - 1, source.y, source.z + 1), 
      new Vector3(source.x + 1, source.y, source.z - 1), 
      new Vector3(source.x - 1, source.y, source.z - 1) 
     }) { 
      var A = source; 
      var B = otherSource; 
      var a = dir - A; 
      var b = target - B; 

      var n = Vector3.Cross(a, b); 
      var u = Vector3.Cross(n, A - B)/Vector3.Dot(n, n); 

      var AA = A - a * Vector3.Dot(b, u); 
      var BB = B - b * Vector3.Dot(a, u); 

      Debug.DrawRay(A, a, Color.blue); 
      Debug.DrawRay(B, b, Color.red); 
      Debug.DrawLine(AA, BB, Color.green); 
     } 
    } 
} 

Maintenant, si vous l'exécutez, vous verrez quelque chose comme ceci:

enter image description here J'espérais voir quatre lignes vertes, mais il n'y en a pas. Si je hovewer déplace le vecteur otherSource un peu haut, je vois ceci:

enter image description here

donc un peu mieux, mais toujours pas ce que je cherche. Toute aide pour ajuster cet algorithme?

+2

'Vector3.Distance' est utilisé pour trouver la distance entre deux vecteurs – Programmer

+0

Vous pouvez également soustraire deux vecteurs et obtenir la grandeur au carré, ce qui serait bien pour les comparaisons. – George

+1

Qu'est-ce qu'un autre vecteur pointant ailleurs? Et * mesurer la distance la plus proche entre deux vecteurs *, voulez-vous dire * distance entre deux points * ou * deux segments/lignes définies par deux points *? – zwcloud

Répondre

0

Il semble donc que j'ai mal compris ce qui devait réellement être fait. Pour obtenir les informations dont je avais besoin (la distance entre un point et un rayon) J'ai utilisé ce code:

public static float PointToRayDistance(Vector3 point, Vector3 origin, Vector3 target) { 
    var ray = new Ray(origin, target - origin); 
    var cross = Vector3.Cross(ray.direction, point - ray.origin); 

    return cross.magnitude; 
} 

Espérons que cela aidera quelqu'un.

Je laisse le titre de question initiale, parce que je suppose que beaucoup de débutants peut trouver les mêmes choses que je l'ai fait, en utilisant les mêmes mots :)