ویرگول
ورودثبت نام
mohmehdi
mohmehdihttps://itch.io/profile/mohmehdi
mohmehdi
mohmehdi
خواندن ۳ دقیقه·۷ سال پیش

Inside the mind of a sniper

داخل مغز یه اسنایپر چه اتفاقی میافته !

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

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

اما اسنایپر آدمه!

پیاده سازیش برا کامپیوتر:

MRI from a sniper brain
MRI from a sniper brain

همه ی متغیر ها به غیر از s بردار هستن

از نقطه p میخایم تیر ها رو که اندازه سرعتشون s هست اما جهتشو نمیدونیم چیز کنیم.

نقطه q هدف هست که داره با سرعت v که اندازه v ثابت هست حرکت میکنه.

نقطه برخورد که نمیدونیم کجاست رو اسمشو میزاریم h.

نقطه h کلید حل مساله هست چون ( البته کلید فاصله ی h تا p هست خود h دسته کلیده)

h = q + vt

ینی به صورت برداری نقطه h میشه مختصات اولیه q + سرعت نقطه q در زمان

اگه طرفدار فیزیک نیستید مث من یا اگه تموجه نشدید مث من اینو بخونید

تو یه بعد اگه مکان اولیه 1 باشه و سرعت هم 1 باشه تو زمان 2 ما کجاییم؟ 3
تو دو بعد اگه مکان اولیه (0,0) باشه و سرعت (1,1) تو زمان 2 کجاییم؟ (2،2)
سه بعدشم یه ویرگول بیشتر داره ( همیشه ساده سازی و مثال بکنید البته این مورد زیادی بدیهی بود)

خب حالا اندازه ی :

p-h

میشه فاصله نقطه p تا h دیگه !

این اندازه یه طور دیگم به دست میاد دقت کنید اندازه نه مختصات:( که ینی چقد از نقطه p دور شدیم)

st

در واقع یه دایره یا کره حول نقطه p در نظر بگیرید پوسته ی اون کره میشه تمام مختصات هایی که فاصلشون تا p میشه st . نقطه مشترک این کره و مسیر q که کره بر حسب t بزرگ میشه ، میشه نقطه h خودمون .این جمله رو نشنیده بگیرید :)

دو معادله یه مجهول:

| p - h | = st

دو طرف به توان دو و اینور اونور و اینا : توان دو بردار میشه همون Dot product (ضرب نقطه ای)

q + vt - p = st ,w = q-p
w + vt = st
(w.w) + (v.v * t^2) + 2t (w.v) = s^2 t^2
معادله درجه 2 که
Ax^2 + Bx + C = 0
A = v.v - s^2 , B = 2w.v , C = w.w ---> x=t

از این رابطه t به دست میاد که ینی میتونیم نقطه h که مجهول بود رو پیدا کنیم یا اگه خاستیم میتونیم

p - h

رو حساب کنیم و normalize یا همون یکه اَش بکنیم و در s ضربـــء اَش ، میشه بردار سرعت تیر


و اما کد

قدم دوم

خب طبیعتا دومین چیزی که نیاز داریم یچیه که معادله درجه دو حل کنه

دلتا منفی نمیشه خب جواب همیشه یه t مثبت و حقیقیه برا همین برا راحتی اون که بزرگتره رو برگردوندرندندرم ( بعد یه پست در مورد عدد غیر حقیقی که بنده خدا حقیقیه فقط اسمش گمراه کنندس شاید بزارم )

قدم اول

و میتونیم به سادگی متد LookAt رو برای transform اسلحه یا حالا هرچی صدا بزنیم متد بالا رو بندازیم توش

که target_RB به کامپوننت RiggedBody هدف وصله

و bullet_Speed هم سرعت RiggedBody تیره (اینجاش خیلی جالب نیست که به تیر همچین کامپوننتی بدیم) پس میتونیم سرعتشم با تفاضل مکان فعلی و قبلیش تقسیم بر زمان به دست بیاریم :)

این که چطوری به اون transform ها و rigidbody ها دسترسی پیدا کنیم تو هر جایی فرق میکنه ( همه چیز را public static میکند )

مرسی که تا اینجا خوندید یا تا اینجا اسکرول کردید و فقط همین یه خطو خوندید

اینم باحاله

thanks to : @mjfalahi

منبع:

Turret Aiming Formula

unitycsharpیونیتیبازی سازی
۴
۰
mohmehdi
mohmehdi
https://itch.io/profile/mohmehdi
شاید از این پست‌ها خوشتان بیاید