تکه کد پیش رو کدی هست برای محاسبه موقعیت پیش روی  شیئی که با یک شتاب(Velocity) و موقعیت(position) مشخص داره به یک سمت حرکت میکنه.یعنی متوجه شیم که اگه با همین شتاب پیش بره بعد گذشت این مقدار زمان به کجا میرسه.

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

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

فرمول

فرمول به زبان خودمونی: موقعیت فعلی شی + شتابی که داره(مثلا 2 تا توی محور z و 0 تا توی x و y یعنی به سمت z داره مستقیم حرکت میکنه) ضربدر زمانی که مد نظر داریم تا پیشبینی شه مثلا دو ثانیه،یعنی ببینیم دو ثانیه دیگه کجا میره

r0​+v * t

r0 : موقعیت اولیه شی

v:مقدار شتاب شتاب ثابت شی

t:زمانی که قصد پیشبینی دارید ببینید شی در آن زمان کجاست،مثلا 2 ثانیه بعد

 

نمونه کد

نمونه کد برای انجین یونیتی به زبان سی شارپ، با این فرض که شی مورد نظر با کمک کامپوننت RigidBody فیزیک داره و با شتاب(Velocity) مشخصی در حال حرکته

using UnityEngine;

 

public class FuturePositionPrediction : MonoBehaviour

{

public Vector3 velo; // The constant velocity vector

public Vector3 currentPos; // The current position of the GameObject

public float predictionTime; // The time in seconds for future position prediction

 

private void Update()

{

// Calculate the future position

Vector3 futurePosition = PredictFuturePosition(velo, currentPos, predictionTime);

 

// Update the GameObject's position

transform.position = futurePosition;

}

 

// Function to predict the future position

Vector3 PredictFuturePosition(Vector3 velocity, Vector3 initialPosition, float time)

{

return initialPosition + velocity * time;

}

}

 

 

velo : متغیری که شتاب شی مورد نظر رو توی هر لحظه داخل خودش نگه میداره،میتونیم این رو از طریق کد آپدیت کنیم

currentPos : موقعیت فعلی شی مورد نظر

predictionTime : زمانی که میخواییم پیشبینی براش انجام بشه

این سه متغیر باید بصورت کد یا رفرنس استفاده بشن،مثلا شتاب میتونه از ریجیدبادی گیم آبجکت مورد نظر گرفته شه و همچنین موقعیت فعلیش از کامپوننت Transform اون گرفته بشه.

 

پایان.

 

اگر سوالی بود درخدمتم 🙂