موتورهای بازی سازی چگونه کار میکنند؟
سلام . من محمد مهدی نوروزی قصد دارم با سازوکار های موتورهای بازی سازی و گرافیکی بیشتر آشنا بشم.پس تصمیم گرفتم بشینم و مثل یک پسر خوب یک کتاب انتخاب کنم و بخونمش تا با مسایل گوناگون موجود در دنیای گرافیکی و ۲بعدی و ۳بعدی بیشتر آشنا بشم.این کار رو فعلاً برای سرگرمی انجامش میدم و محرکم که سرچشمه این حرکت شد که برم سراغ این چنین مسایلی چیزی نبود جز metaverse.
تصمیم گرفتم هروقت بخشی از کتاب رو خوندم بیام و درس پس بدم.قول نمیدم هر شب یا به طور منظم این اتفاق بیوفته ولی همه تلاشمو میکنم به طور منظم پیش برم و چیزای جدیدی رو که یاد میگیرم به اشتراک بگذارم.
جلسه ۲:
مقدار بردار – بردار واحد – ضرب اسکالر بردارها
اسکالر یک عدده.فقط همین.
اگر بردار زیر رو داشته باشیم
v = (v1 , v2 , v3 , … , vn)
حاصل ضربش به صورت اسکالر در عدد a برابر میشه با
a * v = (v1 * a, v2 * a , v3 * a , … , vn * a)
حالا میخوایم مقدار بردار v رو که با vmagnitude نشونش میدیم به دست بیاریم.برای این کار کافیه به شکل زیر عمل کنیم:
۱- تک تک مولفه های بردار v رو به توان ۲ میرسونیم
۲-نتایج مرحله اول رو با هم جمع میکنیم
۳-نتیجه مرحله ۲ رو به توان نیم میرسونیم(میبریمش زیر رادیکال)
اگر مایلید بیشتر درباره نحوه محاسبه اندازه یک بردار مطالعه کنید کافیه جمله زیر رو گوگل کنید:
definitions of n-dimensional vector magnitude
بردار واحد یک بردار،همجهت با اون بردار اصلیه ولی مقدارش ۱ خواهد بود.
برای به دست آوردن بردار واحد vnormal از بردار اصلی v به شکل زیر عمل میکنیم.
۱-ابتدا مقدار بردار رو حساب میکنیم.
۲-بردار اصلی رو تقسیم بر مقدار به دست اومده میکنیم(تقسیم همون
معکوسه)
vnormal = v / vmagnitude
حالا بریم سراغ کدامون،من مثالها رو برای بردار ۲بعدی نشون میدم.ولی تعمیمش به بردار ۳بعدی کار بسیار سادهای خواهد بود.
تو تکه کد زیر برابری رو برای دو بردار ۲بعدی پیادهسازی میکنیم.
حواستون رو جمع کنید که نمیتونیم برابری دوتا مقدار float رو با == بسنجیم،چراکه عملیات روی نوع دادهای float همراه با خطا هستش و == فقط وقتی درست برمیگردونه که دوطرف عین هم باشن.
پس میایم دوتا مقدار float رو از هم کم میکنیم و اگر نتیجه از یک EPSILON که حداکثر مقدار خطای پذیرفته شده هست،کمتر باشه،پس اون دوتا با هم برابرن.
تو تکه کد زیر مفهمو + رو برای دوتا بردار ۲بعدی تعریف میکنیم.به این شکل که مولفه های مربوط به بعد مشترک با هم جمع میشن.نتیجه این عملیا یک بردار جدید خواهد بود.
در کد زیری بعلاوه-مساوی رو پیادهسازی میکنیم.
کد زیر عملگر + رو برای شرایطی که بردار با float جمع میشه تعریف میکنه.اگر مقدار scalar مثبت باشه ، نقطهای که بردار نشون میده در همه ابعاد ، در جهت مثبت از مبدأ مختصات دور میشه و برعکس.
در کد زیر ضرب اسکالر رو تعریف میکنیم.
کد زیر به ما امکان تقسیم اسکالر رو میده.
تابع زیر امکان ضرب نقطهای یا ضرب داخلی رو فراهم میکنه.به این شکل که اگر va و vb رو داشته باشیم ، حاصل ضرب داخلیش میشه
va.vb = (va1 * vb1 , va2 * vb2, … , van * vbn)
حالا برای محاسبه مقدار بردار کافیه حاصل حذر ضرب داخلی بردار در خودش رو به دست بیاریم.
حالا میتونیم بردار یکه رو محاسبه کنیم
حالا خودتون میتونید همین عملیات رو برای بردار ۳بعدی هم پیادهسازی کنید و بعد با کدهای اصلی برنامه مقایسشون کنید.
ممنونم که تا اینجا همراهم بودید.امیدوارم خوشحال باشید و منتظر قسمتهای جدید آشنایی با نحوه عملکرد موتورهای بازی سازی باشید.
خوش و خرم باشید.
کاری از محمد مهدی نوروزی