इसका जवाब भी देखिए ।
उपयोग करने के दो सामान्य तरीके हैं Lerp:
1. एक शुरुआत और एक अंत के बीच रैखिक सम्मिश्रण
progress = Mathf.Clamp01(progress + speedPerTick);
current = Mathf.Lerp(start, end, progress);
यह वह संस्करण है जिससे आप संभवतः सबसे अधिक परिचित हैं।
2. एक लक्ष्य की ओर घातीय आसानी
current = Mathf.Lerp(current, target, sharpnessPerTick);
ध्यान दें कि इस संस्करण में currentमूल्य आउटपुट और इनपुट दोनों के रूप में प्रकट होता है । यह startचर को विस्थापित करता है, इसलिए हम हमेशा उस जगह से शुरू कर रहे हैं जहां से हम आखिरी अपडेट पर गए थे। यह वह है जो Lerpमेमोरी के इस संस्करण को एक फ्रेम से अगले तक देता है। इस गतिमान शुरुआती बिंदु से, हम फिर targetएक sharpnessपैरामीटर द्वारा तय की गई दूरी का एक अंश स्थानांतरित करते हैं ।
यह पैरामीटर अब काफी "गति" नहीं है, क्योंकि हम एक ज़ेनो-जैसे फैशन में लक्ष्य तक पहुंचते हैं । यदि sharpnessPerTickथे 0.5, तो पहले अद्यतन पर हम अपने लक्ष्य से आधे रास्ते पर चले गए। फिर अगले अपडेट पर हम शेष बची हुई आधी दूरी (इसलिए हमारी प्रारंभिक दूरी का एक चौथाई) को स्थानांतरित करेंगे। फिर अगले पर हम फिर से आधा आगे बढ़ेंगे ...
यह एक "घातीय सहजता" प्रदान करता है, जहां लक्ष्य से दूर होने पर गति तेज होती है और धीरे-धीरे धीमी हो जाती है क्योंकि यह asymptotically के पास पहुंचती है (हालांकि अनंत-सटीक संख्याओं के साथ यह अपडेट के किसी भी परिमित संख्या में कभी नहीं पहुंचेगा - हमारे उद्देश्यों के लिए करीब हो जाता है)। यह एक चलती लक्ष्य मान का पीछा करने के लिए, या " एक्सपोनेंशियल मूविंग एवरेज " का उपयोग करके एक शोर इनपुट को चौरसाई करने के लिए बहुत अच्छा है, आमतौर पर 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यह लगभग अविभाज्य परिणाम देगा और यह सस्ता है। ;) मातृत्व की तुलना में Quaternions lerp बहुत बेहतर है, इसलिए यह आमतौर पर एक सुरक्षित प्रतिस्थापन है।