Jump to content
Unity Insider Forum

L.Tester

Members
  • Content Count

    7
  • Joined

  • Last visited

  • Days Won

    1

L.Tester last won the day on October 26 2015

L.Tester had the most liked content!

Community Reputation

2 Neutral

About L.Tester

  • Rank
    Newbie

Recent Profile Visitors

384 profile views
  1. Hallo Forum, hier der ThreadStarter, So viele Wochenenden - und dann brachte eine entscheidende Zeile Code innerhalb einer halben Stunde das Ergebnis. Wer es brauchen kann, hoffentlich hat der Mann mit dem Hut nicht so viel zu meckern: using UnityEngine; /* Führt durch die Überlagerung von RotationDeltaSoll beziehungsweise über den smoothen Wert RotationDeltaLast ein Transform einem Target nach. Der Wert von RotationDeltaSoll wird anhand des Hilfsobjektes Eyes berechnet, welches korrekt ausgerichtet und dem Transform untergeordnet ist. Dadurch ist es nicht notwendig, daß das Transform bezüglich Vorne/Oben korrekt ausgerichtet ist. Benutzt wird die Unity-Funktion Quaternion.LookRotatin. */ public class LookAt1 : MonoBehaviour { public Transform NeckJoint; public Transform Eyes; public Transform Target; public bool Clamped; public float MaxY_Deg; public float MaxX_Deg; public float Acceleration; private Quaternion rotationDeltaLast; private void LateUpdate() { Quaternion RotationDeltasoll = MyLookAtDelta(Eyes, Target, Vector3.up); Vector3 v3 = RotationDeltasoll.eulerAngles; v3.y = MyClamp(v3.y, MaxY_Deg); v3.x = MyClamp(v3.x, MaxX_Deg); RotationDeltasoll.eulerAngles = v3; rotationDeltaLast = Quaternion.LerpUnclamped(rotationDeltaLast, RotationDeltasoll, Acceleration); NeckJoint.rotation = rotationDeltaLast * NeckJoint.rotation; } private float MyClamp(float f, float max) { if (f > 180) f -= 360; f = Mathf.Clamp(f, -max, max); if (Mathf.Abs(f) == max) Clamped = true; else Clamped = false; if (f < 0) f += 360; return f; } private Quaternion MyLookAtDelta(Transform correctTransform, Transform target) { return MyLookAtDelta(correctTransform, target.position - correctTransform.position, Vector3.up); } private Quaternion MyLookAtDelta(Transform correctTransform, Transform target, Vector3 up) { return MyLookAtDelta(correctTransform, target.position - correctTransform.position, up); } private Quaternion MyLookAtDelta(Transform correctTransform, Vector3 lookDirection) { return MyLookAtDelta(correctTransform, lookDirection, Vector3.up); } private Quaternion MyLookAtDelta(Transform correctTransform, Vector3 lookDirection, Vector3 up) { return Quaternion.LookRotation(lookDirection, up) * Quaternion.Inverse(correctTransform.rotation); } private Quaternion QDifference(Quaternion a, Quaternion b) { return b * Quaternion.Inverse(a); } } Ich benutze das Script in einer etwas anderen Form, für euch habe ich den Ballast raus genommen und nochmal überprüft. Ich denke, man könnte ohne das Hilfsobjekt auskommen, aber ich will endlich weiterkommen, und da es funktioniert ... Gruß von Lutz.
  2. N'Abend Forum, hier der ThreadStarter. Wenn man bedenkt, das dieses Problem nur ein "klitzekleines" Hindernis sein sollte, welches ich "mal eben" lösen wollte .... Also, eine komplette Lösung gibt es noch nicht, dazu hatte ich an diesem Wochenende auch zu wenig Zeit. ABER, ein Teilerfolg: Ein Problem ist ja, das ich eine Rotations-ÄNDERUNG brauche. Das entspricht also Rotation2 - Rotation1 bzw. Quaternion2 - Quaternion1. private Quaternion QDifference(Quaternion a, Quaternion b) { return Quaternion.Inverse(a) * b; } Ich glaube, da muss ich noch ein wenig umstellen, denn in LateUpdate() musste ich auch noch was umstellen, das könnte sonst zu Verwirrung führen. Hier habe ich nur schnell getestet ob das Teilproblem so gelöst werden kann : private void LateUpdate() { //eyes + neckJoint haben die selbe Position Vector3 lookDirectionWorld = target.position - eyes.position; Vector3 fromVector = eyes.forward; Vector3 toVector = lookDirectionWorld; Quaternion rotation1 = Quaternion.LookRotation(lookDirectionWorld, Vector3.up); Quaternion rotation2 = QDifference(neckJoint.rotation, rotation1); neckJoint.rotation = neckJoint.rotation * rotation2; Debug.DrawRay(eyes.position, eyes.forward * 31, Color.cyan); } Klappt! Ich werde jetzt Schluss machen, nächste Woche geht es weiter. Ich denke, ihr könnt euch zurücklehnen und warten, der Rest sollte doch ein Klacks sein ... Gruß von Lutz. Hallo @malzbie, oder auf Youtube: @MrMalzbie, ich habe Dein Video nebenbei laufen lassen : Nein, ich benutze kein Humanoid-Animation-System. Ich glaube, ich könnte es ähnlich wie Du über OnAnimatorIK() lösen. Jetzt möchte ich aber erstmal bei der Manipulation der Animation in LateUpdate() bleiben. Ich glaube, das ich damit auskomme: Ausserdem: Ich lerne auch noch, mit Quaternions umzugehen - zumindest im Rahmen von Unity, die mathematischen Grundlagen überfordern mich etwas.
  3. Guten Morgen Forum, Gegeben ist ein Modell mit Animation, an welchem ich keine Grundsätzlichen Änderungen vornehmen kann. Das Modell hat ein "Halsgelenk", das ich in LateUpdate ausrichten möchte. Natürlich und leider ist bei dem Halsgelenk "Oben" nicht (0,1,0) und "Vorne" nicht (0,0,1), sondern (irgendwas). Weiter wird das Modell in alle Richtungen gedreht werden, "Oben" ist dann immer Modell.transform.up. Die Animation bewegt vom "Halsgelenk" aus gesehen eine Hierachie von Eltern-Joints Das Ausrichten soll nicht über eine absolute Rotation erfolgen, sondern über ... delta R, heißt das so? Eine Rotations-Änderung. Als Hilfselement habe ich ein Gameobject unter das "Halsgelenk" eingefügt, das manierlich nach vorne schaut und den Kopf hoch hält - bildlich gesprochen. Unten angefügt ist meine bisherige "LateUpdate", die leider keinen "Up"-Vektor berücksichtigt. Meine Suchbegriffe, eigentlich ganz ergiebig, aber dennoch ... lookat, forward, up, quaternion, convert, transform Mein Problem ist, das ich keine der im Netz angebotenen Lösungswege zum laufen bekomme: Die Vorschläge über localRotation, InverseTransformDirection bzw. TransformDirection drehen bei mir um die falschen Achsen, die Matrix-Lösung bekomme ich nicht mal ansatzweise in Unity implementiert, die Lösungen über das Kreuzprodukt Jittern beziehungsweise nähern sich nur iterativ dem Ziel. Es gibt einfach zu viele Möglichkeiten, etwas falsch zu machen wenn man keine Ahnung hat - zumal ich nicht immer weiß, was "unter der Haube" abläuft. Ich bin an einem Punkt angekommen, an dem ich sehr kleinlaut um einen funktionierenden Code bitten muss. Bitte, kann mir jemand hier weiterhelfen? So soll es später aussehen, nur mit der Berücksichtigung von "Oben": private void LateUpdate() { //eyes + neckJoint haben die selbe Position Vector3 lookDirectionWorld = target.position - eyes.position; Vector3 fromVector = eyes.forward; Vector3 toVector = lookDirectionWorld; Quaternion rotation = Quaternion.FromToRotation(fromVector, toVector); neckJoint.rotation = rotation * neckJoint.rotation; Debug.DrawRay(eyes.position, eyes.forward * 31, Color.cyan); } Gruß von Lutz
  4. Hallo Forum, ich bin bereits seit einigen Jahren in diesem Forum angemeldet. Damals hatte ich hier die eine oder andere Frage gestellt, ohne allerdings eine Resonanz zu erhalten. Als ich die Beiträge jetzt erneut durchgelesen habe, habe ich erst selber nicht mehr so genau verstanden, was ich eigentlich wollte. Das wird sich auch wahrscheinlich auch in zukünftigen Beiträgen nicht wesentlich ändern, aber wer weiß ... Ich komme zu Unity von der technischen/physikalischen/mathematischen Seite. Außerhalb von Unity programmiere ich ausschließlich für mich alleine und fast ausschließlich speziell für einzelne Projekte. Das bedeutet, außer mir schaut eigentlich NIE jemand auf meinen Code und mein Code wird NIE wiederverwendet, so etwas wie Code-Bibliotheken ist mir völlig fremd und wenn das Projekt abgeschlossen ist kann der Quelltext gelöscht werden. Programmieren gelernt habe ich nicht, ich würde eher sagen, ich habe es mir angeeignet. Begonnen habe ich damals mit Turbo Pascal (zum Spaß), für Mikrocontroller benutze ich C und Assembler, UNIX und Derivate mit Python, aber Android mit Java, Webseiten in Javascript und PHP, Windows C#. Ich sage euch, ich komme STÄNDIG durcheinander, ohne eine gute IDE bin ich aufgeschmissen! Mit Unity mache ich Sachen tatsächlich nur zum Spaß, ich denke, so wie andere abends häckeln. Mir gefällt die Möglichkeit die mir Unity bietet, Interaktionen zu visualisieren und scheinbar komplexe Erscheinungen der Realität auf wenige Parameter beschränkt auf dem Bildschirm nachzubilden und darzustellen. Ich glaube, mein erstes Programm beschäftigte sich mit Apfelmännchen. Genau wie häckeln ist am Computer sitzen schlecht für die Augen und den Rücken, deswegen mache ich so viel wie möglich auf einem Schmierblatt in der bequemst möglichen Position, setze mich dann erst an den Computer, tippe und die Sache läuft ... sollte sie jedenfalls. Ich sitze jetzt schon eine Weile an einem Problem, das mich wirklich kirre macht. Ich fange schon an, wild meinen Programmcode zu bearbeiten in der Hoffnung, das durch ein Zufallselement der richtige Code dabei rauskommt. Dazu gibt es demnächst wohl eine Frage im Forum - ich hoffe, kurz, knapp und präzise formuliert. Nichts was mir wirklich liegt, aber für euch probiere ich das mal. Gruß von Lutz. Nachtrag: Ich beschäftige mich eigentlich nur an Wochenenden mit Unity; und das auch eher unregelmäßig. Ich kann mit den prompten Reaktionen hier im Forum nicht mithalten - wenn es mal schnell gehen soll: schreibt mir eine Karte.
  5. Hallo Forum, Vielleicht schaut ihr euch zusätzlich mein angefügtes Bild an: Im Scene-Fenster zeigt Unity zusammen mit den Abmessungen des NavMeshAgent verschiedene Pfeile an. Blau und Rot entsprechen .velocity beziehungsweise .desiredVelocity. Aber was stellt der graue Pfeil dar? Ich würde gerne einen Blick in den Quelltext des Gizmos zum NavMeshAgent werfen, habe ich den auf der Festplatte oder finde ich den irgendwo im Netz? Ich habe zwar eine Vermutung, wie dieser zustande kommt, aber in diesem Fall würde ich es gerne genau wissen. Ich wäre euch sehr dankbar, wenn ihr mir da ein paar Quellen nennen könntet. Gruß Lutz. Ich bin mit meinen eigenen Farben beim Testen durcheinander gekommen, also grau ist .velocity, blau ist .desiredVelocity und rot wahrscheinlich steeringTarget, das ist für mich nicht mehr so wichtig. Es bleibt die Frage, ob ich den Quelltext irgendwo einsehen kann. Weil ich mir in der Vergangenheit diese Frage schon öfter gestellt habe, wäre es trotzdem schön wenn mir hier jemand auf die Sprünge helfen könnte.
  6. Guten Abend Forum, Ich hatte nun Gelegenheit, mit meinem Modell ein wenig zu experimentieren. Trotz der Warnmeldungen habe ich keine Probleme beim Ansprechen des Modells. Weiter habe ich im Assetstore doch noch Modelle mit RootMotion gefunden, die in meiner Unity Version ebenfalls Warnmeldungen anzeigen. Es scheint sich dabei nicht um einen Fehler meinerseits zu handeln. Ich werde die Warnmeldungen in Zukunft einfach ignorieren. Gruß von lutz
  7. Guten Morgen Forum, Ab und zu verwende ich Unity, um meine Kinder mit einem an unsere Umgebung angepassten 3D-Spiel zu erheitern. (Haus,Garten usw). Jetzt wollte ich das Ganze steigern und eine in Maya erstellte und animierte (auch real existierende) Figur einbringen. Dazu benutze ich eine FBX-Datei mit Objekt, Knochen und Animationen, die in Maya mit dem GameExporter erstellt wird und in Unity in den Assetordner kopiert wird. Bei den Animationen um die es hier jetzt geht handelt es sich um Loops, die bei fortgesetzter Dauer eine Kurve ergeben. So etwas wie "walk_left". Zum Vergleich nehme ich aus den Standard-Assets den "thirdPersonCharacter". Leider ist der vom Typ "Human", aber ein Generic-Modell mit Root-Animation habe ich nicht finden können. Maya 2016 Unity 5.2.1 Verwende ich folgende Informationen http://docs.unity3d....RootMotion.html http://docs.unity3d....ortedClips.html http://docs.unity3d....Animations.html dann importiere ich mit folgenden Einstellungen: FBX Import Settings Rig:: Animation Type -> Generic Root node -> Der Knoten, der den "Schwerpunkt" darstellt und intern bei Überblendungen benutzt wird FBX Import Settings Animations:: (Auswahl) Loop Time -> X Loop Pose-> X Motion->Root Motion Node -> Der Knoten. der die Bewegungen für die RootMotion enthält. Die Animationen spielen auf den ersten Blick richtig ab. Meine Objekte laufen mit RootMotion über das Terrain. Im Vorschaufenster bleibt der Kreis unter meinem Objekt, der blaue Pfeil zeigt in die Bewegungsrichtung. Der rote Pfeil zeigt aber beharrlich in die globale Z-Achse, das ist beim "thirdPersonCharacter" anders. Ein kleines Koordinatenkreuz bleibt im Ursprung, dreht sich aber mit meinem Objekt mit. Beim "thirdPersonCharacter" ist das anders, dort bleibt das kleine Koordinatenkreuz unter dem Character. Im "Animation Window" habe ich vier Warnmeldungen: Animator.Motion Q Missing/Animator.Motion T Missing/Animator.Root Q Missing/Animator.Root T Missing/ Gehe ich nach den Anleitungen im Netz vor, dann benutze ich folgende Importeinstellungen: FBX Import Settings Rig:: Animation Type -> Generic Root node -> Der Knoten. der die Bewegungen für die RootMotion enthält. FBX Import Settings Animations:: (Auswahl) Loop Time -> X Loop Pose-> X Motion->Root Motion Node -> <None> Genau wie oben, aber nur noch mit zwei Warnmeldungen im "Animation Window". Animator.Root Q Missing/Animator.Root T Missing/ Ich befürchte, das ich aufgrund mangelnden Verständnisses einen Fehler gemacht habe, der mir später beim Scripten oder Navigieren Das Leben schwer machen wird - aber vielleicht muss das auch alles so sein?? Es wäre gut, wenn ich das in diesem Stadium schon wüsste. Wenn sich jemand meines Problems annimmt, so ist ihm mein Dank gewiss! Gruß von Lutz.
×
×
  • Create New...