Der Trick besteht darin, sich daran zu erinnern, dass die Winkel (zumindest im euklidischen Raum) um 2 * pi periodisch sind. Wenn der Unterschied zwischen dem aktuellen Winkel und dem Zielwinkel zu groß ist (dh der Cursor hat die Grenze überschritten), passen Sie den aktuellen Winkel einfach an, indem Sie 2 * pi entsprechend addieren oder subtrahieren.
In diesem Fall können Sie Folgendes versuchen: (Ich habe noch nie in Javascript programmiert. Verzeihen Sie also meinen Codierungsstil.)
var dtheta = joint.targetAngle - joint.angle;
if (dtheta > Math.PI) joint.angle += 2*Math.PI;
else if (dtheta < -Math.PI) joint.angle -= 2*Math.PI;
joint.angle += ( joint.targetAngle - joint.angle ) * joint.easing;
BEARBEITEN : In dieser Implementierung ruckelt der Cursor, wenn er zu schnell um die Gelenkmitte bewegt wird. Dies ist das beabsichtigte Verhalten, da die Winkelgeschwindigkeit des Gelenks immer proportional ist dtheta
. Wenn dieses Verhalten unerwünscht ist, kann das Problem leicht behoben werden, indem eine Kappe auf die Winkelbeschleunigung des Gelenks aufgesetzt wird.
Dazu müssen wir die Geschwindigkeit des Gelenks verfolgen und eine maximale Beschleunigung auferlegen:
joint = {
// snip
velocity: 0,
maxAccel: 0.01
},
Aus praktischen Gründen führen wir eine Clipping-Funktion ein:
function clip(x, min, max) {
return x < min ? min : x > max ? max : x
}
Unser Bewegungscode sieht nun so aus. Zuerst berechnen wir dtheta
wie zuvor und passen joint.angle
nach Bedarf an:
var dtheta = joint.targetAngle - joint.angle;
if (dtheta > Math.PI) joint.angle += 2*Math.PI;
else if (dtheta < -Math.PI) joint.angle -= 2*Math.PI;
Anstatt das Gelenk sofort zu bewegen, berechnen wir eine Zielgeschwindigkeit und clip
erzwingen sie innerhalb unseres akzeptablen Bereichs.
var targetVel = ( joint.targetAngle - joint.angle ) * joint.easing;
joint.velocity = clip(targetVel,
joint.velocity - joint.maxAccel,
joint.velocity + joint.maxAccel);
joint.angle += joint.velocity;
Dies erzeugt eine gleichmäßige Bewegung, selbst wenn die Richtung geändert wird, während Berechnungen in nur einer Dimension ausgeführt werden. Darüber hinaus können Geschwindigkeit und Beschleunigung des Gelenks unabhängig voneinander eingestellt werden. Sehen Sie die Demo hier: http://codepen.io/anon/pen/HGnDF/