चाल को याद रखना है कि कोण (कम से कम यूक्लिडियन स्थान में) 2 * पीआई द्वारा आवधिक हैं। यदि वर्तमान कोण और लक्ष्य कोण के बीच अंतर बहुत बड़ा है (अर्थात कर्सर सीमा पार कर गया है), तो वर्तमान कोण को तदनुसार 2 * pi जोड़कर या घटाकर समायोजित करें।
इस मामले में, आप निम्नलिखित प्रयास कर सकते हैं: (मैंने पहले कभी जावास्क्रिप्ट में प्रोग्राम नहीं किया है, इसलिए मेरी कोडिंग शैली को माफ़ करें।)
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;
संपादित करें : इस कार्यान्वयन में, संयुक्त के केंद्र के चारों ओर कर्सर को बहुत तेज़ी से ले जाने से यह झटका होता है। यह अभीष्ट व्यवहार है, क्योंकि संयुक्त का कोणीय वेग हमेशा आनुपातिक होता है dtheta
। यदि यह व्यवहार अवांछित है, तो संयुक्त के कोणीय त्वरण पर कैप लगाकर समस्या को आसानी से ठीक किया जा सकता है।
ऐसा करने के लिए, हमें संयुक्त वेग पर नज़र रखने और अधिकतम त्वरण लगाने की आवश्यकता होगी:
joint = {
// snip
velocity: 0,
maxAccel: 0.01
},
फिर, अपनी सुविधा के लिए, हम एक क्लिपिंग फंक्शन शुरू करेंगे:
function clip(x, min, max) {
return x < min ? min : x > max ? max : x
}
अब, हमारा आंदोलन कोड इस तरह दिखता है। पहले, हम dtheta
पहले की तरह गणना करते हैं, आवश्यकतानुसार समायोजित joint.angle
करते हैं:
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;
फिर, संयुक्त को तुरंत स्थानांतरित करने के बजाय, हम एक लक्ष्य वेग की गणना करते हैं और clip
इसे हमारी स्वीकार्य सीमा के भीतर बल देने के लिए उपयोग करते हैं।
var targetVel = ( joint.targetAngle - joint.angle ) * joint.easing;
joint.velocity = clip(targetVel,
joint.velocity - joint.maxAccel,
joint.velocity + joint.maxAccel);
joint.angle += joint.velocity;
यह केवल एक आयाम में गणना करते समय, दिशाओं को बदलते हुए भी सुचारू गति पैदा करता है। इसके अलावा, यह संयुक्त के वेग और त्वरण को स्वतंत्र रूप से समायोजित करने की अनुमति देता है। यहां देखें डेमो: http://codepen.io/anon/pen/HGnDF/