Jump to content
Unity Insider Forum

Spawn/Instantiate mit 2x X/Y Koordinaten für Anfang und Ende


Elharter

Recommended Posts

Hallo,

angenommnen ich möchte nicht nur X/Y mit einem Scaling verwenden, sondern ich möchte gerne eine Art "Wand" spawnen und deren Länge und Winkel/Rotation mit 2x X/Y spawnen lassen.

Anders erklärt: Ich kenne X0/Y0 und X1 und Y1 .... jedoch keine Rotation. X0/Y0 stellt also die linke Ecke dar und X1/Y1 die rechte Ecke. Durch die Koordinaten erhalten ich die Länge und die Rotation.


Jemand ne Idee wie man das lösen könnte? Ist ein wenig abstrakt die Anforderung.

 

danke

Link zu diesem Kommentar
Auf anderen Seiten teilen

Okay....wieder ein wenig weiter:

            //set line ends to vectors
            Vector3 vecA = new Vector3(data.line[i].x, 0, data.line[i].y);
            Vector3 vecB = new Vector3(data.line[i].x1, 0, data.line[i].y1);
            //get our midway point
            Vector3 midPointAB = (vecA + vecB) / 2f;
            //get the direction between the two transforms -->
            Vector3 dirAB = (vecB - vecA).normalized;
            // get the rotation of the line
            //Vector3 relativePos = vecA - transform.position;
            Quaternion rotationAB = Quaternion.LookRotation(dirAB);

            pos1.transform.localPosition = midPointAB;
            pos1.transform.rotation = rotationAB;

 

Damit habe ich mein Cube-Mesh EXAKT auf der Linie..... jedoch fehlt jetzt noch die Größe. 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Okay.... gelöst:

 

            //set line ends to vectors
            Vector3 vecA = new Vector3(data.line[i].x, 40, data.line[i].y);
            Vector3 vecB = new Vector3(data.line[i].x1, 40, data.line[i].y1);
            //get our midway point
            Vector3 midPointAB = (vecA + vecB) / 2f;
            //get the direction between the two transforms -->
            Vector3 dirAB = (vecB - vecA).normalized;
            // get the rotation of the line
            //Vector3 relativePos = vecA - transform.position;
            Quaternion rotationAB = Quaternion.LookRotation(dirAB);
            // get the length of the line
            Vector3 abLength = vecB - vecA;
            line.transform.localPosition = midPointAB;
            line.transform.rotation = rotationAB;
            // set the new length (scaling size from cube prefab is 1/80/1/)
            line.transform.localScale = new Vector3(line.transform.localScale.x, line.transform.localScale.y, abLength.z);

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mal vorsichtig mit den Dreifach Vierfachposts bitte :)

Wenn du einen 1x1x1-Standardcube hast, dann ist die Rotation am einfachsten zu berechnen mit Quaternion.LookRotation und die Größe mit z.B. Vector3.Distance. Am besten ist es, wenn du den Cube einem leeren GameObject "X" unterordnest, den Cube um (0.5, 0.5, 0.5) verschiebst, damit eine Ecke auf dem Nullpunkt von X liegt und dann das Script auf X packst.

Der Code wäre dann:

public void SetVectors(Vector3 a, Vector3 b)
{
  var distance = b - a;
  transform.rotation = Quaternion.LookRotation(distance);
  transform.localScale = Vector3.forward * distance.magnitude; // statt Vector3.Distance
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

OT: Mhhh, soll ich meinen ersten Beitrag am besten einfach editieren und die Infos hinzufügen?

 

transform.localScale = distance.magnitude; // statt Vector3.Distance

wirft:


Severity    Code    Description    Project    File    Line    Suppression State
Error    CS0029    Cannot implicitly convert type 'float' to 'UnityEngine.Vector3'       
 

Und "Script" habe ich keinen aus einem einzelnen Gameobjekt. Ich erstelle hunderte Objekte per Script auf einem Terrain.

Und hier geht es um "Wände" sozusagen die dann instanziert werden.

An sich hat mein Code funktioniert :) Jedoch habe ich schon einen Bug gefunden. Code funktioniert nicht mehr wenn X0 und X1 andersrum sind. Also die Werte +/- umgedreht sind. Dann stimmt nix mehr ^^

Edit: hat nichts mit den Werten zu tun, sondern damit dass das Scaling nicht mehr stimmt, sobald da eine Rotation reinkommt....hmpf. Magnitude scheint hier tatsächlich die richtigere Wahl zu sein was ich bis jetzt gelesen habe.

 

Edit2: Ok, die Ursache des Bugs kommt schon aus den Rohdaten. Die 2D-Koordinaten (x0/y0 und x1/y1) gibt es in beide Richtungen, da offensichtlich die besagte Wand von beiden Richtungen gezeichnet/gespeichert werden konnte. Somit stimmen die Formeln nicht mehr und die Berechnungen gehören irgendwo neutralisiert.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Äh... ja, hab mein Script mal korrigiert, hatte da was vergessen.

Zitat

OT: Mhhh, soll ich meinen ersten Beitrag am besten einfach editieren und die Infos hinzufügen?

Ja bitte. Vielleicht nicht zwangsläufig den ersten, aber halt wenn du nur etwas nachträgst in deinen jeweils letzten Beitrag, wie du es jetzt ja gemacht hast. Solange halt noch keine Antwort von jemand anderem darunter ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...