«یا اللهُ یا رَبِّ یا حَیُّ یا قَیّوم یا ذَالجَلالِ وَ الاکرام اَسئَلُکَ بِاسمِکَ اَلعَظیم اَلاَعظَم اَن تَرزُقَنی رِزقاً حَلالاً طَیِّباً بِرَحمَتِکَ الواسِعَه یا اَرحَمَ الرّاحِمِین.»
تابع Lerp لرپ در یونیتی،تابع Slerp در unity_حرکت آرام از نقطه اول به دوم،حرکت نرم بین دو نقطه در یونیتی :: گیم اور _ بازیسازی با unity + مطالب متفرقه

گیم اور _ بازیسازی با unity + مطالب متفرقه

آموزش های علمی با اجازه ی خدا تقدیم به هرکس خدا بخواد

آموزش های علمی با اجازه ی خدا تقدیم به هرکس خدا بخواد

به نام خدا
--
گروه قدیم ما promakers.ir یا پرومیکرز بود که بالای هزار اموزش توش ساخته بودم به اسم sajjad3011 ولی حیف ادمین سایتش عوض کرد
حالا سوالی بود کاری بود این شمارمه

قدیمیا دلم براتون تنگ شده... فقط معرفی کنید توی پیامک یا تماس یاد بیارید.
اگه جواب ندادم شاید موقعیت نداشته باشم.
بگید توی پیام از بچه های پرومیکرز هستید.

---
سوالی بود بذارید
نظر خصوصی نذارید
پاسخش سخته
دوست داشتید شماره بذارید تو واتساپ یا ایتا یا .... گروه بزنیم.
09358077198

بایگانی
پیوندها

gameover.blog.ir


#یونیتی 

آموزش بردار نرمال در یونیتی /کاربرد متد نرمالایز در یونیتی/کاربرد normalize/کاربرد تابع normalize در یونیتی/حرکت به سمت مقصد توسط بردار نرمال(بردار عمود بر هدف یا بردار حرکت مستقیم به سمت هدف


تابع Lerp از کلاس Vector3 :


در شکل به وضوح می بینید اگر ما فاصله تا هدف رو 5 قسمت کنیم تابع نرمال xyz ای میده که اگر جمع کنیم با پوز فعلی، یک واحد به سمت هدف حرکت انجام میشه.


🔶 #یونیتی


نکته: بی نرمالایز هم به سمت هدف حرکت انجام میشه ولی ابتدا سرعت زیاد و وقتی به هدف نزدیک میشیم،سرعت کمه،چون تفاضل فاصله ها کم شده در speed ضرب کنیم سرعت ثابت نیست،ولی با نرمال سرعت همیشه ثابت هست. لرزش هم داریم در انتها.




🔶🔶🔶نکته ی بعدی : متد لرپ یا تابع Lerp در حرکت نرم ،نسبت به روش normalize بهتر و جدیدتر هست. اما مقایسه ما از این جهت هست که قدرت تابع لرپ تکمیل تر از نرمالایز هست. یعنی لرپ امکانات بیشتری هم داره ولی اینکه بگیم nomalize منسوخ هست نه اینکار هم نمی کنیم. فعلا اون توی جایگاه خودش بمونه ولی فقط قصد ما اثبات قدرت لرپ بود. همین(بیسواد)


مثال ساده :


Public Transform target;

void Update(){

transform.position = Vector3.Lerp(transform.position, target.position, speed  * Time.deltaTime);

}




ادامه (کاربرد تابع Lerp)

حرکت به اندازه ای که تابه لرپ نسبت به ضریب 0.1f  از مبدا t1 به مقصد t2 محاسبه می کنه.
نمی تونیم بگیم 0.1f قدر. چون کار تابع لرپ اینه که اگه پارامتر سوم 1 باشه پوزیشن t2  و اگه 0 باشه پوزیشن t1 و اگه 0.5 باشه پوزیشن بین  t1 و t2 رو برگشت می ده.





using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NORMAL : MonoBehaviour {

    public Transform t1, t2;
    float speed = 0.01f;
    void Update()
    {
        if (Input.GetKeyUp(KeyCode.A))
        {

        t1.position = Vector3.Lerp(t1.position, t2.position, 0.1f);

        }

    }
}

در این مثال با فشردن کلید A ، جسم مبدا به سمت مقصد حرکت می کنه. 
هر بار  به اندازه ای که خود تابع لرپ نسبت به ضریب 0.1f محاسبه می کنه.(دقت کنید نگفتم به طول یک، چون طول یک رو تابع نرمالایز می داد و جلو تر روش پیاده سازی نرمالایز رو با لرپ می گم )

اسکریپت رو بندازید روی هر جسمی که دوست دارید .

سپس گیم ابجکت اول  و دوم رو به ترتیب درگ کنید روی متغیر t1 و t2.

اجرا بگیرید. جسم مقصد رو جابجا کنید تا جسم مبدا بیاد دنبالش.






پیاده سازی normalized با استفاده از lerp/پیاده سازی متد نرمالایز با استفاده از متد لرپ/ساخت normalized با استفاده از Lerp/شبیه سازی تابع/متد normalized با استفاده از متد/تابع Lerp


'تمام محاسبه و کد توسط گیم اور انجام شده و کپی از جایی نیست.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NORMAL : MonoBehaviour {

    public Vector3 t1, t2;
    float speed = 0.01f;
    void Start()
    {
        t1 = new Vector3(0, 0, 0);
        t2 = new Vector3(1, 2, 2);
    
    }
    void Update()
    {
        if (Input.GetKeyUp(KeyCode.A))
        {
            Debug.Log(Vector3.Lerp(t1, t2, 1.0f/Vector3.Distance(t1,t2)));
            Debug.Log((t2-t1).normalized);
        Debug.Log("Thank u bisavad ma behet eftekhar mikonim");
        }

    }
}

