نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی پرتال اطلاعاتی

ماتریس تحول دیدگاه عمومی. برنامه نویسی DirectX9: چرخش اشیاء

آکسونومتری یک طرح ریزی موازی است. در جدول 3.3، ابتدا ماتریس های پیش بینی های املایی بر روی صفحات مختصات به دست آمده از تعاریف آنها آورده شده است.

جدول 3.3 ماتریس های پیش بینی تبدیل ها و پیش بینی ها

پیش بینی املایی روی XOY

پیش بینی املایی روی YOZ

پیش بینی املایی روی XOZ

پیش بینی املایی روی صفحه x=p

ماتریس تبدیل سه‌گانه به صفحه XOY

ماتریس تبدیل ایزومتریک به صفحه XOY

ماتریس طرح ریزی ایزومتریک در صفحه XOY

ماتریس طرح ریزی مورب روی XOY

ماتریس طرح ریزی رایگان در XOY

ماتریس طرح کابینت در XOY

ماتریس تبدیل پرسپکتیو با یک نقطه ناپدید شدن (صفحه تصویر عمود بر محور x است)

ماتریس تبدیل پرسپکتیو با یک نقطه ناپدید شدن (صفحه تصویر عمود بر محور y است)

ماتریس تبدیل پرسپکتیو با یک نقطه ناپدید شدن (صفحه تصویر عمود بر محور کاربردی است)

ماتریس تبدیل پرسپکتیو با دو نقطه ناپدید شدن (صفحه تصویر موازی با محور y)

ماتریس تبدیل پرسپکتیو با سه نقطه ناپدید شدن (صفحه تصویر موقعیت دلخواه)

ایزومتریک، دو سنجی و سه سنجی با ترکیبی از چرخش ها و به دنبال آن یک طرح از بی نهایت به دست می آیند. اگر شما نیاز به توصیف برآمدگی بر روی صفحه XOY دارید، ابتدا باید چرخش را با یک زاویه تبدیل کنید. نسبت به محور y و سپس به زاویه در مورد محور x جدول 3.3 ماتریس تبدیل سه گانه را نشان می دهد. برای به دست آوردن یک ماتریس تبدیل دیمتریک، که در آن، برای مثال، ضرایب اعوجاج در امتداد محورهای ابسیسا و ارتین برابر خواهد بود، رابطه بین زوایای چرخش باید تابع وابستگی باشد.

یعنی انتخاب زاویه ، می توانید زاویه را محاسبه کنید و یک ماتریس طرح ریزی دیمتریک تعریف کنید. برای تبدیل ایزومتریک، رابطه این زوایا به مقادیر کاملاً تعریف شده تبدیل می شود که عبارتند از:

جدول 3.3 ماتریس تبدیل ایزومتریک و همچنین ماتریس طرح ریزی ایزومتریک در صفحه XOY را نشان می دهد. نیاز به ماتریس های نوع اول در استفاده از آنها در الگوریتم های حذف عناصر نامرئی نهفته است.

در برجستگی های مایل، خطوط برآمده زاویه ای غیر از 90 درجه با صفحه برآمدگی تشکیل می دهند. جدول 3.3 ماتریس کلی طرح ریزی مورب بر روی صفحه XOY و همچنین ماتریس های برجستگی آزاد و صندلی راحتی را نشان می دهد که در آن:

پیش بینی های پرسپکتیو (جدول 3.3) نیز با تبدیل های پرسپکتیو و پیش بینی های پرسپکتیو در صفحه XOY نشان داده شده است. V X، V Y و V Z مراکز طرح - نقاط روی محورهای مربوطه هستند. –V X , -V Y , -V Z نقاطی هستند که در آن مدادهای خطوط مستقیم به موازات محورهای مربوطه همگرا می شوند.

سیستم مختصات ناظر است ترک کردسیستم مختصات (شکل 3.3)، که در آن محور z e از نقطه نظر به جلو، محور x e به سمت راست، و محور y e به سمت بالا هدایت می شود. چنین قاعده ای برای انطباق محورهای x e و y e با محورهای x s و y s روی صفحه اتخاذ می شود. تعیین مقادیر مختصات صفحه نمایش x s و y s برای نقطه P منجر به نیاز به تقسیم بر مختصات z e می شود. برای ساخت یک تصویر پرسپکتیو دقیق، لازم است که بر مختصات عمق هر نقطه تقسیم شود.

جدول 3.4 مقادیر توصیفگر رأس S(X,Y,Z) مدل (شکل 2.1) را نشان می دهد که در معرض چرخش و تبدیل های ایزومتریک قرار دارند.

جدول 3.4 توصیفگرهای راس مدل

مدل اصلی

M(R(z،90))xM(R(y،90))

موتور کشتی را حرکت نمی دهد.
کشتی در جای خود باقی می ماند، و
موتورها جهان را به حرکت در می آورند
در اطراف او.

فوتوراما

این یکی از مهم ترین درس هاست. حداقل هشت بار با دقت بخوانید.

مختصات همگن

در درس های قبل فرض کردیم که راس در مختصات (x,y,z) قرار دارد. بیایید یک مختصات دیگر اضافه کنیم - w. از این به بعد در مختصات راس خواهیم داشت (x,y,z,w)

به زودی متوجه خواهید شد که چیست، اما در حال حاضر، آن را بدیهی فرض کنید:

  • اگر w==1، بردار (x,y,z,1) موقعیتی در فضا است
  • اگر w==0 بردار (x,y,z,0) جهت است.

این را به عنوان بدیهیات بدون دلیل به خاطر بسپارید!!!

و چه چیزی به ما می دهد؟ خوب، چیزی برای چرخش نیست. اگر یک نقطه یا یک جهت را بچرخانید، همان نتیجه را خواهید گرفت. اما اگر حرکت را بچرخانید (زمانی که یک نقطه را در جهت خاصی حرکت می دهید)، همه چیز به طور چشمگیری تغییر می کند. "حرکت جهت" به چه معناست؟ چیز خاصی نیست.

مختصات همگن به ما امکان می دهد برای هر دو مورد با یک ماده واحد کار کنیم.

ماتریس های تبدیل

مقدمه ای بر ماتریس ها

به بیان ساده، ماتریس فقط آرایه ای از اعداد با تعداد ثابتی از سطرها و ستون ها است.

به عنوان مثال، یک ماتریس 2 در 3 به شکل زیر است:

