View Full Version : سوال: سوال درمورد دوربین در فضای سه بعدی
mohammadali1375
پنج شنبه 05 بهمن 1391, 22:10 عصر
سلام
من تازه دارم با OpenGL سه بعدی کار میکنم. یه مشکل برام پیش اومده اگه کسی میتونه لطفا کمک کنه. :خجالت:
من یه آرایه از یک سری مکعب دارم که هرکدوم قراره موقعیت و چرخش خاصی رو داشته باشه. یک دوربین هم میخام داشته باشم که بشه راحت جابجاش کرد. الان یک مشکل سر همین دوربین برام پیش اومده.
تا اونجایی که من میدونم باید برای حرکت دوربین از gluPerspective استفاده کنم. در صورت معمولی میشه راحت استفاده کرد ولی وقتی قرار باشه هم مکعب ها موقعیتشون مشخص بشه هم دوربین کار به هم میریزه. بزارید بیشتر توضیح بدم. الان مکعب نساختم فقط بک چهار ضلعی ساختم.
به اینصورت چهار ضلعی هارو رندر میکنم :
for (int i=0;i<cubeCounter;i++)
{
Vector3 position=cubes[i]->position;
Vector3 scale=cubes[i]->scale;
//scale share on 2
Vector3 SSO2(scale.X/2,scale.Y/2,scale.Z/2);
glLoadIdentity();
glTranslatef(position.X,position.Y,position.Z);
glBegin(GL_QUADS);
glVertex3f(-SSO2.X,-SSO2.Y,-SSO2.Z);
glVertex3f(SSO2.X,-SSO2.Y,-SSO2.Z);
glVertex3f(SSO2.X,SSO2.Y,-SSO2.Z);
glVertex3f(-SSO2.X,SSO2.Y,-SSO2.Z);
glEnd();
}
SDL_GL_SwapBuffers();
glLoadIdentity();
SDL_Delay(16.66666);
glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT);
حالا شما بگیم چجوری از gluPerspective استفاده کنم به صورتی که فقط دو تا Vector3 داشته باشیم. یکی موقعیت دوربین در فضای سه بعدی و دیگری میزان چرخش دوربین در هر یک از سه محور.
اگه کمک کنید ممنون میشم. مبتدیم دیگه :ناراحت:
pswin.pooya
جمعه 06 بهمن 1391, 00:18 صبح
gluPerspective
این دستور که برای حرکت دوربین نیست. این دستور برای ساخت ماتریس پرسپکتیو به کار میره.
حالا شما بگیم چجوری از gluPerspective استفاده کنم به صورتی که فقط دو تا Vector3 داشته باشیم. یکی موقعیت دوربین در فضای سه بعدی و دیگری میزان چرخش دوربین در هر یک از سه محور.
برای کارهای سطح بالا مثل حرکت دوربین و ... نه داخل OpenGL و نه داخل دایرکت دستوری وجود نداره. شما باید اول از همه مفهوم ماتریسها رو درک کنید و بعد به کمک اونها این موارد رو شبیه سازی کنید. قبلا یادمه که یکسری کتاب معرفی کرده بودم (توی تاپیک ها مختلف) تمامی این کتابها ماتریسها رو توضیح دادن. اما کتاب beginning directx9 game programming فقط یه فصل رو به دوربین اختصاص داده.
برای حرکت دادن اشیاء داخل محیط راحترین راه استفاده از دستورهای gltranslateو glrotate است. این دستورها رو باید به کمک دستورهای glPushMatrix و glPopMatrix بکار ببری که حرکت و دوران اشیاء روی هم تاثیر نداشته باشه.
اگه کمک کنید ممنون میشم. مبتدیم دیگه :ناراحت:
قبول کمک می کنیم اما یه جوری حس میکنم بدون اینکه مطالعه کنی بخوای زحمت بکشی میخوای یه کارایی بکنی. توی مرحله اول باید بگم که گرافیک و بازی سازی در سطح برنامه نویسی به چیز موارد دیگه مثل C# و UDK شباهت نداره که یکم راه افتادی بقیه خود بخود حل بشه. کلا وقتی بحث این چیزها باز میشه دو نوع برنامه نویسی یعنی برنامه نویسی سیستمی و برنامه نویسی بلادرنگ نرم مطرح میشه که هر دو توع این برنامه نویسیها برای افراد متخصص هست. و ویژگی این افراد مطالعه زیاد و کد زدن کم هست. کلا افراد متخصص راندمان کدینگ پایین دارند و بعضا شاید در روز نتونن بیشتر ۱۰۰ خط کد بزنن اما همون ۱۰۰ خط اونها با هزارُ دو هزار خط بقیه برابر است.
mohammadali1375
جمعه 06 بهمن 1391, 00:30 صبح
آها ممنون. تو دو بعدی مشکلی نبود برا همین از اینجا یکم به مشکل خوردم.
---
آره قبول دارم یکم عجله دارم ولی میخاستم یکم سه بعدی اپن جی ال رو تست کنم. از این به بعد سعی میکنم با مطالعه بیشتری برم جلو و آزمون و خطا رو کمتر کنم.
قبلا C# کار میکردم و با XNA . اونجا به قول شما بیشتر چیزا حوب به خود حل میشد. تونستم چند تا سیستم که تو ذهنمه رو پیاده کنم اما رو C++ یکم به مشکل برخوردم :متفکر:
ممنون از راهنمایی
---
راستی میشه چند تا کتاب که به نظرتون بدرد من میخوره معرفی کنید ؟
ممنون
amin.v
جمعه 06 بهمن 1391, 14:14 عصر
http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/
اینجا رو بخون ...
ضمنا من پیشنهاد میکنم OpenGL 3 به بالا ( core profile ) کار کنی و یاد بگیری ... دستوراتی مثل glVertex3f ، glTranslatef , glPushMatrix یا ... منسوخ شدن تو نسخه های آخر ، پس بهتر اینه که از الان دانش اتون رو بر پایه یه چیز درست حسابی قرار بدین ...
http://www.opengl.org/registry/doc/glspec32.core.20091207.pdf
pswin.pooya
جمعه 06 بهمن 1391, 20:44 عصر
ضمنا من پیشنهاد میکنم OpenGL 3 به بالا ( core profile ) کار کنی و یاد بگیری ... دستوراتی مثل glVertex3f ، glTranslatef , glPushMatrix یا ... منسوخ شدن تو نسخه های آخر ، پس بهتر اینه که از الان دانش اتون رو بر پایه یه چیز درست حسابی قرار بدین ...
البته منسوخ که اشتباه هست. بهتره بگیم توی ویرایشهای جدیدتر حذف شدن. وگرنه خیلی جاها با همون ویرایش OpenGL 1.2 کار می کنن.
ضمنا من پیشنهاد میکنم OpenGL 3 به بالا ( core profile ) کار کنی
پرفایل هسته کلا یک مفهوم جدا از OpenGL 3 و به بالا هست.
اصولا فرق چندانی نداره که شما با OpenGL 2.x کار کنید یا OpenGL 3.x و به بالا. بیشتر قابلیتهای مورد استفاده در همون ویرایش 1.2 (مثل شیدر geometry) هم وجود داره. ( به صورت الحاقی) و بعد از OpenGL 3 مخصوصا ویرایش 3.3 به هسته اضافه شدن. در حقیقت OpenGL در ویرایش سه تغییرات بنیادینی رو تجربه کرد که در OpenGL 4 این تغییرات تکمیل شد ( یا بهتر بگیم قالب استاندارد تر پیدا کرد.).
من به شدت پیشنهاد می کنم که اول با همون OpenGL 1.2 کار کنید تا مفاهیم رو درک کنید و بعد از اون به ویرایشهای قابل برنامه ریزی ( از OpenGL 2.x به بالا ) رجوع کنید. نمی گم یادگیری OpenGL 3.x سختر هست یا مفید نیست اما لازمه یادآوری کنم که مفاهیم بیشتری داخل این ویرایش مطرح هست ( حتی توی مثالهای ساده)
راستی میشه چند تا کتاب که به نظرتون بدرد من میخوره معرفی کنید ؟
همنط.ر که قبلا هم اشاره کردم بارها این سوال مطرح شده و جواب داده شده. داخل تاپیک های سایت جستجو کنید.
amin.v
جمعه 06 بهمن 1391, 22:01 عصر
البته منسوخ که اشتباه هست. بهتره بگیم توی ویرایشهای جدیدتر حذف شدن. وگرنه خیلی جاها با همون ویرایش OpenGL 1.2 کار می کنن.خب من هم منظورم ویرایش های جدید بود !
پرفایل هسته کلا یک مفهوم جدا از OpenGL 3 و به بالا هست. این مفاهیم وقتی ارائه شدن که OpenGL 3 اومد ...
http://www.opengl.org/wiki/Core_And_Compatibility_in_Contexts
اصولا فرق چندانی نداره که شما با OpenGL 2.x کار کنید یا OpenGL 3.x و به بالا. بیشتر قابلیتهای مورد استفاده در همون ویرایش 1.2 (مثل شیدر geometry) هم وجود داره. ( به صورت الحاقی) و بعد از OpenGL 3 مخصوصا ویرایش 3.3 به هسته اضافه شدن. در حقیقت OpenGL در ویرایش سه تغییرات بنیادینی رو تجربه کرد که در OpenGL 4 این تغییرات تکمیل شد ( یا بهتر بگیم قالب استاندارد تر پیدا کرد.).مشکل همینجاست ... اگه شما برای خودتون یا شرکت خاصی کار میکنید و مطمئن هستید که فلان extention ها رو میتونید استفاده کنید مشکلی نیست اما وقتی بحث سره انتشار یک بازی هست اتفاقا این extention ها دردسر ساز هستن ... وقتی میگید فلان بازی نیاز به opengl 3 داره دیگه تکلیف شما و اون گیمر مشخصه ...
ضمن اینکه شما کارتی رو میشناسید که opengl 1.2 رو فقط پشتیبانی کنه و تمام extension های نسخه های بالا تر مثل همون Geometry Shader رو داشته باشه ؟
راستش شاید روش کاری و عقیده ما با هم فرق داشته باشه ... نظر شخصی من اینه که بهتره از همون اول چیزهایی که میدونیم در نسخه های آینده وجود نداره رو بی خیال بشیم و اون مفاهیم اضافی که در واقع جایگزین بهتری هست رو همون اول یاد بگیریم !
pswin.pooya
شنبه 07 بهمن 1391, 06:20 صبح
این مفاهیم وقتی ارائه شدن که OpenGL 3 اومد ...
نه کلا اشتباه گرفتی. منظور از هسته بیشتر همون توابعی هست که داخل خود ویرایش OpenGL مطرح شدن. و بعضی وقتا به ساختار OpenGL اشاره میکنه. وگرنه این موضوع ربطی به قضیه OpenGL 3 نداره. اون الحاقی که لینکش رو دادید فقط میگه OpenGL به دو سمت هسته و سازگاری تقسیم شده. وگرنه مفهوم هسته از همون ویرایش های اولیه بوده. در حقیقت OpenGL دنبال اینه که یه ساختار استاندارد تر برای API معرفی کنه.
بعد از OpenGL 1.5 و در ویرایش ۲ مخصوصا ۲.۱ سردرگمی زیادی به وجود اومد. مثلا شما نمی تونستید تعیین کنید که از کدوم ویرایش استفاده می کنید و یا نمی دونستید که کدوم دستور توی ویرایشی که استفاده می کنید داخل هسته هست و ساپورت میشه. در نتیجه OpenGL 3 سعی کرد تمامی این قضایا رو حل کنه. مثلا زمان ایجاد محتوا دقیقا شماره ویرایش رو مشخص می کردید و یا دقیقا راهکار برای گرفتن شماره ویرایش ساپورتی وجود داشت. یجورایی بیشترین سعی داخل ویرایش سوم یکریخت کردن API بود. ( که تا حدودی هم موفق بود)
اتفاقا این extention ها دردسر ساز هستن ... وقتی میگید فلان بازی نیاز به opengl 3 داره دیگه تکلیف شما و اون گیمر مشخصه ...
بعضی از اونها آره اما در کل خیلی از الحاقی ها داخل کارتهای گرافیکی مختلف ساپورت میشن. مثلا بازی doom 3 هم با همین الحاقی ها بیرون اومد ( این بازی از ویرایش OpenGL 1.5 استفاده می کرد. منتها deferred shading رو پیاده سازی کرده بود.)
ضمن اینکه شما کارتی رو میشناسید که opengl 1.2 رو فقط پشتیبانی کنه و تمام extension های نسخه های بالا تر مثل همون Geometry Shader رو داشته باشه ؟
نه توی این حد. ولی یه زمانیُ حتی قبل اینکه دایرکت و OpenGL شیدرهای هندسی رو به رسمیت بشناسن. این الحاقی رو nvidia برای اولین بار معرفی کرد و بعد ARB قبول کرد و در نهایت در ویرایش ۳ معرفی شد. ( بعد اینکه دایرکت به رسمیت شناخت و معرفی کرد). همین الانش هم الحاقی های وجود دارن که کاندید معرفی توی نسلهای جدیدتر هستند.
نظر شخصی من اینه که بهتره از همون اول چیزهایی که میدونیم در نسخه های آینده وجود نداره رو بی خیال بشیم و اون مفاهیم اضافی که در واقع جایگزین بهتری هست رو همون اول یاد بگیریم !
توی کار حرفه ای حق با شماست. اما وقتی قضیه آموزش و یا کار آماتوری هست نباید این شکلی باشیم. توی آموزش بیشتر هدف یادگیری هست. مثلا برای شخصی که نمی تونه یه مثلث هم رسم کنه شما بیا مفهوم شیدر راس و فرگمنت رو توضیح بده! بهتره که قدم به قدم جلو رفت. یعنی اول طرف چندتا شکل ساده رسم کنه بعد مثلا با ماتریسها و ... آشنا بشه و بعد اون فوکوس کرد روی شیدر و مفاهیم جدیدتر مثل اشیاء حافظه و بافر.
این مثل این قضیه میمونه که یه نفر اومده کلاس برنامه نویسی و شما بخواید برنامه نویسی رو مثلا با الگوریتم ژنتیک یادش بدید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.