Jump to content
Unity Insider Forum

Quaternion Liste im Code vordefinieren


minuschki

Recommended Posts

Hallo zusammen

Ich habe in meinem Projekt eine menschliche Figur mit Bones. Nun möchte ich verschiedene Körperhaltungen jeweils in einer List<Quaternion> direct im Code vordefinieren und diese dann gezielt auslesen, wenn die Figur in eine andere Körperhaltung gebracht werden soll. Um an die Quaternion-Rotationsdaten zu kommen, bewege ich die Figur über den Inspector in die gewünschte Körperposition. Dann löse ich einen Debug.Log aus, der mir z.B. (0.0, 1.0, 0.2, 0.0), (0.1, 1.0, 0.0, 0.0), (0.0, 1.0, 0.4, 0.0) als transform.rotation für die ersten drei Gelenke ausgibt.

Nun das Problem: Wenn ich nun die Debug.Log-Ausgabe kopiere und manuell in den Code einfüge, erhalte ich Fehlermeldungen und bereits bei der ersten 0.0 wird ein Fehler angezeigt:

Assets/DrehenLerp.cs(90,33): error CS1026: Unexpected symbol `,', expecting `)'

Assets/DrehenLerp.cs(90,95): error CS1519: Unexpected symbol `;' in class, struct, or interface member declaration

Assets/DrehenLerp.cs(92,0): error CS1026: Unexpected symbol `}', expecting `)'

Was stimmt denn da in der Zeile "p1 = new List<Quaternion> {(0.0 ....)};" nicht oder wie muss das korrekt dort stehen?

Für eine Integerliste wärs ja: t = new List<Int> {1, 6, 14};

Für eine Stringliste wärs ja: s = new List<String> {"Haus", "Baum", "Katze"};

Eine Quaternionliste müsste wie aussehen: q = new List<Quaternion> { ? };

 

Danke für eure Hilfe!

 

 Debug.Log (startQuad[0] + ", " + startQuad[1] + ", " + startQuad[2]);				// die gesammelten Daten in eine Zeile ausgeben
 // Das ist die Debug.Lob Ausgabe, die ich kopiere: (0.0, 1.0, 0.0, 0.0), (0.0, 1.0, 0.0, 0.0), (0.0, 1.0, 0.0, 0.0)
 p1 = new List<Quaternion> {(0.0, 1.0, 0.0, 0.0), (0.0, 1.0, 0.0, 0.0), (0.0, 1.0, 0.0, 0.0)}; // bereits bei der ersten 0.0 gibts ein Problem

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe es jetzt nach langem Ausprobieren selber herausgefunden!

Ich denke, so ist es richtig. Falls das nicht stimmt, könnt ihr mich gerne korrigieren!

p1 = new List<Quaternion> {new Quaternion(0.0f, 1.0f, 0.0f, 0.0f), new Quaternion(0.0f, 1.0f, 0.0f, 0.0f), new Quaternion(0.0f, 1.0f, 0.0f, 0.0f)};
Link zu diesem Kommentar
Auf anderen Seiten teilen

Genau. Du musst der Liste sagen, dass da drin Quaternions sind. An sich ist das jetzt so ok.
Aber warum willst du das über eine Liste machen und dann auch noch mit den üblen Quaternions?
Ich persönlich würde Animationen erstellen. Selbst wenn da keine Bewegung drin ist, sondern nur eine starre Pose.
Ich würde also eine Animationsdatei Datei erstellen, und auf das Vaterobjekt des Humans werfen. Der Animator wird dann automatisch generiert.
Der Animation würde ich alle Bones als spuren zuweisen. Dabei werden automatisch 2 Keys erzeugt, die ich löschen würde. Dann würde ich nacheinander die einzelnen Bones drehen und einen Animations-Key bei Bild 0 setzen, um eine Grundpose zu definieren. Ist alles definiert würde ich zu Bild 10 oder so springen und nocheinmal einen Key für alle Bones erzeugen.
Diese Datei kann mann man jetzt so oft wie nötig duplizieren und umbennen wie man will. Dadurch wird viel Arbeit erspart.
Die kopierten Animationen kann man dann auch in dem Animator ablegen, die nötigen Bones für die neue Pose wieder drehen und die Keys überschreiben. Schon hat man weitere Posen.
Jetzt noch im Animator für jede Pose einen Trigger-Parameter erzeugen, und Transitions von AnyState zu den Animationen erstellen. Je Pose den gewünschten Parameter in der Transition auswählen und ExitTime auf 0 sowie die Transition Duration auf 0 stellen. Fertig.
Nun kann man im Code den Animator mit MyAnim.SetTrigger("pose1"); sagen, welche Animation er abspielen soll. Der Human verändert einmalig seine Pose und bleibt in dieser, bis ein anderer Parameter angesprochen wird.

So würde ich es machen. Vielleicht ist das ja etwas, was du mal testen willst.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Gerne. :)

Ich hoffe, dass deine Bones so gut angeordnet sind, dass du sie im Animator als Humanoid nutzen kannst, dann hast du nämlich sogar die Möglichkeit freie Motion-Capture Daten zu nutzen und möglicherweise sind in den Aniamtionsspure sogar die Posen versteckt, die du willst.
Wenn nicht, musst du halt generic nutzen und selber Hand anlegen. Aber das geht schon.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...