دقت کنید که خروجی هر دو، برداری هست که اگر با بردار اول جمع بشه به اندازه ی یک واحد به سمت بردار دوم حرکت میشه کرد.



تابع لرپ/متد لرپ/تابع Lerp/متد Lerp  از کلاس Vector3

شکل کلی


public static Vector3 Lerp(Vector3 a, Vector3 b, float t);


خروجی:
اگر t=0 بردار a
اگر t=1 بردار b
اگر t=0.5  بردار بین a,b 

در غیر اینصورت برداری روی فاصله ی بین بردار a و b
بر گشت داده میشه.

اگه  بخوایم  تابع normalized رو با Lerp پیاده سازی کنیم باید عدد 1 رو تقسیم به فاصله ی بین دو بردار کنیم،چون یک قسمت از این فاصله رو باید بدیم تا بردار حرکت به ما تحویل داده بشه.

دوستان این نکات رو بنویسید توی دفترتون. چون هر جایی گفته نشده.



توضیحات اضافی

slerp هم مثل lerp هست. شما lerp رو درک کنید اونم یادمی گیرید.

یه اسکریپت cs با کد زیر ایجاد کنید :

//lerp.cs
using UnityEngine;
using System
public class LightLerp: MonoBehaviour
{
private Vector3 newPosition;
void Awake()
{
newPosition = transform.position;
}
void Update()
{
PositionChanging();
}

PositionChanging()
{
Vector3 positionA = new Vector3(-5,3,0);
Vector3 positionB = new Vector3(5,3,0);

if(Input.GetKeyDown(KeyCode.Q))
newPosition = positionA;

if(Input.GetKeyDown(KeyCode.E))
newPosition = positionB;

transform.posision=newPosision;
}
}

اگه کد اشتباه داشت برطرف کنید چون همشون رو از روی فیلم سایت اصلی یونیتی تایپ کردم.
یه نور نقطه ای بذارید روی صحنه(point light) . شدت نور رو کمی زیاد کنید(خصوصیت Identsity) تا روی plane به چشم بیاد. 
اسکریپت فوق رو بدید به نور(بکشید روش رها کنید).
اجرا کنید .
طبق اسکریپت اگه Q بزنیم نور به موقع positionA میره و اگه E بزنیم به نقطه ی positionB .
شما اینو اجرا کنید می تونید ببینید چی می گم.( نور جابجا میشه )

اما اصلا زیبایی خاصی نداره و فقط عمل پرش رو انجام میده و پیوسته نیست و گسسته هست.

برای اینکه نور با یک سرعت تعریف شده از نقطه ی A به نقطه ی B بره از تابع Lerp استفاده می کنیم. 

مثال شکل کلی استفاده از Lerp :
transform.position = Vector3.Lerp(transform.position, newPosition, smooth * Time.deltaTime);

تابع Lerp سه تا پارامتر می گیره :

From : از 
To: به
t : من بهش می گم time و شما هم بگید time. 
(با این که t مخفف چی هست و چی نیست یا اصلا غلط هست یا درست هم کاری نداشته باشید بذارید ما درس خودمون رو بدیم و اگه زیبا نبود بیخیالش بشید. اینم بگم خودم مقالات سایت رفرنس و سایت های ایرانی و خارجی زیادی رو مطالعه می کنم ولی مهم نیست همون time اسم گذاری کنید.)

به جای t مقدار smooth * Time.deltaTime رو بدید و به جای From و To هم متغیری از نوع بردار سه بعدی (در درس ما A و B) رو بدید.

smooth هم در بخش public(بالای برنامه) تعریف می کنید از نوع float(اعشاری).

و بعد از نسنب دادن اسکریپت به نور نقطه ای، خصوصیت smooth رو با مقدار 1 عدد بدید(اگه بیشترش کنید روان بودن و سرعت حرکت بیشتر میشه. این smooth داره در Time.deltaTime ضرب میشه و طبیعی هست دیگه هرچی بیشتر باشه سرعت زمانی حرکت نور بالا میره)

وقتی پروژه رو اجرا کنید با فشردن کلید Q و E نور به آرومی بین نقاط سه بعدی A و B تغییر موقعیت میده.

تا شما یه چایی بخورید من یاد میدم که Lerp چه کاربردهای دیگه ای داره و کجاها میشه ازش استفاده کرد.

