2017-06-21 5 views
3

ich den Entstehungsort haben leicht verfügbar, wo meine Maus auf dem Bildschirm ist wie so,berechnen Abstand zwischen Netzkanten

  ray = Camera.main.ScreenPointToRay(Input.mousePosition); 

Jetzt einen Würfel vorstellen. Überall, wo Sie auf diesen Würfel klicken, wird eine Linie von der angeklickten Kante durch das Objekt gezogen und stoppt am anderen Ende. Die Ausrichtung, vertikal oder horizontal, hängt davon ab, auf welche Seite geklickt wird, eine der 4 Seiten oder oben oder unten.

Wie man den Abstand nicht bestimmen (von einer Kante einer Masche zum anderen) und die Ausrichtung (vertikal oder horizontal)?

Gedanken?

Nur Idee, die ich bisher habe, ist Kollisionserkennung und CollisionEnter als Startpunkt zu verwenden und irgendwie eine Linie zeichnen, die das entgegengesetzte Ende des Netzes erreicht und CollisionExit verwendet, um den Zielpunkt (oder Exit) zu bestimmen. Führen Sie dann eine Berechnung durch, um den Abstand zwischen den Methoden Enter und Exit zu bestimmen.

+1

können Sie grafisch erklären, was Sie erreichen möchten? (Zeichnen Sie einige Linien mit Farbe oder was auch immer über einen Screenshot) – marsh

+1

Ja Sumpf! Ich werde dich besser machen, [hier] (https://ibb.co/ddsGq5) ist ein Gif, das darstellt, was ich vorhabe. Momentan, wie Sie im GIF sehen werden, habe ich einen zweistufigen Prozess, bei dem ein Objekt folgt und sich zu einem Objekt dreht, wenn ich die Maus um es herum bewege. Ich kann dann klicken, um den ersten Punkt zu platzieren, und dann erneut klicken, um den zweiten Punkt zu platzieren. Es erstellt dann einen Linienrenderer zwischen den beiden Punkten. Ich versuche dies mit einem Klick zu erreichen. Außerdem stelle ich das Würfelmaterial während des Gifs auf transparent ein. – jtth

Antwort

3

Die einzige Art, wie ich dies die Annäherung an denken kann, wäre einen Strahl zurück in der anderen Richtung zu werfen ....

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 
RaycastHit hit; 
if (Physics.Raycast(ray, out hit)) 
{ 
    //offset the ray, keeping it along the XZ plane of the hit 
    Vector3 offsetDirection = -hit.normal; 
    offsetDirection.y = 0; 
    //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) 
     { 
      h.point; //this is the point you're interested in 
     } 
    } 
} 

Diese verschiebt den Strahl an eine neue Position, so dass es das behält gleiche XZ-Koordinaten des ursprünglichen Treffers, so dass die resultierenden Endpunkte eine Linie bilden, die senkrecht zur Y-Achse der Welt/Szene ist. Dazu verwenden wir die Kamera Forward Richtung (wie wir einen Punkt weiter weg vom Aussichtspunkt erhalten wollen). Wenn wir einen Punkt für eine Linie senkrecht zur Trefferfläche (parallel zur Flächennormalen) erhalten möchten, können wir stattdessen einen Offset mit der hit.normal erstellen.

Sie werden wahrscheinlich eine Ebenenmaske oder maxdist Parameter in die beiden Raycast Methoden setzen wollen (so überprüft es weniger Dinge und ist schneller), aber das ist auf Sie.

Ursprünglicher Code:, der die zwei Endpunkte eines "einzelnen" Strahls findet, der durch das Objekt geworfen wird.

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 
RaycastHit hit; 
if (Physics.Raycast(ray, out hit)) 
{ 
    //offset the ray along its own direction by A LOT 
    //at a minimum, this would be the maximum thickness of any object we care about, 
    //PLUS the distance away from the camera that it is 
    ray.origin += ray.direction * 100; 
    //reverse the direction of the ray so it points towards the camera 
    ray.direction *= -1; 
    //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) 
     { 
      h.point; //this is the point you're interested in 
     } 
    } 
} 
+1

@JHiggins Wenn Sie genau hinsehen, ist 'h.hit' der Punkt auf der Rückseite des Objekts. Ich führe einen zweiten Raycast von * hinter * dem Objekt * in Richtung * der Kamera durch. 'hit.point' wäre der Punkt auf der nahen Seite (der Punkt, den Sie bereits kannten). Der Grund dafür ist, dass der zweite Raycast in der Ferne beginnt und die Maus bewegt, bis sie mit dem Objekt von Interesse kollidiert (daher die foreach-Schleife: wir mussten den richtigen Raycasthit finden). – Draco18s

+0

@JHiggins Ich empfehle die Oberflächennormale als Offset zu verwenden. Das bringt Sie immer auf die andere Seite des Objekts für konvexe Objekte. Für konkav, es wird Sie * otherside-ish. * Das ist das einzige, was ich denken kann, dass konsistente Ergebnisse haben würde. – Draco18s

+1

@JHiggins Nein, nein, alles, was Sie tun müssen, ist eine Zeile zu ändern, 'Vector3 offsetDirection = -1 * hit.normal;' – Draco18s

Verwandte Themen