در گرافیک سه بعدی، ما تقریبا همیشه از ماتریس های 4x4 استفاده می کنیم. این به ما اجازه می دهد تا رئوس (x,y,z,w) خود را تبدیل کنیم. بسیار ساده است - ما بردار موقعیت را در ماتریس تبدیل ضرب می کنیم.

ماتریس*راس = راس تبدیل شده

آنقدرها هم که به نظر می رسد ترسناک نیست. انگشت دست چپ خود را به سمت a و انگشت دست راست خود را روی x بگیرید. این تبر خواهد بود. انگشت چپ خود را به عدد بعدی، b، و انگشت راست خود را به سمت پایین به عدد بعدی، y ببرید. رسیدیم یک بار دیگر - cz. و یک بار دیگر - dw. اکنون تمام اعداد به دست آمده را جمع می کنیم - ax+by +cz +dw . ما x جدید خود را دریافت کردیم. همین کار را برای هر خط تکرار کنید و یک بردار جدید (x,y,z,w) دریافت خواهید کرد.

با این حال، این یک عملیات نسبتا خسته کننده است، بنابراین اجازه دهید کامپیوتر آن را برای ما انجام دهد.

در C++ با استفاده از کتابخانه GLM:

glm::mat4 myMatrix;


glm::vec4 myVector;



glm:: vec 4 تبدیل شده = myMatrix * myVector; // دستور فراموش نشه!!! این آرشیو است!!!

در GLSL:

mat4 myMatrix;


vec4 myVector;


// ماتریس و بردار را با مقادیر ما پر کنید... از این می گذریم


vec 4 تبدیل شده = myMatrix * myVector; // دقیقاً مشابه GLM است

(به نوعی به نظرم می رسد که شما این قطعه کد را در پروژه خود کپی نکردید و آن را امتحان نکردید ... بیا، آن را امتحان کن، جالب است!)

ماتریس حرکت

ماتریس جابجایی احتمالا ساده ترین ماتریس از همه است. او اینجاست:


در اینجا X، Y، Z مقادیری هستند که می خواهیم به موقعیت راس خود اضافه کنیم.

بنابراین، اگر لازم باشد بردار (10،10،10،1) را 10 نقطه در موقعیت X جابجا کنیم، آنگاه:
(لطفا خودتان آن را امتحان کنید!)

...و در یک بردار همگن (20،10،10،1) می گیریم. همانطور که امیدوارم به خاطر داشته باشید، 1 به این معنی است که بردار یک موقعیت را نشان می دهد، نه یک جهت.

و اکنون بیایید سعی کنیم جهت (0,0,-1,0) را به همین ترتیب تغییر دهیم:

و در نهایت همان بردار (0.0, -1.0) را به دست آوردیم.
همانطور که گفتم حرکت دادن جهت معنا ندارد.

چگونه می توانیم این را کد گذاری کنیم؟

در C++ با GLM:

#عبارتند از // بعد از


glm::mat4 myMatrix = glm::translate(10.0f، 0.0f، 0.0f)؛


glm::vec4 myVector(10.0f, 10.0f, 10.0f, 0.0f)؛


glm:: vec 4 تبدیل شده = myMatrix * myVector; // و نتیجه چه خواهد بود؟


و در GLSL: در GLSL، این کار به ندرت انجام می شود. اغلب با تابع glm::translate(). ابتدا یک ماتریس در C++ ایجاد می کنند و سپس آن را به GLSL می فرستند و فقط یک ضرب در آنجا انجام می شود:

vec4 transformedVector = myMatrix * myVector;

ماتریس هویت

این یک ماتریس خاص است. او هیچ کاری نمی کند. اما من آن را ذکر می کنم زیرا مهم است بدانید که ضرب A در 1.0 به A منجر می شود:

glm::mat4 myIdentityMatrix = glm::mat4(1.0f);

ماتریس مقیاس بندی

ماتریس مقیاس بندی نیز بسیار ساده است:

بنابراین اگر می خواهید یک بردار (موقعیت یا جهت، مهم نیست) را در همه جهات دو برابر کنید:

و مختصات w تغییر نکرده است. اگر بپرسید: "مقیاس بندی جهت چیست؟". اغلب مفید نیست، اما گاهی اوقات مفید است.

(توجه داشته باشید که مقیاس بندی ماتریس هویت با (x,y,z) = (1,1,1))

C++:

// استفاده کنید#عبارتند از و#عبارتند از


glm::mat4 myScalingMatrix = glm::scale(2.0f, 2.0f،2.0f)؛

ماتریس چرخش

اما این ماتریس بسیار پیچیده است. بنابراین، من به جزئیات اجرای داخلی آن نمی پردازم. اگر واقعاً می خواهید، بهتر است بخوانید (سؤالات متداول ماتریس ها و کواترنیون ها)

ATبا++:

// استفاده کنید#عبارتند از و#عبارتند از


glm::vec3 myRotationAxis(??, ??, ??);


glm::rotate(angle_in_degrees, myRotationAxis);

تحولات ترکیبی

اکنون می دانیم که چگونه بردارهای خود را بچرخانیم، حرکت دهیم و مقیاس کنیم. خیلی خوب است که بدانیم چگونه همه چیز را کنار هم بگذاریم. این به سادگی با ضرب ماتریس ها در یکدیگر انجام می شود.

TransformedVector = TranslationMatrix * RotationMatrix * ScaleMatrix * Original Vector;

و دوباره سفارش دهید! ابتدا باید اندازه را تغییر دهید، سپس اسکرول کنید و تنها سپس حرکت کنید.

اگر تبدیل ها را به ترتیب متفاوتی اعمال کنیم، نتیجه یکسانی به دست نمی آید. در اینجا سعی کنید:

  • یک قدم به جلو بردارید (کامپیوتر را از روی میز نکوبید) و به چپ بپیچید
  • به چپ بپیچید و یک قدم به جلو بردارید.

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

راه اشتباه:

  • کشتی را به (10،0،0) منتقل کنید. مرکز آن اکنون 10 x از مرکز فاصله دارد.
  • ما اندازه کشتی خود را 2 برابر افزایش می دهیم. هر مختصات نسبت به مرکز در 2 ضرب می شود که دور است... و در نتیجه کشتی به اندازه لازم اما در موقعیت 2*10=20 به دست می آید. که دقیقاً آن چیزی نیست که ما می خواستیم.

راه درست:

  • اندازه کشتی را 2 برابر افزایش می دهیم. اکنون یک کشتی بزرگ در مرکز داریم.
  • کشتی را حرکت می دهیم. اندازه کشتی تغییر نکرده است و در مکان مناسبی قرار گرفته است.
ضرب یک ماتریس در یک ماتریس تقریباً مانند ضرب یک ماتریس در یک بردار انجام می شود. ما وارد جزئیات نمی شویم، اما اجازه دهید کنجکاوها آن را از منابع تخصصی بخوانند. ما به سادگی به کتابخانه GLM تکیه خواهیم کرد.
BC++:
glm::mat4 myModelMatrix = myTranslationMatrix * myRotationMatrix * myScaleMatrix;
glm::vec4 myTransformedVector = myModelMatrix * myOriginalVector;
در GLSL:
تبدیل mat4 = mat2 * mat1;
vec4 out_vec = تبدیل * in_vec;

ماتریس های مدل، نمایش و طرح ریزی

برای مثال، فرض می‌کنیم که قبلاً می‌دانیم چگونه مدل سه‌بعدی بلندر مورد علاقه خود - سر سوزان میمون - را در OpenGL بکشیم.

ماتریس های مدل، نما و طرح ریزی یک روش بسیار کاربردی برای جداسازی تبدیل ها هستند. اگر واقعاً می خواهید، نمی توانید از آنها استفاده کنید (ما در درس 1 و 2 از آنها استفاده نکردیم). اما اکیدا توصیه می کنم از آنها استفاده کنید. فقط تقریباً تمام کتابخانه های سه بعدی، بازی ها و غیره از آنها برای جداسازی تبدیل ها استفاده می کنند.

ماتریس مدل

این مدل مانند مثلث مورد علاقه ما با مجموعه ای از رئوس تعریف می شود. مختصات X، Y، Z نسبت به مرکز جسم هستند. بنابراین، اگر راس در مختصات (0،0،0) قرار داشته باشد، آنگاه در مرکز کل جسم قرار دارد.

اکنون می توانیم مدل خود را جابجا کنیم. به عنوان مثال، به این دلیل که کاربر آن را با استفاده از صفحه کلید و ماوس کنترل می کند. انجام این کار بسیار آسان است: مقیاس * چرخش * حرکت و تمام. شما ماتریس خود را به همه رئوس در هر فریم (در GLSL و نه در C++) اعمال می کنید و همه چیز حرکت می کند. هر چیزی که حرکت نمی کند در مرکز "جهان" قرار دارد.

رئوس در فضای جهان هستند فلش سیاه در شکل نشان می دهد که چگونه از فضای مدل به فضای جهان حرکت می کنیم (همه راس ها نسبت به مرکز مدل تنظیم شده اند و اکنون نسبت به مرکز جهان تنظیم شده اند)

این تبدیل را می توان با نمودار زیر نشان داد:


مشاهده ماتریس

بیایید دوباره نقل قول فوتوراما را بخوانیم:

«موتور کشتی را حرکت نمی دهد. کشتی در جای خود می ماند و موتورها جهان را در اطراف آن حرکت می دهند.


همین امر را می توان در مورد دوربین نیز اعمال کرد. اگر می خواهید از هر زاویه ای از یک کوه عکس بگیرید، می توانید دوربین یا کوه را حرکت دهید. در زندگی واقعی، این غیر ممکن است، اما در گرافیک کامپیوتری بسیار آسان و راحت است.

به طور پیش فرض، دوربین ما در مرکز مختصات جهانی قرار دارد. برای اینکه دنیای خود را به حرکت درآوریم، باید یک ماتریس جدید ایجاد کنیم. برای مثال، باید دوربین خود را 3 واحد به سمت راست (+X) حرکت دهیم. این همان حرکت دادن کل جهان 3 واحد به سمت چپ (-X) است. و در حالی که مغز شما در حال ذوب شدن است، بیایید تلاش کنیم:


// از #include استفاده کنید و #شامل


glm::mat4 ViewMatrix = glm::translate(-3.0f, 0.0f،0.0f)؛

تصویر زیر این را نشان می دهد: ما از فضای جهان (همه رئوس نسبت به مرکز جهان هستند همانطور که در بخش قبل انجام دادیم) به فضای دوربین (همه رئوس نسبت به دوربین هستند) حرکت می کنیم.

و قبل از اینکه سرتان واقعا منفجر شود، این ویژگی عالی را از GLM خوب قدیمی ما بررسی کنید:

glm::mat4 CameraMatrix = glm::LookAt(


موقعیت دوربین، // موقعیت دوربین در مختصات جهان


cameraTarget, // نقطه ای که می خواهیم در مختصات جهان به آن نگاه کنیم


upVector// احتمال بیشتری دارد glm:: vec3(0,1,0) و (0,-1,0) همه چیز را وارونه نشان می دهد که گاهی اوقات نیز جالب است.


در اینجا یک تصویر از موارد بالا آورده شده است:


اما برای خوشحالی ما، این همه چیز نیست.

ماتریس پروجکشن

اکنون مختصاتی در فضای دوربین داریم. این بدان معنی است که پس از تمام این تبدیل ها، که راس آن در x==0 است و y==0 در مرکز صفحه نمایش داده می شود. اما ما نمی‌توانیم فقط از مختصات X,Y برای فهمیدن اینکه راس را کجا رسم کنیم استفاده کنیم: فاصله تا دوربین (Z) نیز باید در نظر گرفته شود! اگر دو راس داشته باشیم، یکی از آنها به مرکز صفحه نزدیکتر از دیگری خواهد بود، زیرا دارای مختصات Z بزرگتر است.

به این طرح ریزی چشم انداز می گویند:


و برای خوشحالی ما، ماتریس 4x4 همچنین می تواند تحولات امیدوار کننده ای را نشان دهد:

glm::mat4 projectionMatrix = glm::perspective(


FoV, // کادر نمای افقی بر حسب درجه. یا اندازهتقریب. چگونهمثل اینکه « لنز» بر رویدوربین. معمولاً بین 90 (فوق العاده پهن، مانند چشم ماهی) تا 30 (مانند یک جاسوسی کوچک)


4.0 f / 3.0 f، // نسبت ابعاد. بستگی به اندازه پنجره شما دارد. مثلاً 4/3 == 800/600 == 1280/960 آشنا به نظر می رسد، اینطور نیست؟


0.1 f, // نزدیک به میدان برش. باید تا حد امکان بزرگ تنظیم شود، در غیر این صورت در دقت مشکلاتی وجود خواهد داشت.


100.0 f // میدان برش دور. شما باید آن را تا حد امکان کوچک نگه دارید.


);

بیایید آنچه را که انجام دادیم تکرار کنیم:

ما از فضای دوربین (همه رئوس در مختصات نسبت به دوربین قرار می‌گیرند) به فضای همگن رفته‌ایم (همه رئوس در مختصات یک مکعب کوچک هستند (-1،1). هر چیزی که در مکعب است روی صفحه است.)

و نمودار نهایی:


در اینجا یک تصویر دیگر وجود دارد تا واضح تر شود وقتی همه این مزخرفات ماتریس طرح ریزی را ضرب می کنیم چه اتفاقی می افتد. قبل از ضرب در ماتریس پروجکشن، اشیاء آبی را در فضای دوربین و یک جسم قرمز داریم که نمایانگر میدان دید دوربین است: فضایی که به لنز دوربین می‌افتد:

پس از ضرب در ماتریس پروجکشن، به صورت زیر می رسیم:

در تصویر قبلی، نما به یک مکعب کامل تبدیل شده است (با مختصات راس از 1- تا 1 در تمام محورها.) و همه اشیا در پرسپکتیو تغییر شکل داده اند. تمام اجسام آبی که نزدیک دوربین هستند بزرگ می شوند و آنهایی که دورتر هستند کوچک می شوند. درست مثل زندگی!

در اینجا نمای ما از "عدسی" است:

با این حال، مربع است و یک تبدیل ریاضی دیگر باید اعمال شود تا تصویر متناسب با پنجره باشد.

برای چرخاندن اجسام (یا دوربین)، به یک پایه ریاضی جدی نیاز است که با کمک آن، مختصات همه اشیاء هنگام نمایش بر روی یک صفحه رایانه "مسطح" محاسبه می شود. می خواهم فوراً بگویم که نباید بترسید، تمام کتابخانه های ریاضی قبلاً برای ما نوشته شده است، ما فقط از آنها استفاده خواهیم کرد. در هر صورت متن زیر را صرف نظر از سطح دانش ریاضی نباید نادیده گرفت.

1. ماتریس ها، مفاهیم کلی

ماتریس ها چیست؟ بیایید ریاضیات بالاتر را به خاطر بسپاریم: ماتریس مجموعه ای از اعداد با ابعاد از پیش تعیین شده سطرها و ستون ها است.

ماتریس ها را می توان اضافه کرد، در یک عدد ضرب کرد، با یکدیگر ضرب کرد و بسیاری چیزهای جالب دیگر، اما ما از این لحظه می گذریم، زیرا. در هر کتاب درسی ریاضیات عالی با جزئیات کافی توضیح داده شده است (کتاب های درسی را می توان در google.com جستجو کرد). ما از ماتریس ها به عنوان برنامه نویس استفاده می کنیم، آنها را پر می کنیم و می گوییم که با آنها چه کار کنیم، تمام محاسبات توسط کتابخانه ریاضی Direct3D انجام می شود، بنابراین باید ماژول هدر d3dx9.h (و کتابخانه d3dx9.lib) را نیز اضافه کنیم. در پروژه

وظیفه ما ایجاد یک شی است، یعنی. ماتریس را با مختصات رئوس جسم پر کنید. هر رأس یک بردار (X، Y، Z) در فضای سه بعدی است. حال برای انجام عملی باید شیء خود (یعنی ماتریس) را بگیریم و در ماتریس تبدیل ضرب کنیم، نتیجه این عمل یک شی جدید به عنوان ماتریس است.

سه ماتریس اصلی در Direct3D تعریف و استفاده می شود: ماتریس جهان، ماتریس view و ماتریس طرح ریزی. بیایید آنها را با جزئیات بیشتری در نظر بگیریم.

ماتریس جهانی- به شما امکان می دهد یک شی را بچرخانید، تبدیل و مقیاس دهید، و همچنین به هر یک از اشیا سیستم مختصات محلی خود را می دهد.

توابع کار با ماتریس جهان:

  • D3DXMatrixRotationX()، D3DXMatrixRotationY()، D3DXMatrixRotationZ() - چرخش نقطه نسبت به یکی از محورها.
  • D3DXMatrixTranslation() - انتقال یک نقطه به موقعیت دیگر.
  • D3DXMatrixScale() - مقیاس بندی.

    مشاهده ماتریس- محل دوربین نمای صحنه را مشخص می کند و می تواند از هر ترکیبی از ترجمه و چرخش تشکیل شود.
    D3DXMatrixLookAtLH() و D3DXMatrixLookAtRH() موقعیت دوربین و زاویه دید را به ترتیب برای سیستم مختصات چپ و راست تعریف می کنند.

    ماتریس پروجکشن- نمایش یک صحنه سه بعدی را بر روی صفحه نمایش مانیتور ایجاد می کند. با کمک آن، جسم تبدیل می شود، مبدا به قسمت جلو منتقل می شود، و هواپیماهای برش جلو و عقب نیز تعیین می شوند.

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

    2. یک شی بسازید

    ما یک پروژه جدید، مشابه پروژه اول ایجاد می کنیم. قبل از اینکه به پیچیده‌تر کردن کد خود ادامه دهیم، اجازه دهید آن را به بخش‌هایی تقسیم کنیم تا خوانایی کد بهتر باشد. پروژه ما به طور منطقی به سه جزء تقسیم می شود:
    1. پنجره ویندوز (راه اندازی اولیه پنجره، پیام ها، ...)
    2. مقداردهی اولیه سه بعدی (بارگیری مختصات شیء، حذف منابع، ...)
    3. رندر صحنه (ماتریس، رسم اولیه، ...)
    در نتیجه، ما 3 فایل خواهیم داشت - window.cpp، init3d.h، render.h با محتوای زیر: init3d.h- انتقال متغیرها و ساختارهای جهانی، اعلان تابع، توابع InitDirectX()، InitBufferVertex()، Destroy3D() render.h- تابع RenderScene() را حرکت دهید، تنها چیزی که باقی می ماند پنجره اصلی است، یک فایل خواهد بود - window.cpp.

    افزودن یک فایل هدر و یک کتابخانه برای استفاده از توابع ماتریس

    #عبارتند از // یا C:\DXSDK\Include\d3dx9.h #کامنت pragma(lib, "d3dx9.lib") //یا C:\\DXSDK\\Lib\\d3dx9.lib

    همچنین برای کار با زمان به توابع استاندارد نیاز داریم، بنابراین فایل هدر مناسب را اضافه می کنیم:

    #عبارتند از

    بیایید فرمت نمایش راس را تغییر دهیم:

    #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ/D3DFVF_DIFFUSE) ساخت CUSTOMVERTEX ( شناور x، y، z; DWORDرنگ؛ )

    ما از نوع راس تبدیل نشده استفاده خواهیم کرد، زیرا تبدیل ها توسط ماتریس ها انجام خواهد شد.
    کد تابع InitDirectX() را تغییر می دهیم. در این عملکرد، باید تنظیمات دو حالت نمایش را اضافه کنید.
    حالت برش را خاموش کنید تا هنگام چرخش، بتوانید همه طرف های جسم را ببینید:

    PDirectDevice->SetRenderState(D3DRS_CULLMODE، D3DCULL_NONE)؛

    در حال حاضر از نورپردازی استفاده نمی کنیم، بلکه روی رئوس را با رنگ خاصی رنگ می کنیم، بنابراین نور را خاموش کنید:

    PDirectDevice->SetRenderState(D3DRS_LIGHTING، FALSE)؛

    بیایید قلب خود را با نمایش آن به شکل سه مثلث ساده کنیم. ما از سیستم مختصات محلی استفاده خواهیم کرد.


    CUSTOMVERTEX stVertex= ( ( -1.0f، 0.5f، 0.0f، 0x00ff0000)، (0.5-f، 1.0f، 0.0f، 0x00ff0000)، ( 0.0f، 0.5f، 0.0f، 0.0f، 0.0f، 0.0f، 0.0 f، 0.0f، 0x000000ff)، (0.5f، 1.0f، 0.0f، 0x000000ff)، (1.0f، 0.5f، 0.0f، 0x000000ff)، (-1.0f، 0.0f (0.5f، 0.5f) f، 0.5f، 0.0f، 0x0000ff00)، (0.0f، -1.0f، 0.0f، 0x0000ff00)، )؛

    3. ایجاد ماتریس های تبدیل

    بیایید تابع SetupMatrix() را در فایل render.h بنویسیم، که در آن تمام اقدامات روی ماتریس ها انجام می شود.

    بیایید ماتریس ایجاد کنیم:

  • D3DXMATRIX MatrixWorld; - ماتریس جهان
  • D3DXMATRIX MatrixView; - مشاهده ماتریس
  • D3DXMATRIX MatrixProjection; - ماتریس طرح ریزی
    نصب ماتریس جهان

    برای اینکه جسم بچرخد، لازم است زمان سیستم و هر "لحظه" برای تغییر زاویه بین سیستم مختصات محلی و سیستم مختصات جهانی بدست آید. ما حول محور X می چرخیم، بنابراین از تابع D3DXMatrixRotationX استفاده می کنیم. پس از محاسبه ماتریس جهان، باید مقادیر آن را با استفاده از تابع SetTransform اعمال کنید:

    UINT iTime=timeGetTime()%5000; FLOAT fAngle=iTime*(2.0f*D3DX_PI)/5000.0f; D3DXMatrixRotationX(&MatrixWorld، fAngle); pDirectDevice->SetTransform(D3DTS_WORLD، &MatrixWorld)؛ تنظیم View Matrix

    دوربین را در جای مناسب نصب کنید و آن را به سمت جسم بگیرید

  • D3DXMatrixLookAtLH(&MatrixView، - نتیجه اجرای تابع
  • &D3DXVECTOR3(0.0f، 0.0f، -8.0f)، - نقطه ای که دوربین در آن قرار دارد
  • &D3DXVECTOR3(0.0f، 0.0f، 0.0f)، - نقطه ای که ما به آن نگاه می کنیم
  • &D3DXVECTOR3(0.0f، 1.0f، 0.0f)); - بالای جسم

    پس از محاسبه، لازم است مقادیر به دست آمده اعمال شود.

  • موتور کشتی را حرکت نمی دهد. کشتی در جای خود می ماند و موتور نسبت به آن کیهان را به حرکت در می آورد.

    این بخش بسیار مهمی از دروس است، مطمئن شوید که آن را چندین بار بخوانید و به خوبی متوجه شوید.

    مختصات همگن

    تا به حال، ما روی رئوس سه بعدی به صورت سه گانه (x، y، z) کار می کردیم. یک پارامتر دیگر w را معرفی می کنیم و با بردارهای شکل (x, y, z, w) عمل می کنیم.

    برای همیشه به یاد داشته باشید که:

    • اگر w == 1 باشد، بردار (x، y، z، 1) موقعیتی در فضا است.
    • اگر w == 0 باشد، بردار (x، y، z، 0) جهت است.

    این چه چیزی به ما می دهد؟ خوب، برای چرخش چیزی را تغییر نمی دهد، زیرا در صورت چرخش نقطه و در صورت چرخش بردار جهت، نتیجه یکسانی به دست می آید. اما در مورد نقل و انتقال، تفاوت وجود دارد. حرکت بردار جهت همان بردار را به دست می دهد. بعداً در این مورد با جزئیات بیشتر صحبت خواهیم کرد.

    مختصات همگن به ما امکان می دهد در هر دو مورد با استفاده از یک فرمول ریاضی با بردارها کار کنیم.

    ماتریس های تبدیل

    مقدمه ای بر ماتریس ها

    ساده ترین راه این است که یک ماتریس را به عنوان آرایه ای از اعداد، با تعداد سطر و ستون کاملاً مشخص در نظر بگیرید. به عنوان مثال، یک ماتریس 2x3 به شکل زیر است:

    با این حال، در 3D، ما فقط از ماتریس های 4x4 استفاده می کنیم که به ما امکان می دهد راس های خود را تبدیل کنیم (x, y, z, w). راس تبدیل شده حاصل ضرب ماتریس در خود راس است:

    ماتریس x راس (به ترتیب!!) = تبدیل. راس

    خیلی ساده. ما اغلب از این استفاده خواهیم کرد، بنابراین منطقی است که این را به رایانه بسپاریم:

    در C++ با استفاده از GLM:

    glm::mat4 myMatrix; glm::vec4 myVector; glm :: // به سفارش توجه کنید! او مهم است!

    در GLSL:

    mat4 myMatrix ; vec4 myVector ; // فراموش نکنید که ماتریس و بردار را با مقادیر مورد نیاز در اینجا پر کنید vec4 transformedVector = myMatrix * myVector ; // بله، خیلی شبیه GLM است :)

    سعی کنید با این تکه ها آزمایش کنید.

    ماتریس انتقال

    ماتریس انتقال به شکل زیر است:

    که در آن X، Y، Z مقادیری هستند که می خواهیم به بردار خود اضافه کنیم.

    بنابراین اگر بخواهیم بردار (10، 10، 10، 1) را 10 واحد در جهت X حرکت دهیم، به دست می آید:

    ... یک بردار همگن (20، 10، 10، 1) می گیریم! فراموش نکنید که 1 در پارامتر w به معنای موقعیت است، نه جهت، و تبدیل ما این واقعیت را تغییر نداد که ما با موقعیت کار می کنیم.

    حال بیایید ببینیم اگر بردار (0، 0، -1، 0) یک جهت را نشان دهد چه اتفاقی می افتد:

    ... و بردار اصلی ما (0، 0، -1، 0) را دریافت کنید. همانطور که قبلا ذکر شد، یک بردار با پارامتر w = 0 نمی تواند جابجا شود.

    و زمان انتقال آن به کد فرا رسیده است.

    در C++، با GLM:

    #عبارتند از // بعد از glm::mat4 myMatrix = glm::translate(glm::mat4()، glm::vec3(10.0 f , 0.0 f , 0.0 f )); glm :: vec4 myVector(10.0 f , 10.0 f , 10.0 f , 0.0 f ); glm :: vec4 transformedVector = myMatrix * myVector ;

    در GLSL:

    vec4 transformedVector = myMatrix * myVector ;

    در واقع، شما هرگز این کار را در سایه زن انجام نمی دهید، اغلب برای محاسبه ماتریس، glm::translate() را در C++ انجام می دهید، آن را به GLSL ارسال می کنید و سپس ضرب را در سایه زن انجام می دهید.

    ماتریس هویت

    این ماتریس خاصی است که هیچ کاری انجام نمی دهد، اما ما در حال لمس آن هستیم زیرا مهم است که به خاطر داشته باشید که A بار 1.0 A را می دهد:

    در C++:

    glm::mat4 myIdentityMatrix = glm::mat4(1.0 f );

    ماتریس مقیاس بندی

    همچنین ساده به نظر می رسد:

    بنابراین، اگر می‌خواهید مقیاس برداری (موقعیت یا جهت - مهم نیست) را با 2.0 در همه جهات اعمال کنید، باید:

    توجه داشته باشید که w تغییر نمی کند و همچنین توجه داشته باشید که ماتریس هویت یک مورد خاص از یک ماتریس مقیاس با ضریب مقیاس 1 در همه محورها است. همچنین ماتریس هویت یک مورد خاص از ماتریس انتقال است که به ترتیب (X, Y, Z) = (0, 0, 0) است.

    در C++:

    // اضافه کردن #include و #شامل glm :: mat4 myScalingMatrix = glm :: scale(2.0 f , 2.0 f , 2.0 f );

    ماتریس چرخش

    دشوارتر از آنچه قبلاً بحث شد. ما در اینجا جزئیات را حذف خواهیم کرد، زیرا برای استفاده روزانه نیازی به دانستن دقیق آن ندارید. برای اطلاعات بیشتر، می‌توانید به پیوند پرسش‌های متداول ماتریس‌ها و کواترنیون‌ها بروید (یک منبع کاملاً محبوب و زبان شما احتمالاً در آنجا موجود است)

    در C++:

    // اضافه کردن #include و #شامل glm :: vec3 myRotationAxis ( ?? , ?? , ?? ); glm :: rotate( angle_in_degrees , myRotationAxis );

    کنار هم قرار دادن تحولات

    بنابراین اکنون می‌توانیم بردارهای خود را بچرخانیم، ترجمه و مقیاس کنیم. گام بعدی برای ترکیب تبدیل ها خوب است که با فرمول زیر اجرا می شود:

    TransformedVector = TranslationMatrix * RotationMatrix * ScaleMatrix * Original Vector ;

    توجه! این فرمول در واقع نشان می دهد که ابتدا مقیاس بندی انجام می شود، سپس چرخش و تنها ترجمه در آخر انجام می شود. ضرب ماتریس به این صورت است.

    حتماً ترتیب انجام همه این کارها را به خاطر بسپارید، زیرا ترتیب واقعاً مهم است، در پایان می توانید خودتان آن را بررسی کنید:

    • یک قدم به جلو بردارید و به چپ بپیچید
    • به چپ بپیچید و یک قدم به جلو بردارید

    درک تفاوت واقعاً مهم است، زیرا دائماً با آن روبرو خواهید شد. به عنوان مثال، وقتی با شخصیت های بازی یا برخی از اشیاء کار می کنید، همیشه ابتدا مقیاس را تغییر دهید، سپس بچرخانید و تنها سپس ترجمه کنید.

    در واقع، ترتیب بالا همان چیزی است که معمولاً برای شخصیت‌های قابل بازی و موارد دیگر می‌خواهید: در صورت لزوم ابتدا آن را مقیاس کنید. سپس جهت آن را تنظیم کنید و سپس آن را حرکت دهید. به عنوان مثال، برای یک مدل کشتی (چرخ ها برای سادگی حذف شده اند):

    • راه اشتباه:
      • شما کشتی را به (10، 0، 0) منتقل می کنید. مرکز آن اکنون 10 واحد از مبدا فاصله دارد.
      • کشتی خود را 2 برابر می کنید. هر مختصات در 2 "نسبت به اصلی" ضرب می شود، که بسیار زیاد است... بنابراین، شما وارد یک کشتی بزرگ می شوید، اما مرکز آن 2 * 10 = 20 است. نه آن چیزی که شما می خواستید.
    • راه درست:
      • کشتی خود را 2 برابر می کنید. شما یک کشتی بزرگ با محوریت مبدا دریافت می کنید.
      • شما در حال حرکت کشتی خود هستید. هنوز هم به همان اندازه و در فاصله درست است.

    در C++، با GLM:

    glm :: mat4 myModelMatrix = myTranslationMatrix * myRotationMatrix * myScaleMatrix ; glm :: vec4 myTransformedVector = myModelMatrix * myOriginalVector ;

    در GLSL:

    تبدیل mat4 = mat2 * mat1 ; vec4 out_vec = تبدیل * in_vec ;

    جهان، نما و ماتریس های طرح ریزی

    برای بقیه این آموزش، فرض می‌کنیم که می‌دانیم چگونه مدل سه بعدی مورد علاقه بلندر، سوزان میمون را رندر کنیم.

    ماتریس های جهان، نما و طرح ریزی ابزاری مفید برای جداسازی تبدیل ها هستند.

    ماتریس جهانی

    این مدل، و همچنین مثلث قرمز ما، با مجموعه‌ای از رئوس تعریف می‌شود که مختصات آنها نسبت به مرکز جسم تنظیم می‌شود، یعنی راس با مختصات (0، 0، 0) در مرکز جسم خواهد بود.

    در مرحله بعد، می‌خواهیم مدل خود را همانطور که پخش کننده آن را با صفحه کلید و ماوس کنترل می‌کند، جابه‌جا کنیم. تنها کاری که انجام می دهیم این است که مقیاس گذاری را اعمال می کنیم، سپس می چرخانیم و ترجمه می کنیم. این اقدامات برای هر رأس، در هر فریم (در GLSL انجام می شود، نه در C ++!) انجام می شود و بنابراین مدل ما روی صفحه حرکت می کند.

    اکنون رئوس ما در فضای جهان هستند. این با فلش سیاه در شکل نشان داده شده است. ما از فضای جسم (همه رئوس نسبت به مرکز جسم هستند) به فضای جهانی (همه رئوس نسبت به مرکز جهان هستند) حرکت کرده ایم.

    به صورت شماتیک، این به صورت زیر نشان داده شده است:

    مشاهده ماتریس

    برای نقل قول مجدد از Futurama:

    موتور کشتی را حرکت نمی دهد. کشتی در همان مکان می ماند و موتور کیهان را در اطراف آن به حرکت در می آورد.

    سعی کنید این را در رابطه با دوربین تصور کنید. به عنوان مثال، اگر می خواهید از یک کوه عکس بگیرید، دوربین را حرکت نمی دهید، کوه را حرکت می دهید. در زندگی واقعی امکان پذیر نیست، اما در گرافیک کامپیوتری فوق العاده آسان است.

    بنابراین، در ابتدا دوربین شما در مرکز سیستم مختصات جهان قرار دارد. برای حرکت دادن جهان باید ماتریس دیگری را وارد کنید. فرض کنید می خواهید دوربین را 3 واحد به راست (+X) حرکت دهید، که معادل حرکت کل جهان به اندازه 3 واحد به چپ (-X) خواهد بود. در کد به شکل زیر است:

    // #include را اضافه کنید و #شامل glm::mat4 ViewMatrix = glm::translate(glm::mat4()، glm::vec3(- 3.0 f , 0.0 f , 0.0 f ));

    باز هم تصویر زیر این را به طور کامل نشان می دهد. ما از سیستم مختصات جهانی (همه رئوس نسبت به مرکز سیستم جهانی تنظیم می شوند) به سیستم مختصات دوربین (همه راس ها نسبت به دوربین تنظیم می شوند) تغییر مکان دادیم:

    و در حالی که مغز شما در حال هضم این موضوع است، بیایید نگاهی به عملکردی که GLM به ما ارائه می دهد بیندازیم، به طور خاص glm::LookAt:

    glm::mat4 CameraMatrix = glm::LookAt( cameraPosition , // موقعیت دوربین در فضای جهاندوربین هدف، // نشان می دهد که در فضای جهان به کجا نگاه می کنید upVector // برداری که جهت رو به بالا را نشان می دهد. معمولا (0، 1، 0));

    و در اینجا یک نمودار است که نشان می دهد که ما چه کاری انجام می دهیم:

    با این حال، این پایان کار نیست.

    ماتریس طرح ریزی

    بنابراین اکنون در فضای دوربین هستیم. این بدان معناست که راسی که مختصات x == 0 و y == 0 را دریافت می کند در مرکز صفحه نمایش داده می شود. با این حال، هنگام نمایش یک شی، فاصله تا دوربین (z) نیز نقش زیادی دارد. برای دو راس با x و y یکسان، راس با مقدار z بیشتر نزدیکتر از دیگری ظاهر می شود.

    به این طرح ریزی چشم انداز می گویند:

    و خوشبختانه برای ما، یک ماتریس 4x4 می تواند این طرح را انجام دهد:

    // یک ماتریس بسیار سخت برای خواندن ایجاد می کند، اما همچنان یک ماتریس استاندارد 4x4 است glm::mat4 projectionMatrix = glm::perspective(glm::radians(FoV) // میدان دید عمودی بر حسب رادیان. معمولاً بین 90 درجه (بسیار عریض) و 30 درجه (باریک) 4.0f / 3.0f، // نسبت تصویر. بستگی به اندازه پنجره شما دارد. توجه داشته باشید که 4/3 == 800/600 == 1280/960 0.1f // نزدیک هواپیمای کلیپینگ. باید بزرگتر از 0 باشد. 100.0f // هواپیمای برش دور.);

    ما از Camera Space (همه رئوس نسبت به دوربین تنظیم شده اند) به فضای یکنواخت (همه رئوس در یک مکعب کوچک هستند. همه چیز در داخل مکعب نمایش داده می شود) حرکت کرده ایم.

    حالا بیایید به تصاویر زیر نگاه کنیم تا بتوانید بهتر متوجه شوید که چه اتفاقی در پروجکشن می افتد. قبل از فرافکنی، اشیاء آبی در فضای دوربین داریم، در حالی که شکل قرمز نمای دوربین را نشان می دهد، یعنی هر چیزی که دوربین می بیند.

    اعمال ماتریس پروجکشن تأثیر زیر را دارد:

    در این تصویر نمای دوربین به صورت مکعبی است و تمامی اجسام تغییر شکل داده اند. اشیایی که به دوربین نزدیکتر هستند بزرگ و آنهایی که دورتر هستند - کوچک نمایش داده می شوند. درست مثل واقعیت!

    به این صورت خواهد بود:

    تصویر مربع است، بنابراین تبدیل‌های ریاضی زیر برای کشش تصویر برای تناسب با ابعاد واقعی پنجره اعمال می‌شود:

    و این تصویر چیزی است که در واقع نمایش داده خواهد شد.

    ترکیب تبدیل ها: ماتریس ModelViewProjection

    ... فقط تبدیلات ماتریسی استانداردی را که قبلاً دوست دارید!

    // C++ : محاسبه ماتریس glm :: mat4 MVPmatrix = projection * view * model ; // یاد آوردن! به ترتیب معکوس!

    // GLSL: اعمال ماتریس transformed_vertex = MVP * in_vertex ;

    همه اش را بگذار کنار هم

    • اولین قدم این است که ماتریس MVP خود را ایجاد کنیم. این باید برای هر مدلی که نمایش می دهید انجام شود.

    // ماتریس پروجکشن: میدان دید 45 درجه، نسبت تصویر 4:3، محدوده: 0.1 واحد<->100 واحد glm :: mat4 Projection = glm :: پرسپکتیو (glm :: رادیان (45.0 f ), 4.0 f / 3.0 f , 0.1 f , 100.0 f ); // یا، برای دوربین ارتو glm :: mat4 View = glm :: lookAt ( glm :: vec3 (4 , 3 , 3 ) // دوربین در مختصات جهانی است (4،3،3) glm::vec3(0, 0, 0), // و به مبدأ هدایت شد glm::vec3(0 , 1 , 0 ) // "سر" در بالا است); // ماتریس مدل: ماتریس هویت (مدل در مبدا است) glm::mat4 Model = glm::mat4(1.0 f ); // به صورت جداگانه برای هر مدل // ماتریس ModelViewProjection به دست آمده، که حاصل ضرب سه ماتریس ما است. glm :: mat4 MVP = Projection * View * Model ; // به یاد داشته باشید که ضرب ماتریس به ترتیب معکوس انجام می شود

    • مرحله دوم این است که این را به GLSL منتقل کنید:

    // دسته متغیر را در سایه زن دریافت کنید // فقط یک بار در طول مقداردهی اولیه. GLuint MatrixID = glGetUniformLocation(شناسه برنامه، "MVP"); // تبدیل‌هایمان را به سایه‌زن فعلی منتقل کنیم // این کار در حلقه اصلی انجام می‌شود زیرا هر مدل ماتریس MVP متفاوتی خواهد داشت (حداقل قسمت M) glUniformMatrix4fv(MatrixID , 1 , GL_FALSE , & MVP [ 0 ][ 0 ]);

    • مرحله سوم استفاده از داده های به دست آمده در GLSL برای تبدیل رئوس است.

    // داده های ورودی Vertex، برای همه اجرای این سایه زن متفاوت است.طرح بندی (مکان = 0) در vec3 vertexPosition_modelspace; // مقادیری که برای کل شبکه ثابت می مانند.یکنواخت mat4 MVP ; void main()( // موقعیت خروجی راس ما: موقعیت MVP * gl_Position = MVP * vec4(vertexPosition_modelspace , 1 ); )

    • آماده! اکنون همان مثلث درس 2 را داریم که همچنان در مبدا قرار دارد (0، 0، 0)، اما اکنون آن را در پرسپکتیو از نقطه (4، 3، 3) می بینیم.

    در درس 6، یاد خواهید گرفت که چگونه این مقادیر را به صورت پویا با استفاده از صفحه کلید و ماوس تغییر دهید تا دوربینی را ایجاد کنید که در بازی ها به دیدن آن عادت دارید. اما ابتدا یاد می گیریم که چگونه به مدل های خود رنگ (درس 4) و بافت (درس 5) بدهیم.

    وظایف

    • مقادیر glm::perspective را تغییر دهید
    • به جای استفاده از طرح ریزی پرسپکتیو، سعی کنید از متعامد (glm:ortho) استفاده کنید.
    • ModelMatrix را تغییر دهید تا مثلث را حرکت دهید، بچرخانید و مقیاس دهید
    • از وظیفه قبلی استفاده کنید، اما با ترتیب عملیات متفاوت. به نتیجه توجه کنید.

    طرح ریزی چشم انداز

    ما پیش بینی های مهم مورد استفاده در هندسه افین را در نظر گرفته ایم. حالا بیایید به هندسه پرسپکتیو و چند نوع جدید طرح ریزی برویم.

    در عکس ها، نقاشی ها، روی صفحه نمایش، تصاویر برای ما طبیعی و درست به نظر می رسند. به این تصاویر پرسپکتیو می گویند. خواص آنها به گونه ای است که اجسام دورتر در مقیاس کوچکتر به تصویر کشیده می شوند، خطوط موازی به طور کلی غیر موازی هستند. در نتیجه، هندسه تصویر کاملاً پیچیده است و تعیین اندازه بخش های خاصی از جسم از روی تصویر تمام شده دشوار است.

    طرح پرسپکتیو معمولی یک طرح ریزی مرکزی بر روی صفحه ای است که پرتوهای مستقیم از یک نقطه - مرکز طرح رد می شوند. یکی از پرتوهای بیرون افکن عمود بر صفحه تابش است و اصلی نامیده می شود. نقطه تلاقی این پرتو و صفحه برآمده نقطه اصلی تصویر است.

    سه سیستم مختصات وجود دارد. به طور معمول یک برنامه نویس کار می کند و داده های مربوط به اجسام هندسی را در مختصات جهان نگه می دارد. برای افزایش واقع گرایی، در آماده سازی برای نمایش تصویر روی صفحه، داده های مربوط به اشیاء از مختصات جهان به مختصات مشاهده تبدیل می شوند. و فقط در لحظه نمایش مستقیم تصویر روی صفحه نمایش به مختصات صفحه تغییر می کنند که تعداد پیکسل های صفحه نمایش است.

    دو سیستم اول را می توان در سیستم های مختصات چند بعدی استفاده کرد، اما سیستم آخر فقط در دو بعد قابل استفاده است. عملیات برگشت ناپذیر است، یعنی غیرممکن است که یک تصویر سه بعدی را از یک تصویر طرح ریزی شده دو بعدی بازیابی کنید.

    در این ماتریس، عناصر آ, د, همسئول مقیاس بندی متر, n, L- برای جابجایی پ, q, r- برای فرافکنی س- برای مقیاس بندی پیچیده، ایکس- برای چرخش

    طرح ریزی یک نقطه ای بر روی صفحه z = 0

    ماهیت این طرح به شرح زیر است: هر چه جسم عمیق‌تر باشد، مقدار مختصات z بیشتر می‌شود و مخرج rz + 1 می‌شود، و بنابراین، جسم در صفحه نمایش کوچک‌تر به نظر می‌رسد. ما محاسبات ساده را انجام می دهیم و آنها را به صورت گرافیکی توضیح می دهیم:
    معادله x"/F = x/(F + z pr) معادل است با: x" = xF/(F + z pr) = x/(1 + z pr /F) = x/(1 + rz pr)، جایی که r = 1/F، F - فوکوس.

    برای ایجاد نقاطی که روی خطی موازی با محور قرار دارند z، یکی پس از دیگری گم نمی شوند، از طرح ریزی یک نقطه ای روی خط استفاده می شود (به ماتریس تبدیل و برنج. 4.2) مختصات z ناپدید شده است، اما با کوچکتر شدن اجسام دور از اجسام مشابه نزدیک، بیننده احساس عمق می کند. به یاد داشته باشید: این اولین راه برای انتقال عمق در هواپیما است!

    برترین مقالات مرتبط