سه مثال کاربردی از روش استفاده از تابع Lerp :

معمولا گیم ابجکت های مختلفی هستند که از تابع Lerp استفاده می کنند.

سه حالت رو مثال می زنم:

حالت اول :
کد:

transform.position = Vector3.Lerp(transform.position, newPosition, smooth * Time.deltaTime);

کد بالا رو شرح دادم.پس بیخیالش.

حالت دوم :
کد:
light.intensity = Mathf.Lerp(light.intensity, newIntensity, smooth * Time.deltaTime);

این کد باعث میشه شدت نور از حالت فعلی به حالت newIntensity بره و طبق دستوراتی که اسکریپتی که بهتون میدم میگم چیکار کنید.

حالت سوم :
کد:

light.color = Color.Lerp(light.color, newColour, smooth * Time.deltaTime);

این کد برای تغییر رنگ نور از رنگ فعلی به رنگ جدید که در متغیر newColour تعریف شده بکار می ره. تیو اسکریپت که در ادامه میارم یادتون میدم ببینید چقدر زیباست و یاد گرفتنش از روی راهنمایی من چه قدر خوبه.
-
این کلیپ بی کیفیت که من ساختم رو ببینید تا قدرت Lerp رو درک کنید :
http://s5.picofile.com/file/8153633500/clip_lerp_func_unity3d_sajjad3011.zip.html

-
حالا روش ساخت :

یه پروژه 3d ایجاد کنید با این اجزا : main Camera ، plane و Point Light

اسکریپت js زیر رو بدید به نور نقطه ای (point Light):

#pragma strict

public var smooth : float;

private var newPosition : Vector3;
private var newIntensity : float;
private var newColour : Color;


function Awake ()
{
    newPosition = transform.position;
    newIntensity = light.intensity;
    newColour = light.color;
}


function Update ()
{
    PositionChanging();
    IntensityChanging();
    ColourChanging();
}


function PositionChanging ()
{
    var positionA : Vector3 = new Vector3(-5, 3, 0);
    var positionB : Vector3 = new Vector3(5, 3, 0);
    
    if(Input.GetKeyDown(KeyCode.Q))
        newPosition = positionA;
    if(Input.GetKeyDown(KeyCode.E))
        newPosition = positionB;
    
    transform.position = Vector3.Lerp(transform.position, newPosition, smooth * Time.deltaTime);
}


function IntensityChanging ()
{
    var intensityA : float = 0.5f;
    var intensityB : float = 5f;
    
    if(Input.GetKeyDown(KeyCode.A))
        newIntensity = intensityA;
    if(Input.GetKeyDown(KeyCode.D))
        newIntensity = intensityB;
    
    light.intensity = Mathf.Lerp(light.intensity, newIntensity, smooth * Time.deltaTime);
}


function ColourChanging ()
{
    var colourA : Color = Color.red;
    var colourB : Color = Color.green;
    
    if(Input.GetKeyDown(KeyCode.Z))
        newColour = colourA;
    if(Input.GetKeyDown(KeyCode.C))
        newColour = colourB;
    
    light.color = Color.Lerp(light.color, newColour, smooth * Time.deltaTime);
}

بعد از افزودن اسکریپت فوق به نور نقطه ای، نور رو انتخاب کنید و در پنجره ی خصوصیات یا inspector پارامتر Smooth رو بدید 1 یا 2 (یه عدد غیر صفر معمولا از 1 به بالا بدید که قبلا توضیحش دادم)

اجرا کنید .
با کلید های زیر بازی کنید:
Q و E
A و D
Z و C
--
خروجی :
http://s5.picofile.com/file/8153635742/lerp_noor.jpg
می بینید چقدر زیباست ؟ دقیقا عین چشماتون happy
همین الان تست کنید و ببینید چه قدر قشنگه کار با یونیتی.
کاربرد این کد در هوش مصنوعی هم هست و دستوری به اسم (Quaternion.Slerp(From,To,Time داریم که برای درکش فقط کافیه همین Lerp ای که بالا توضیح دادم رو تست کنید و بعدش Slerp همون پارامترها رو می گیره که یه جایی به دردتون میخوره توضیحات من.
موافقین ۰ مخالفین ۰ ۹۳/۱۲/۲۶
مدیرکل

نظرات (۳)

آقا دمت گرم خیلی ممنون که توضیح دادی
خدا خیرت بده
برات آرزوی موفقیت دارم.
پاسخ:
موفق باشید.
بسیار مفید بود
پاسخ:
سپاس
سلام خسته نباشید من موقعی که یک اسکریپت #C ایجاد می کنم و کد نویسی می کنم بدون اینکه کد مشکلی داشته باشن موقع اجرا این ارور رو می ده
http://s8.picofile.com/file/8349705800/Capture.JPG
همین طور موقعی هم که یونیتی رو باز می کنم دو تا ارور پایین صفحه هست :
http://s9.picofile.com/file/8349705968/Capture3.JPG

ممنون می شم اگر کمکم کنید.

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی