এই উত্তরটি দেখুন ।
ব্যবহারের দুটি সাধারণ উপায় রয়েছে Lerp
:
1. একটি শুরু এবং শেষের মধ্যে রৈখিক মিশ্রণ
progress = Mathf.Clamp01(progress + speedPerTick);
current = Mathf.Lerp(start, end, progress);
এটি সম্ভবত আপনি সবচেয়ে পরিচিত সংস্করণ।
২. লক্ষ্যের দিকে ক্ষতিকারক স্বাচ্ছন্দ্য
current = Mathf.Lerp(current, target, sharpnessPerTick);
নোট করুন যে এই সংস্করণে current
মান আউটপুট এবং একটি ইনপুট উভয় হিসাবে প্রদর্শিত হবে । এটি start
ভেরিয়েবলটি স্থানান্তর করে , তাই সর্বদা আমরা সর্বশেষ আপডেটে যেখানেই চলেছি সেখান থেকে শুরু করি। এটি Lerp
একটি ফ্রেম থেকে পরের মেমরির এই সংস্করণটি দেয় । এই চলমান সূচনা বিন্দু থেকে আমরা তারপরে target
একটি sharpness
পরামিতি দ্বারা নির্ধারিত দূরত্বের একটি ভগ্নাংশটি সরিয়ে নিই ।
এই প্যারামিটারটি আর কোনও "গতি" নয়, কারণ আমরা একটি জেনোর মতো ফ্যাশনে লক্ষ্যটির কাছে যাই । তাহলে sharpnessPerTick
ছিল 0.5
, তারপর প্রথম আপডেটে আমরা halfway আমাদের লক্ষ্য থেকে সরানো চাই। তারপরে পরবর্তী আপডেটে আমরা বাকি দূরত্বের অর্ধেক (আমাদের প্রাথমিক দূরত্বের এক চতুর্থাংশ) সরিয়ে নিয়ে যাব। তার পরের দিকে আমরা আবার অর্ধেক স্থানান্তর করব ...
এটি একটি "তাত্পর্যপূর্ণ স্বাচ্ছন্দ্য" দেয় যেখানে লক্ষ্য থেকে দূরে যখন আন্দোলনটি দ্রুত হয় এবং ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে বেড়ে যায় y যথেষ্ট কাছাকাছি পায়)। এটা একটা চলন্ত লক্ষ্য মান পশ্চাদ্ধাবন, অথবা ব্যবহার করে একটি সশব্দ ইনপুট মসৃণকরণ জন্য দারুণ একটি " গড় চলন্ত সূচকীয় সাধারণত একটি খুব ছোট ব্যবহার করে," sharpnessPerTick
মত পরামিতি 0.1
বা ছোট করা হয়েছে।
তবে আপনি ঠিক বলেছেন, আপনার লিঙ্কিত উত্তোলিত উত্তরের একটি ত্রুটি রয়েছে। এটি deltaTime
সঠিক উপায়ে সংশোধন করছে না । এই স্টাইলটি ব্যবহার করার সময় এটি একটি খুব সাধারণ ভুল Lerp
।
প্রথম স্টাইলটি Lerp
রৈখিক, সুতরাং আমরা গুনাগুণ দ্বারা গতি রৈখিকভাবে সামঞ্জস্য করতে পারি deltaTime
:
progress = Mathf.Clamp01(progress + speedPerSecond * Time.deltaTime);
// or progress = Mathf.Clamp01(progress + Time.deltaTime / durationSeconds);
current = Mathf.Lerp(start, end, progress);
তবে আমাদের ক্ষতিকারক সহজকরণটি অ-রৈখিক , সুতরাং কেবলমাত্র আমাদের sharpness
পরামিতিগুলি দ্বারা গুণ করা deltaTime
সঠিক সময় সংশোধন দেয় না। এটি যদি আমাদের ফ্রেমরেট ওঠানামা করে তবে আপনি যদি ধারাবাহিকভাবে 30 থেকে 60 এ যান তবে হালকা তীক্ষ্ণতায় পরিবর্তন হলে আন্দোলনে বিচারক হিসাবে এটি প্রদর্শিত হবে।
পরিবর্তে আমাদের তাত্পর্যপূর্ণ স্বাচ্ছন্দ্যের জন্য আমাদের একটি সূচকীয় সংশোধন প্রয়োগ করতে হবে:
blend = 1f - Mathf.Pow(1f - sharpness, Time.deltaTime * referenceFramerate);
current = Mathf.Lerp(current, target, blend);
এখানে সময় referenceFramerate
ঠিক করার আগে আমরা যেমন 30
ইউনিটগুলি ব্যবহার sharpness
করেছিলাম ঠিক তেমনই তার জন্য ইউনিট রাখার মত এখানে একটি ধ্রুবক ।
এই কোডটিতে অন্য একটি তর্কযোগ্য ত্রুটি রয়েছে, যা ব্যবহার করছে Slerp
- যখন আমরা পুরো আন্দোলনের মধ্য দিয়ে ঘূর্ণনটির যথাযথ ধারাবাহিক হার চাই তখন গোলাকার লিনিয়ার আন্তঃসম্পাদন কার্যকর হয়। তবে যদি আমরা যাইহোক কোনও অ-রৈখিক তাত্পর্যপূর্ণ স্বাচ্ছন্দ্য ব্যবহার করতে চলেছি তবে Lerp
একটি প্রায় অবিসংবাদিত ফলাফল দেবে এবং এটি সস্তা। ;) ম্যাট্রিকেসের চেয়ে কোয়ার্টারিয়নগুলি আরও ভাল লিটার হয়, তাই এটি সাধারণত একটি নিরাপদ প্রতিস্থাপন।