কৌশলটি মনে রাখতে হবে যে কোণগুলি (কমপক্ষে ইউক্লিডিয়ান স্পেসে) 2 * পিআই দ্বারা পর্যায়ক্রমিক হয়। যদি বর্তমান কোণ এবং লক্ষ্য কোণগুলির মধ্যে পার্থক্য খুব বেশি হয় (যেমন কার্সারটি সীমানা অতিক্রম করেছে), কেবল সেই অনুযায়ী 2 * পাই যোগ বা বিয়োগ করে বর্তমান কোণটি সামঞ্জস্য করুন।
এই ক্ষেত্রে, আপনি নিম্নলিখিতগুলি চেষ্টা করতে পারেন: (আমি জাভাস্ক্রিপ্টে এর আগে কখনও প্রোগ্রাম করি নি, তাই আমার কোডিং শৈলীটি ক্ষমা করুন))
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/