کنترل دوربین در فضای سه بعدی (بخش اول)
سلام
در محیط DirectX و XNA کنترل کاملی روی دوربین خواهید داشت ولی نباید انتظار شیء خاصی برای دوربین را داشته باشید!
در واقع کل دوربین با تمام پارامترهایش فقط یک ماتریس عادی است.
روی مقادیر و چگونگی ایجاد این ماتریس صحبت خواهیم کرد.
------
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
مفهوم دوربین حداقل بر سه بردار اصلی در فضای سه بعدی استوار است.
(یادآوری: هر بردار، سه عدد مشخص x, y, z دارد و مانند یک پیکان نوک تیز در فضای سه بعدی است.)
این سه بردار (9 عدد) همان مقادیری هستند که شما برای حرکت در محیط بازی آنها را به کرات تغییر خواهید داد.
(
بجز سه بردار فوق چند پارامتر تأثیر گذار دیگر هم وجود دارد که معمولا فقط یکبار در شروع برنامه تنظیم و اجرا میشوند.
)
سه بردار دوربین:
1) بردار مکان
این در واقع موقعیت خود دوربین را در فضای سه بعدی مشخص میکند.
مثلا وقت راه رفتن کاراکتر اول شخص، شما این بردار را تغییر میدهید تا دوربین در مکان جدیدی مستقر شود.
(شروع پیکان مبدا مختصات و نوک آن محل دوربین است.)
2) هدف دید
این بردار سمت و جهت دید را مشخص میکند.
(
که برابر است با جمع بردار مکان با بردار جهت دید.
در شرایط و الگوریتم های مختلف گاهاً به جای بردار هدف از بردار جهت استفاده میشود که با توجه به نحوه کنترل دوربین در بازی شاید یکی از این دو ساده تر باشد و اختلاف انها هم فقط در یک جمع و تفریق ساده با بردار مکان خود دوربین است.
فعلاً بدانید که بردار مهم دوم، مکان هدف را مشخص میکند.
)
مثلا وقتی کاراکتر اول شخص شما ایستاده و سرش را به اطراف میچرخاند، این بردار را تغییر میدهید.
(شروع پیکان، صفر مختصات است و پایان پیکان محل هدفی است که دوربین به ان سمت نشانه وری شده است)
3) بردار نرمال
بیشتر اشیا در فضای سه بعدی بردار نرمالی دارند که سمت بالا را مشخص میکند و به نوعی مکان هندسی شی را ثابت میکند.
این بردار در دوریین هم سمت بالا را مشخص میکند.
(شروع پیکان، محل دوربین است و جهت آن سمت بالای دوربین+تصویر را مشخص میکند.)
مثلا شما میتوانید در نقطه باشید و به مکان ثابتی هم نگاه کنید....
ولی در مکان نقطه میتوانید به همان مکان هدف، سروته نگاه کنید! مثل زمانی که روی دستهایتان ایستاده اید!س
یا در بازیهای هواپیمایی وقتی گردش میکند و کل صحنه را کج می بینید، این بردار تغییر میکند.
-----
فعلا امیدوارم حداقل در ذهنتان بتوانید این سه بردار و تاثیر آنها را بر حرکت دوربین و تصویری که کاربر روی مانیتور میبینید درک کرده باشید.
سعی کنید حالات مختلف گردش در محیط سه بعدی و بازی را تصور کنید و در هر مورد ببینید چه بردارهایی باید تغییر کنند.
ساخت ماتریس دوربین:
ماتریس دوربین شی نهایی مشخص کنند دوربین است که از ادقام این سه بردار با تابع CreateLookAt ایجاد میشود:
کد:
//C#.Net
XNA.Vector3 vPosition = ...;
XNA.Vector3 vTarget = ...;
XNA.Vector3 vUp = ...;
XNA.Matrix cameramatrix = XNA.Matrix.CreateLookAt(vPosition, vTarget, vUp);
'VB.Net
Dim vPosition As XNA.Vector3 = ...
Dim vTarget As XNA.Vector3 = ...
Dim vUp As XNA.Vector3 = ...
Dim cameramatrix As XNA.Matrix = XNA.Matrix.CreateLookAt(vPosition, vTarget, vUp)
برای اعمال و استفاده از این ماتریس باید آن را قبل از رندر همه اشیا، تک به تک به خصیصه View شی های (BasicEffect یا مشتقات) آن بدهید.
بدیهی است هر شی که BasicEffect آن تنظیم نشود در رندر این ماترسیس روی آن اثری ندارد.
مثلا در حالت عادی برای رسم یک شی ممکن است همچین کدی نوشته شود:
کد:
//C#.Net
var mesh = model.Meshes[0];
foreach (XNA.Graphics.BasicEffect effect in mesh.Effects)
{
effect.World = modelmatrix; //ماتریس موقعیت (مکان+دوران+نسبت) خود شی
effect.View = cameramatrix; //ماتریس دوربین
}
mesh.Draw();
'VB.Net
Dim mesh = Me.m_Model.Meshes(0)
For Each effect As XNA.Graphics.BasicEffect In mesh.Effects
effect.World = modelmatrix 'ماتریس موقعیت (مکان+دوران+نسبت) خود شی
effect.View = cameramatrix 'ماتریس دوربین
Next
mesh.Draw()
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
اگر دقت کنید متوجه خواهید شد که ماتریس دوربین در این پروزه ثابت است و یکبار در شروع برنامه در متد Initialize مقداردهی شده است.
(((((
گردش کشتی در این پروژه ناشی از دوران ماتریس modelmatrix خودش (خود کشتی) در متد Update است.
یک سوال! میتوانید هم اسمش را تمرین بگذارید!!!
سعی کنید در پروژه Ship ماتریس modelmatrix را ثابت کنید (در واقع خود شی را ثابت کنید) و به جای آن دوربین، (یا همان ماتریس cameramatrix را) طوری در متد Update اصلاح کنید که دوربین دور کشتی یا همان ناو بچرخد؟؟؟
با انجام و یا حداقل سعی در انجام این کار ساده، خیلی خوب با توابع ریاضی و درک فضای سه بعدی درگیر خواهید شد و میتواند شروع خوبی برای درک دوربین باشد.
بعد هم به راحتی میتوانید دوربین را در جهت دیگری گردش دهید یا کنترل آن را به دست کیبورد یا ماوس بسپارید و...
اگر به فرض این کار را صحیح انجام دهید، نباید در اجرای برنامه تفاوتی حاصل شود.
چرا؟
چون فقط یک شی (همان ناو یا کشتی) در صحنه وجود دارد و دوران آن حول خودش با چرخیدن دوربین دورش تفاوتی از دید ناظر پشت لنز ایجاد نمیکند.
ولی اگر یک شی دیگر به صحنه اضافه شود (:46:) آنگاه تفاوت چرخیدن یک شی دور خودش با چرخیدن دوربین دور محیط مشخص میشود.
)))))
=====
در پست های بعدی باید دقیق تر به این مسئله بپردازیم و کمی هم درمورد الگوریتم های خاص کنترل دوربین در بازی یا برنامه های اول شخص ، سوم شخص و هواپیمایی صحبت کنیم.
هر کدام از این سه الگوریتم و کنترل خاصی را بر دوربین دارند.
موفق باشید.
:10: