وبلاگ رسمی علیرضا شهامت در بلاگ اسکای

وبلاگ رسمی علیرضا شهامت در بلاگ اسکای

وبلاگ رسمی علیرضا شهامت در بلاگ اسکای - تأسیس شده در سال 1396
وبلاگ رسمی علیرضا شهامت در بلاگ اسکای

وبلاگ رسمی علیرضا شهامت در بلاگ اسکای

وبلاگ رسمی علیرضا شهامت در بلاگ اسکای - تأسیس شده در سال 1396

سایت مفید - دوربین در اپن جی ال - شروع کار - فارسی- بخش اول

فارسی:
بخش اول:
5000/5000
Character limit: 5000
اگر شما AdBlock را اجرا می کنید، لطفا اگر مایل به حمایت از LearnOpenGL هستید، لطفا این سایت را سفید کنید. و نگران نباش

    معرفی
    شروع شدن
        OpenGL
        ایجاد یک پنجره
        سلام پنجره
        سلام مثلث
        سایه ها
        بافت
        تغییرات
        دستگاه های مختصات
        دوربین
        مرور
    روشنایی
    مدل بارگیری
    پیشرفته OpenGL
    روشنایی پیشرفته
    PBR
    در تمرین
    کتاب آفلاین
    مخزن کد
    ترجمه ها
    در باره

دوربین

در آموزش قبلی ما درباره ماتریس دید و نحوه استفاده از ماتریس دید برای حرکت در اطراف صحنه (ما کمی عقب رفتیم) بحث کردیم. OpenGL به خودی خود با مفهوم دوربین آشنا نیست، اما ما می توانیم با حرکت همه اشیاء در صحنه در جهت معکوس، سعی کنیم شبیه سازی کنیم، و این توهم را که ما در حال حرکت است، شبیه سازی کنیم.

در این آموزش ما بحث خواهیم کرد که چگونه می توان یک دوربین را در OpenGL تنظیم کرد. ما در مورد یک دوربین FPS سبک که اجازه می دهد شما را به صورت آزاد در یک صحنه 3D حرکت می کند. در این آموزش ما نیز درباره ورودی صفحه کلید و ماوس صحبت خواهیم کرد و با یک کلاس دوربین سفارشی به پایان برسیم.
دوربین / فضای نمایش

هنگامی که ما در مورد فضای دوربین / فضای صحبت می کنیم، ما در مورد همه مختصات ریشه صحبت می کنیم که از دیدگاه دوربین به عنوان منشاء صحنه دیده می شود: ماتریس مشاهده همه مختصات جهان را به مختصات دید که نسبت به موقعیت دوربین و جهت برای تعریف یک دوربین ما نیاز به موقعیت آن در فضای جهانی، جهت آن را به دنبال، یک بردار اشاره به سمت راست و یک بردار اشاره شده به سمت بالا از دوربین. یک خواننده دقیق ممکن است متوجه شود که ما در واقع می خواهیم یک سیستم مختصات با 3 محور واحد عمودی با موقعیت دوربین به عنوان مبدا ایجاد کنیم.
1. موقعیت دوربین

گرفتن موقعیت دوربین آسان است. موقعیت دوربین اساسا یک بردار در فضای جهانی است که به موقعیت دوربین اشاره دارد. ما دوربین را در موقعیتی قرار دادیم که دوربین را در آموزش قبلی تنظیم کرده ایم:


glm :: vec3 cameraPos = glm :: vec3 (0.0f، 0.0f، 3.0f)؛

فراموش نکنید که محور z مثبت از روی صفحه نمایش به سمت شما حرکت می کند، بنابراین اگر ما بخواهیم دوربین را به عقب حرکت دهیم، ما در امتداد محور z مثبت حرکت می کنیم.
2. جهت دوربین

بردار بعدی مورد نیاز جهت دوربین است e.g. در چه مسیری قرار دارد؟ در حال حاضر ما اجازه می دهیم که دوربین نقطه مناسبی از صحنه ما باشد: (0،0،0). به یاد داشته باشید که اگر ما دو بردار را از یکدیگر جدا کنیم، یک بردار را که تفاوت این دو بردار است، دریافت می کنیم؟ در نتیجه بردار موقعیت دوربین را از بردار منشوری صحنه بردارید و به این ترتیب بردار جهت می دهد. از آنجایی که ما میدانیم که دوربین به سمت جهت منفی z اشاره می کند، ما جهت vector را به سمت محور z مثبت دوربین می خواهیم. اگر ما دستور تقسیم را در اطراف ما تغییر دهیم، اکنون یک بردار را به سمت محور z مثبت دوربین منتقل می کنیم:


glm :: vec3 cameraTarget = glm :: vec3 (0.0f، 0.0f، 0.0f)؛
glm :: vec3 cameraDirection = glm :: normalize (cameraPos - cameraTarget)؛

نام بردار نام و نام خانوادگی بهترین انتخاب نیست، زیرا در واقع در جهت معکوس آنچه که هدف قرار دارد، اشاره دارد.
3. محور راست

بردار بعدی که ما نیاز داریم یک بردار راست است که نشان دهنده محور x مثبت فضای دوربین است. برای دریافت بردار راست ما با استفاده از یک ترفند کوچک با استفاده از یک بردار بالا که نقطه به سمت بالا (در فضای جهان) است، از یک ترفند کوچک استفاده می کنیم. سپس یک محصول متقابل بر روی بردار بالا و بردار جهت از مرحله 2 انجام می دهیم. از آنجا که نتیجه یک محصول متقابل یک بردار عمود بر هر دو بردار است، ما یک بردار را در جهت محور مثبت (اگر ما بردارهایی را که می خواهیم یک بردار را که در محور x منفی قرار دارد را تغییر دهیم):


glm :: vec3 بالا = glm :: vec3 (0.0f، 1.0f، 0.0f)؛
glm :: vec3 cameraRight = glm :: normalize (glm :: cross (up، cameraDirection))؛

4. محور بالا

حالا که هر دو بردار x محور و بردار محور z را داشته باشیم، بازیابی بردار که در محدوده ی مثبت y دوربین محاسبه می شود، نسبتا آسان است: محصول متقابل راست و بردار جهت:


glm :: vec3 cameraUp = glm :: cross (cameraDirection، cameraRight)؛

با کمک محصول متقابل و چند ترفند، ما توانستیم تمام بردارهایی را ایجاد کنیم که فضای view / camera را تشکیل می دهند. برای خوانندگان ریاضی بیشتر، این فرایند به عنوان فرآیند گرام Schmidt در جبر خطی شناخته می شود. با استفاده از این بردارهای دوربین ما می توانیم یک ماتریس LookAt ایجاد کنیم که برای ایجاد یک دوربین بسیار مفید است.
نگاه کن

چیز بزرگ در مورد ماتریس این است که اگر فضای مختصتی را با استفاده از 3 محور عمود بر (یا غیر خطی) تعریف کنید، می توانید یک ماتریس با آن 3 محور و یک بردار ترجمه ایجاد کنید و شما می توانید هر بردار را به آن فضای مختصات را با ضرب کردن آن با این ماتریس این دقیقا همان چیزی است که Matrix LookAt انجام می دهد و در حال حاضر 3 محور عمود بر محور و یک بردار موقعیت برای تعریف فضای دوربین ما می توانیم ماتریس LookAt خودمان را ایجاد کنیم: \ [LookAt = \ begin {bmatrix} \ color {red} {R_x} & \ color {قرمز} {R_y} & \ colo