Jump to content
Unity Insider Forum

Bones & Muscle


nadin1223

Recommended Posts

Guten Morgen Unity-Begeisterte Nutzer,

zu aller erst: Ich bin ein Neuling in Unity. Das liest du bestimmt häufiger 😉

Ich versuche zum Zeitpunkt das HumanBodyBones und Muscle zu verstehen.

Hierzu wählte ich mir Unity-Runtime-Animation-Recorder als Basis aus.

Mein Ziel: Muscles in .anim speichern.

Also eine Checkbox eingebaut. Ist diese gewählt und "isHuman", dann werden von Animator die HumanBodyBones gelesen.  Diesen werden mithilfe "MuscleFromBone" die Muscle zugeordnet.

Soweit so gut. (Das denke ich mir, weil ich den .anim schon mal schafe zu erzeugen. Und auch die Muscle gefunden werden...)

Und nun mein kleines (Verständnis)-Problem:

Wie setze ich nun den Muscle? 

Mit "gameObject.rotation.normalized.x komme ich irrgendwie nicht weiter. Und ich weiß nicht ganz, wie/ob ich limit einbaue muss.

Und gibt es ein Anfangswert, welcher zu beachten ist???

Oder ist mein Transform falsch???

Also nach paar Stunden ausprobieren habe ich viele Fragen und absolut keine Ahnung, ob es so kompliziert ist oder ob ich es so kompliziert mache.... 

Deshalb: Vielen herzlichen Dank für Deinen Beitrag!!!

Ein wenig Code, damit es nicht zu langweilig ist... 😁:


//schnipsel aus UnityAnimationRecorder
[...]
HumanBodyBones getHumanBodyBones;
Enum.TryParse<HumanBodyBones>(boneBodyItem.humanName, out getHumanBodyBones);
Transform Itemtransform = gameObject.GetComponent<Animator>().GetBoneTransform(getHumanBodyBones);
  if (Itemtransform){
		int boneid = (int)getHumanBodyBones.GetHashCode();
		string[] muscle = new string[3];//Speichert die Namen von Muscle
        //wäre der Muscle für x
		muscle[0] = HumanTrait.MuscleFromBone(boneid, 0) >= 0
					? muscleName[HumanTrait.MuscleFromBone(boneid, 0)]
				: null;
       //[analog y,z]
  }
[...]
//schnipsel aus UnityObjectAnimation
[...]
  //Ist max und min hierzu nötig? Zumindest bis jetzt noch keine Sinvolle Verwendung hierzu gefunden :-( 
 float maxX = humanBone.limit.useDefaultValues ? HumanTrait.GetMuscleDefaultMax(muscleIndex[0]) : humanBone.limit.max[0];
float minX = humanBone.limit.useDefaultValues ? HumanTrait.GetMuscleDefaultMin(muscleIndex[0]) : humanBone.limit.min[0];
  //Das mit valueX war ein voller reinfall. 
			float valueX = observeGameObject.rotation.eulerAngles.x <= 180
										? (observeGameObject.localRotation.eulerAngles.x  / minX )
										: (observeGameObject.localRotation.eulerAngles.x - 180) / maxX
										;
   //mit resetPos habe ich versucht, während Init den Startposition auszulesen. Das macht zwar kein Sinn; Aber ich bin nah an der Verzweiflung
    //von  observeGameObject.rotation fast alles durch...Und irgendwie fehlt mir das Verständnis diese Pipline aufzubauen
			curves[i].AddValue(time, observeGameObject.rotation.eulerAngles.normalized.x + resetPos.x); 
                                                                         
     
  
  
  

 

 vG

Nadin

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 7 Stunden schrieb nadin1223:

gameObject.rotation.normalized.x

Ich kann dir so schon einmal sagen: Dieser Code erfüllt niemals einen sinnvollen Zweck :)

Ich verstehe leider nicht so genau, was du vorhast. Soweit ich weiß (weil ich mich super viel damit beschäftigt habe), ist ein Muskel ist in Unity bei Humanoid Retargeting ein Ding, das einen Knochen repräsentiert, damit man humanoide Animationen von einem Charakter auf einen anderen übertragen kann, selbst, wenn dessen Knochen anders heißen oder anders angeordnet sind. Um Muskeln festzulegen, benutzt du beim Import deines humanoiden Charakters das entsprechende Fenster in den Import Settings. Was genau hast du daher mit deinem Code genau vor?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin Sascha,

vor 7 Stunden schrieb Sascha:

Ich verstehe leider nicht so genau, was du vorhast.

kann ich gut verstehen. Bin selbst nicht sicher; wie ich meinen Wunsch klar formuliere. 😅

Zur Begin würde mir reichen, wenn Unity-Runtime-Animation-Recorder statt Position und Rotation der Transformer, die Muscle mit richtigen Werten speichert. (Bild: Ziel)

vor 7 Stunden schrieb Sascha:

Soweit ich weiß (weil ich mich super viel damit beschäftigt habe) [...]

Jeder Beitrag, wo der Ersteller was mit Bone und Muscle als Begriff was anfangen kann; hilft mir weiter 😉. Beispielsweise, weil ich meine Gedanken sortiert kommuniziere.

Mein geringes Verständnis von Bones und Muscle habe ich im Bild(BoneMuscle) versucht zusammenzufügen.

Bezogen auf das Bild(BoneMuscle): ist meine obere Frage wie folgt formulierbar:

Wie berechne ich den Muscle-Wert bei bekannter Bone Rotation?

Oder analog:

Wie berechne ich die Rotation von Bone beim gegebenen Muscle-Wert?

 

vor 7 Stunden schrieb Sascha:

Ich kann dir so schon einmal sagen: Dieser Code erfüllt niemals einen sinnvollen Zweck

dies dachte ich mir schon (um die Uhrzeit rechnete ich auch nicht mit produktiven Ergebnis 😅)...

Aber es exisitert doch eine Berechnung zwischen Muscle-Wert und Bone Rotation. Nur habe ich diese leider noch nicht gefunden  😔...

Idee?

Ziel.png

BoneMuscle.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

Aaah, ich denke, ich verstehe jetzt, was du möchtest. Ich wusste tatsächlich nicht, dass Unity Muskelanimationen kann, indem es diese verschiedenen Muskelbewegungen speichert. So beim Nachdenken ergibt das aber irgendwie Sinn, um vernünftiges Retargeting zu machen.

Ich glaube, mit dem Mapping von Bones auf Muskeln kommst du nicht sonderlich weit. Ich hab mal geschaut, was es so gibt, um diese Muskelwerte auszulesen, und HumanPoseHandler scheint da das Richtige zu sein.

Da müsstest du mit dem Konstruktor ein neues Ding erstellen und da die Transform-Komponente vom Root-GO des Skeletts zusammen mit dem Avatar reinschmeißen, der (wenn ich mich nicht irre) ja diese Daten enthält, welche Muskeln wie zu welchen Knochen gehören. Danach kannst du mit GetHumanPose eine HumanPose zurückbekommen und darin dann das "muscles"-Array auslesen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...