इसका जवाब भी देखिए ।
उपयोग करने के दो सामान्य तरीके हैं 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 बहुत बेहतर है, इसलिए यह आमतौर पर एक सुरक्षित प्रतिस्थापन है।