Ich schreibe meine eigene Inverse Kinematics und arbeite derzeit an gemeinsamen Einschränkungen. Es ist in Ordnung, aber ich möchte alle Diskontinuitäten aus der resultierenden Animation entfernen, und Einschränkungen sind das größte Problem.Klemmwinkel mit kontinuierlichem Ergebnis
Nehmen wir zum Beispiel an, Sie betrachten einen Ball, der sich um Ihren Kopf dreht. Es dreht sich nach rechts und Sie sehen nach rechts, bis zu Ihrem Hals Verdrehungsgrenze. Der Ball bewegt sich immer noch und wenn er an deinem Rücken vorbeikommt, wird dein Kopf plötzlich gegen das gegnerische Limit geklickt, nach links schauend. Das bekommen wir mit einer typischen Klemmung und es gibt mir eine Diskontinuität von Bild zu Bild.
Was ich brauche, ist, dass Ihr Kopf während weniger Frames von rechts nach links kommt. Meine erste Idee ist es, die Quellrichtung mit meiner X-Achse (zwischen den Schultern) zu reflektieren, und wenn die reflektierte Richtung Grenzbedingungen erfüllt - gebe sie zurück. Wenn die Grenzwerte nicht eingehalten werden, klemmen Sie die reflektierte Richtung statt der Quelle.
Das sollte mir die nette und kontinuierliche Bewegung geben und es ist keine Raketenwissenschaft, aber es gibt eine Menge von Details zu kümmern. Meine Grenzen können wie min < max
sein, aber auch max < min
, sie können den Schaltwinkelwert durchlaufen (wie 360->0
oder 180->-180
) oder nicht. Wenn mein zulässiger Bereich größer als 180 Grad ist, sollte die Logik etwas anders sein.
Die Menge der verschiedenen Fälle baut sich sehr schnell auf, also frage ich mich, ob ich es irgendwo schon finden könnte?
BTW: Ich benutze Unreal-Engine, wenn es einen Unterschied macht.
EDIT:
Es tut mir Leid, wenn ich Sie mit meinem Kopf Beispiel verfehlt habe - es war nur eine Analogie meine Bedürfnisse zu visualisieren. Ich werde diesen Code nicht verwenden, um einen Kopfknochen (oder irgendeinen anderen) in einer letzten Animation zu orientieren. Ich plane, es als eine sehr grundlegende Operation zu verwenden, IK zu lösen. Es wird in jeder Iteration in jeder IK-Kette verwendet, für jeden Knochen viele Male. Also muss es so schnell wie möglich sein. Alle Konzepte auf höherer Ebene, wie Bewegungsplanung, Dynamik usw., werden bei Bedarf auf einer anderen Ebene hinzugefügt.
Vorerst Ich frage nur für eine Funktion wie:
float clampAngle(float angle, float min, float max)
, die einen kontinuierlichen Wert für die Änderung Eingänge zurückkehren würde.
Ich arbeite gerade an verschiedenen Problemen, aber ich poste meinen Code, wenn ich auf diesen zurückkomme.
Clipping an sich ist nicht ausreichend, müssen Sie eine Rotation von + Clip zu -clip über den Verlauf von mehreren Frames – Alnitak
@Alnitak Ich möchte keine Planung hinzufügen, weil ich nicht die Zukunft kenne . Ich brauche es so einfach wie möglich, aber mit kontinuierlicher Ausgabe. Ich denke, dass meine Beschreibung das tun wird, ich muss es nur codieren :). – kolenda
Ich würde wählen, Kopf Rotation auf eine maximale Änderung des Winkels für jedes Update zu beschränken. Wenn der Ball den mittleren Punkt hinter dem Kopf passiert, anstatt den Blick sofort von der rechten Begrenzung zur linken Begrenzung in einem großen Sprung zu bewegen, bewege dich in diese Richtung, aber niemals mehr als dein gewählter maximaler Winkel.Dies wird natürlicher und spiegelt auch realistische dynamische Einschränkungen wider. Was du beschreibst klingt seltsam, der Blick folgt einem Bild, das nicht wirklich existiert. –