اشیای هندسی، بردارها، فضاهای آفین و دستگاههای مختصات
فصل ۳ — اشیای هندسی و تبدیلها
اکنون آمادهایم تمرکز خود را بر گرافیک سهبعدی بگذاریم. بخش بزرگی از این فصل به این موضوعها اختصاص دارد که انواع هندسی پایه را چگونه نمایش دهیم، چگونه میان نمایشهای گوناگون تبدیل انجام دهیم، و دربارهٔ اشیای هندسی چه گزارههایی میتوان مستقل از یک نمایش خاص بیان کرد.
بحث را با بررسی پایههای ریاضی گرافیک رایانهای آغاز میکنیم. این رویکرد از بسیاری سردرگمیهایی جلوگیری میکند که از تمایز ندادن دقیق میان یک موجودیت هندسی، نمایش آن در یک دستگاه مرجع خاص و انتزاع ریاضی آن ناشی میشوند.
برای ایجاد پایهٔ ریاضی لازم در ادامه، از مفاهیم «فضای برداری آفین» (Affine Vector Space) و «فضای اقلیدسی» (Euclidean Space) استفاده میکنیم. یکی از هدفها ایجاد روشی برای حل مسائل هندسی مستقل از دستگاه مختصات است. مزیت این رویکرد هنگام بررسی شیوهٔ نمایش اشیای هندسی روشن میشود: روش مستقل از مختصات بسیار مقاومتر از روشی است که اشیا را در دستگاه مختصات یا Frame مشخصی نمایش میدهد. همین رویکرد ما را به «مختصات همگن» (Homogeneous Coordinates) میرساند؛ دستگاهی که هم مبنای توضیح نظری را فراهم میکند و هم به روشهای پیادهسازی کارآمد میانجامد.
از اصطلاحات «نوع دادهٔ انتزاعی» (Abstract Data Type یا ADT) استفاده میکنیم تا تفاوت شیء با نمایش آن پررنگ شود. خواهیم دید ریاضیات لازم بهطور طبیعی از نیاز ما به دستکاری چند شیء هندسی بنیادی شکل میگیرد. بخش زیادی از این مباحث کاربردی از فضاهای برداری، هندسه و جبر خطی است. ضمیمههای B و C بهترتیب صورتبندی رسمی فضاهای برداری و جبر ماتریسی را خلاصه میکنند.
همانند فصل ۲، یک برنامهٔ کاربردی ساده برای نشاندادن اصول و شیوهٔ تحقق آنها در API توسعه میدهیم. مثال این فصل بر نمایش و تبدیلهای یک مکعب تمرکز دارد. همچنین مشخصکردن تعاملی تبدیلها و اعمال نرم آنها را بررسی میکنیم. چون تبدیلها هم در Modeling و هم در پیادهسازی کلیدیاند، قابلیتهایی میسازیم که بتوان تبدیلها را هم در کد برنامه و هم در Shaderها اجرا کرد.
۳.۱ اسکالرها، نقاط و بردارها
در گرافیک رایانهای با مجموعههایی از اشیای هندسی مانند خط، چندضلعی و چندوجهی کار میکنیم. این اشیا در جهان سهبعدی وجود دارند و ویژگیهایی دارند که با مفاهیمی مانند طول و زاویه توصیف میشوند. همانطور که در دو بعد دیدیم، بیشتر اشیای هندسی را میتوان با مجموعهٔ محدودی از موجودیتهای ساده تعریف کرد. این اشیای بنیادی و روابط میان آنها با سه نوع اصلی توصیف میشوند: «اسکالر» (Scalar)، «نقطه» (Point) و «بردار» (Vector).
هر یک از این انواع را از دید هندسی بررسی میکنیم، اما هر کدام را میتوان مانند ضمیمهٔ B بهصورت رسمی نیز بهعنوان موجودیتی تعریف کرد که مجموعهای از اصول موضوعه را رعایت میکند. در نهایت از نمونهٔ هندسی هر نوع استفاده خواهیم کرد، ولی باید میان تعریف انتزاعی هر موجودیت و هر نمونه یا پیادهسازی خاص آن تمایز دقیق قائل شویم؛ این دقت از خطاهای ظریف بعدی جلوگیری میکند. گرچه در فضاهای سهبعدی کار میکنیم، تقریباً همهٔ نتایج برای فضاهای nبعدی نیز معتبرند.
۳.۱.۱ اشیای هندسی
شیء هندسی بنیادی ما «نقطه» است. در یک دستگاه هندسی سهبعدی، نقطه مکانی در فضاست. تنها ویژگی نقطه مکان آن است؛ نقطهٔ ریاضی نه اندازه دارد و نه شکل.
نقاط برای تعریف اشیای هندسی مفیدند، اما بهتنهایی کافی نیستند. برای کمیتهایی مانند فاصلهٔ میان دو نقطه به اعداد حقیقی نیاز داریم. اعداد حقیقی ــ و گاهی اعداد مختلط ــ نمونههایی از اسکالر هستند. اسکالرها قواعدی دارند که انتزاعی از محاسبات عادیاند: جمع و ضرب تعریف شده و از قواعدی مانند جابجایی و شرکتپذیری پیروی میکنند. هر اسکالر معکوس جمعی و ضربی دارد و از این راه تفریق و تقسیم نیز تعریف میشوند.
برای کار با جهتها به نوع دیگری یعنی «بردار» نیاز داریم. فیزیکدانان و ریاضیدانان واژهٔ بردار را برای کمیتی دارای جهت و اندازه به کار میبرند. کمیتهایی مانند سرعت و نیرو بردارند، اما بردار مکان ثابتی در فضا ندارد.
در گرافیک رایانهای اغلب نقاط را با پارهخطهای جهتدار به هم وصل میکنیم، شکل ۳.۱. پارهخط جهتدار هم اندازه ــ طول ــ و هم جهت ــ جهتگیری ــ دارد و بنابراین بردار است. چون بردار مکان ثابت ندارد، پارهخطهای جهتدار شکل ۳.۲ که جهت و اندازهٔ برابر دارند، بردارهای یکساناند. در ادامه واژههای «بردار» و «پارهخط جهتدار» را غالباً مترادف به کار میبریم.
شکل ۳.۱ — پارهخط جهتداری که دو نقطه را متصل میکند.
شکل ۳.۲ — بردارهای یکسان.
طول بردار را میتوان با یک عدد حقیقی تغییر داد. نوعهایی مانند vec3 در GLSL و کلاسهای ما، «نوع هندسی» نیستند بلکه نوع ذخیرهسازیاند؛ بنابراین یک vec3 میتواند اطلاعات یک نقطه، بردار یا رنگ را نگه دارد. نامگذاری GLSL ممکن است در این زمینه کمی گمراهکننده باشد.
در شکل ۳.۳(a)، پارهخط A و B همجهتاند اما طول B دو برابر A است، پس B = 2A. پارهخطهای جهتدار را میتوان با قاعدهٔ «سر به دم» نیز جمع کرد. در شکل ۳.۳(b)، سر بردار A را به دم بردار C وصل میکنیم و بردار جدید D از دم A تا سر C به دست میآید. این بردار مجموع A و C است: D = A + C. چون بردار مکان ثابت ندارد، برای نمایش گرافیکی جمع میتوان آنها را آزادانه جابهجا کرد. پس دو عمل بنیادی داریم: جمع دو بردار و ضرب بردار در اسکالر.
شکل ۳.۳ — (الف) پارهخطهای موازی؛ (ب) جمع پارهخطها.
اگر دو پارهخط جهتدار A و E همطول ولی خلافجهت باشند، شکل ۳.۴، جمع آنها طول صفر دارد. این بردار ویژه «بردار صفر» است که با 0 نشان میدهیم. چون طول آن صفر است جهتگیریاش تعریف نشده. E «معکوس» A است و E = −A. با معکوسها عبارتهایی مانند A + 2B − 3C معنا پیدا میکنند.
شکل ۳.۴ — بردارهای معکوس.
هرچند میتوان بردار را در اسکالر ضرب کرد، عمل بدیهی و معقولی میان دو نقطه وجود ندارد که حاصلش نقطهای دیگر باشد؛ همینطور عمل میان نقطه و اسکالر که نقطه تولید کند. اما میان نقطه و پارهخط جهتدار عملی وجود دارد، شکل ۳.۵: با یک بردار میتوان از نقطهای به نقطهٔ دیگر رفت. این «جمع نقطه–بردار» است و نقطهٔ جدیدی تولید میکند: P = Q + v. بردار v نقطهٔ Q را به مکان P جابهجا میکند.
شکل ۳.۵ — جمع نقطه و بردار.
از دیدی دیگر، هر دو نقطه یک پارهخط جهتدار یا بردار از نقطهٔ نخست به دوم تعریف میکنند. این عمل «تفریق نقطه–نقطه» است و v = P − Q. چون بردار در اسکالر ضرب میشود، عبارتهایی مانند P + 3v یا 2P − Q + 3v معنا دارند؛ دومی را میتوان P + (P − Q) + 3v نوشت. اما عبارتهایی مانند P + 3Q − v بیمعنا هستند.
۳.۱.۲ هندسهٔ مستقل از مختصات
نقاط مستقل از هر دستگاه مرجع یا مختصات در فضا وجود دارند؛ بنابراین برای تعریف خود نقطه یا بردار ذاتاً به دستگاه مختصات نیاز نداریم. این موضوع ممکن است خلاف تجربهٔ معمول به نظر برسد، اما برای درک هندسه و ساخت سامانههای گرافیکی اساسی است.
مثال دوبعدی شکل ۳.۶ را در نظر بگیرید. دستگاه مختصات با دو محور و یک مبدأ تعریف شده و شیء هندسی سادهای یعنی مربع در آن قرار دارد. میتوان گفت گوشهٔ پایین-چپ مربع مختصات (1,1) دارد، اضلاع مربع بر هم عمودند و نقطهٔ (3,1) دو واحد از (1,1) فاصله دارد. اکنون محورها را حذف کنید، شکل ۳.۷. دیگر نمیتوانیم مکان نقاط را با مختصات بگوییم، اما آن مکانها نسبت به مبدأ و جهتگیری محورهای دلخواه تعریف شده بودند. مهمتر آنکه روابط هندسی بنیادی حفظ میشوند: مربع همچنان مربع است، خطوط عمود همچنان عمودند و فاصلهٔ نقاط تغییر نمیکند.
شکل ۳.۶ — شیء و دستگاه مختصات.
شکل ۳.۷ — شیء بدون دستگاه مختصات.
البته ارجاع به نقطهای خاص با عباراتی مانند «آن نقطهٔ آنجا» یا «نقطهٔ آبی سمت راست نقطهٔ قرمز» دشوار است. دستگاههای مختصات و Frameها، که در بخش ۳.۳ میآیند، این مشکل ارجاع را حل میکنند. فعلاً میخواهیم ببینیم رویکرد مستقل از مختصات، بدون تکیه بر دستگاه مرجع دلخواه، تا کجا ما را پیش میبرد.
۳.۱.۳ دیدگاه ریاضی: فضاهای برداری و آفین
اگر اسکالرها، نقاط و بردارها را اعضای مجموعههای ریاضی بدانیم، میتوان فضاهای انتزاعی گوناگونی برای نمایش و دستکاری آنها تعریف کرد. ریاضیدانان چنین فضاهایی را برای مسائل کاربردی از حل معادلات دیفرانسیل تا تقریب توابع بررسی کردهاند. تعریف رسمی فضاهای موردنیاز ما ــ Vector Space، Affine Space و Euclidean Space ــ در ضمیمهٔ B آمده است. در اینجا فقط نمونههایی برای ما مهماند که عناصرشان نوع هندسی باشند.
از مجموعهای از اسکالرها آغاز میکنیم که هر جفت آنها با دو عمل جمع و ضرب اسکالر دیگری میسازند. اگر این عملیات خواص بستار، شرکتپذیری، جابجایی و معکوسِ شرحدادهشده در ضمیمهٔ B را داشته باشند، عناصر یک «میدان اسکالر» (Scalar Field) میسازند. نمونههای آشنا شامل اعداد حقیقی، مختلط و توابع گویا هستند.
شاید مهمترین فضای ریاضی «فضای برداری خطی» باشد. فضای برداری دو نوع موجودیت متمایز دارد: بردار و اسکالر. علاوه بر قواعد ترکیب اسکالرها، میتوان با ضرب اسکالر–بردار بردار جدید و با جمع بردار–بردار نیز بردار جدید ساخت. n-تاییهای اعداد حقیقی و عملیات هندسی روی پارهخطهای جهتدار نمونهاند.
در فضای برداری خطی الزاماً روشی برای اندازهگیری یک کمیت اسکالر وجود ندارد. «فضای اقلیدسی» فضای برداری را با معیاری برای اندازه یا فاصله گسترش میدهد تا کمیتهایی مانند طول پارهخط قابل تعریف شوند.
«فضای آفین» فضای برداری را با نوع شیء دیگری، یعنی نقطه، گسترش میدهد. عملی میان دو نقطه یا نقطه و اسکالر که حاصلش نقطه باشد وجود ندارد، اما جمع بردار–نقطه نقطهٔ جدیدی میدهد. بهطور معادل میتوان گفت تفریق نقطه–نقطه بردار تولید میکند.
فضای آفین نمونهٔ مناسبی برای عملیات هندسی روی نقاط و پارهخطهای جهتداری است که در بخش ۳.۱.۱ معرفی کردیم.
در این فضاهای انتزاعی، اشیا مستقل از نمایش خاص تعریف میشوند؛ آنها صرفاً عضو مجموعهها هستند. یکی از مفاهیم مهم فضای برداری، نمایش یک بردار با یک یا چند مجموعه «بردار پایه» (Basis Vector) است. نمایش، که در بخش ۳.۳ بررسی میشود، پیوند میان شیء انتزاعی و پیادهسازی آن را برقرار میکند. تبدیل میان نمایشها ما را به تبدیلهای هندسی میرساند.
۳.۱.۴ دیدگاه علوم رایانه
ریاضیدان ممکن است اسکالر، نقطه و بردار را عضو مجموعههایی بداند که طبق اصول موضوعه ترکیب میشوند؛ دانشمند رایانه ترجیح میدهد آنها را «نوع دادهٔ انتزاعی» یا ADT ببیند. ADT مجموعهای از عملیات روی داده است که مستقل از نمایش داخلی داده و روش پیادهسازی عملیات تعریف میشود. انتزاع داده مفهومی بنیادی در علوم رایانهٔ نوین است؛ مثلاً افزودن عنصر به List یا ضرب دو Polynomial را میتوان مستقل از نحوهٔ ذخیرهٔ List یا نمایش اعداد حقیقی روی رایانه تعریف کرد.
با این دیدگاه باید بتوان میان خود اشیا و عملیات روی آنها، و نمایش یا پیادهسازی آنها در سامانهای خاص، تمایز گذاشت. از دید محاسباتی مطلوب است بتوانیم اشیای هندسی را بدون وابستگی به نمایش داخلی چنین تعریف کنیم:
vector u,v;
point p,q;
scalar a,b;
در زبانهای شیءگرا مانند C++ از کلاسها و Operator Overloading استفاده میکنیم تا با انواع دادهٔ هندسی عبارتی مانند زیر بنویسیم:
البته باید ابتدا توابع لازم برای اجرای این عملیات را تعریف کنیم. برای نوشتن آنها، توابع ریاضی موردنظر را بررسی میکنیم: نخست اشیا را تعریف و سپس برای عملیات میان آنها از فضاهای انتزاعی ریاضی کمک میگیریم.
۳.۱.۵ ADTهای هندسی
سه دیدگاه ارائهشده دربارهٔ اسکالر، نقطه و بردار چارچوبی ریاضی و محاسباتی برای کار با موجودیتهای هندسی فراهم میکند. در گرافیک رایانهای، اسکالرهای ما اعداد حقیقی با جمع و ضرب معمول هستند و ادامهٔ این ساختار در بخش بعد تکمیل میشود.
در جمعبندی ADTهای هندسی، اسکالرها اعداد حقیقی با جمع و ضرب معمول، نقاط هندسی مکانهایی در فضا و بردارها پارهخطهای جهتدار هستند. این اشیا قواعد فضای آفین را رعایت میکنند و میتوان ADTهای متناظر آنها را در برنامه ساخت.
گام بعدی استفاده از این انواع برای تشکیل اشیای هندسی و انجام عملیات میان آنهاست. از قرارداد زیر استفاده میکنیم:
- حروف یونانی
α, β, γ, ... برای اسکالرها؛
- حروف بزرگ
P, Q, R, ... برای نقاط؛
- حروف کوچک
u, v, w, ... برای بردارها.
هنوز هیچ دستگاه مرجعی مانند مختصات معرفی نشده است؛ بنابراین این نمادها برای نقطه و بردار به خود اشیای انتزاعی اشاره میکنند، نه نمایش آنها در دستگاه خاص. برای نمایشها در بخش ۳.۳ از حروف پررنگ استفاده خواهد شد. اندازهٔ بردار v عدد حقیقی |v| است. ضرب بردار در اسکالر خاصیت زیر را دارد:
|αv| = |α||v|.
جهت αv برای α مثبت همان جهت v و برای α منفی مخالف آن است.
دو عمل معادل، نقطه و بردار را به هم مرتبط میکنند. نخست تفریق دو نقطهٔ P و Q که بردار v را میدهد:
v = P − Q.
در نتیجه برای هر نقطهٔ Q و بردار v، نقطهٔ یکتای P وجود دارد که رابطهٔ بالا را ارضا کند؛ یعنی:
P = Q + v.
پس P با جمع نقطه–بردار تشکیل میشود، شکل ۳.۸.
شکل ۳.۸ — تفریق نقطه–نقطه.
قاعدهٔ سر به دم تجسم مناسبی برای جمع بردارهاست. در شکل ۳.۹(a)، u+v برداری از دم u تا سر v است. همین تجسم در شکل ۳.۹(b) نشان میدهد برای هر سه نقطهٔ P، Q و R:
(P − Q) + (Q − R) = P − R.
۳.۱.۶ خطوط
جمع نقطه و بردار ــ یا تفریق دو نقطه ــ ما را به مفهوم خط در فضای آفین میرساند. همهٔ نقاط به شکل زیر را در نظر بگیرید:
P(α) = P0 + αd،
که P0 نقطهای دلخواه، d برداری دلخواه و α اسکالری متغیر است.
شکل ۳.۹ — استفاده از قاعدهٔ سر به دم: (الف) برای بردارها؛ (ب) برای نقاط.
طبق قواعد فضای آفین، برای هر مقدار α، ارزیابی P(α) یک نقطه تولید میکند. برای بردارهای هندسی، این نقاط روی یک خط قرار میگیرند، شکل ۳.۱۰. این نمایش «فرم پارامتری خط» است، زیرا با تغییر پارامتر α نقاط خط تولید میشوند. در α=0 خط از P0 میگذرد و با افزایش α نقاط در جهت d قرار میگیرند. اگر α فقط نامنفی باشد یک «نیمخط» (Ray) از P0 در جهت d به دست میآید. خط در هر دو جهت بینهایت، پارهخط قطعهای محدود میان دو نقطه، و نیمخط فقط در یک جهت بینهایت است.
شکل ۳.۱۰ — خط در فضای آفین.
۳.۱.۷ جمعهای آفین
در فضای آفین جمع دو بردار، ضرب بردار در اسکالر و جمع بردار و نقطه تعریف شدهاند، اما جمع دو نقطهٔ دلخواه و ضرب نقطه در اسکالر تعریف نشدهاند. با این حال عملی به نام «جمع آفین» (Affine Addition) بخشی از ویژگی این دو عمل اخیر را دارد. برای نقطهٔ Q، بردار v و اسکالر مثبت α:
P = Q + αv
همهٔ نقاط روی خط از Q در جهت v را توصیف میکند، شکل ۳.۱۱. همیشه میتوان نقطهٔ R را طوری یافت که v = R − Q؛ بنابراین:
P = Q + α(R − Q) = αR + (1 − α)Q.
این عبارت ظاهری شبیه جمع دو نقطه دارد و میتوان آن را چنین نوشت:
P = α1R + α2Q
مشروط بر اینکه α1 + α2 = 1.
شکل ۳.۱۱ — جمع آفین.
۳.۱.۸ تحدب
شیء «محدب» (Convex) شیئی است که برای هر دو نقطهٔ داخل آن، همهٔ نقاط پارهخط متصلکنندهٔ آن دو نیز داخل شیء باشند. اهمیت تحدب را برای چندضلعیها در فصل ۲ دیدیم. جمعهای آفین دید عمیقتری ارائه میکنند. برای 0 ≤ α ≤ 1 جمع آفین پارهخط میان R و Q را تعریف میکند، شکل ۳.۱۲؛ پس خود پارهخط شیئی محدب است.
شکل ۳.۱۲ — پارهخط متصلکنندهٔ دو نقطه.
جمع آفین را میتوان به n نقطهٔ P1, P2, ..., Pn تعمیم داد:
P = α1P1 + α2P2 + ... + αnPn.
با استقرا میتوان نشان داد این جمع زمانی و فقط زمانی تعریف شده است که:
α1 + α2 + ... + αn = 1.
مجموعهٔ نقاط حاصل از جمع آفین n نقطه با محدودیت اضافی
αi ≥ 0, i = 1,2,...,n
«پوستهٔ محدب» (Convex Hull) مجموعهٔ نقاط نام دارد، شکل ۳.۱۳. بهسادگی میتوان دید Convex Hull همهٔ پارهخطهای متصلکنندهٔ جفت نقاط مجموعه را در بر میگیرد. از دید هندسی مانند کشیدن سطحی کاملاً چسبان روی مجموعهٔ نقاط ــ Shrink-Wrap ــ است و کوچکترین شیء محدبی است که همهٔ نقاط را شامل میشود. تحدب در طراحی منحنیها و سطوح بسیار مهم است و در فصل ۱۰ بازمیگردیم.
شکل ۳.۱۳ — پوستهٔ محدب.
۳.۱.۹ ضرب نقطهای و ضرب برداری
بسیاری از مفاهیم هندسی مربوط به جهتگیری دو بردار با «ضرب نقطهای» (Dot/Inner Product) و «ضرب برداری» (Cross/Outer Product) بیان میشوند. ضرب نقطهای u و v را u · v مینویسیم. اگر u · v = 0، دو بردار «متعامد» (Orthogonal) هستند. در فضای اقلیدسی اندازهٔ بردار تعریف شده و مربع اندازهٔ u برابر است با:
|u|² = u · u.
کسینوس زاویهٔ میان دو بردار:
cos θ = (u · v)/(|u||v|).
همچنین |u|cosθ = (u·v)/|v| طول تصویر متعامد u روی v است، شکل ۳.۱۴.
شکل ۳.۱۴ — ضرب نقطهای و Projection.
ضرب نقطهای نتیجهٔ هندسی مهمی را بیان میکند: کوتاهترین فاصله از انتهای بردار u تا خط v با برداری عمود بر v به دست میآید. همچنین u را میتوان مجموع تصویر متعامدش روی v و برداری عمود بر v دانست.
در فضای برداری، مجموعهای از بردارها «مستقل خطی» (Linearly Independent) است اگر نتوان یکی را با جمع اسکالر–بردار از بقیه ساخت. بُعد فضای برداری بیشترین تعداد بردار مستقل خطی قابل یافتن است. با هر سه بردار مستقل خطی در فضای سهبعدی میتوان از ضرب نقطهای برای ساخت سه بردار استفاده کرد که هر کدام بر دو تای دیگر عمود باشند؛ این فرایند در ضمیمهٔ B آمده است.
همچنین با دو بردار غیرموازی u و v میتوان بردار سوم n را یافت که بر هر دو عمود باشد، شکل ۳.۱۵. این بردار ضرب برداری آنهاست:
n = u × v.
شکل ۳.۱۵ — ضرب برداری.
از هر دو بردار غیرموازی میتوان سه بردار متعامد ساخت. ابتدا n = u × v و سپس:
w = u × n؛
در نتیجه u، n و w نسبت به یکدیگر متعامدند.
ضرب برداری در ضمیمهٔ C بر پایهٔ نمایش بردارها استخراج میشود و همان نمایش روش مستقیمی برای محاسبهٔ آن میدهد. اندازهٔ ضرب برداری با سینوس زاویهٔ θ میان u و v رابطه دارد:
|sin θ| = |u × v| / (|u||v|).
بردارهای u، v و n یک دستگاه راستگرد تشکیل میدهند: اگر u در جهت شست دست راست و v در جهت انگشت اشاره باشد، n در جهت انگشت میانی قرار میگیرد.
۳.۱.۱۰ صفحهها
صفحه در فضای آفین تعمیم مستقیم خط پارامتری است. از هندسه میدانیم سه نقطهٔ غیرهمخط یک صفحهٔ یکتا تعیین میکنند. فرض کنید P، Q و R چنین نقاطی باشند. پارهخط میان P و Q مجموعهٔ نقاط زیر است:
S(α) = αP + (1−α)Q, 0 ≤ α ≤ 1.
اگر نقطهای دلخواه روی این پارهخط برداریم و پارهخطی از آن تا R تشکیل دهیم، شکل ۳.۱۶، با پارامتر دوم β نقاط این خط چنیناند:
T(β) = βS + (1−β)R, 0 ≤ β ≤ 1.
شکل ۳.۱۶ — تشکیل یک صفحه.
این نقاط به هر دو پارامتر α و β وابستهاند و صفحهٔ تعیینشده توسط P، Q و R را میسازند. با ترکیب دو معادله:
T(α,β) = β[αP + (1−α)Q] + (1−β)R.
با بازآرایی:
T(α,β) = P + β(1−α)(Q−P) + (1−β)(R−P).
چون Q−P و R−P بردارهایی دلخواهاند، صفحه را میتوان با نقطهٔ P0 و دو بردار غیرموازی u و v نیز نوشت:
T(α,β) = P0 + αu + βv.
اگر T را به شکل
T(α,β) = βαP + β(1−α)Q + (1−β)R
بنویسیم، با نمایش
T(α′,β′,γ′) = α′P + β′Q + γ′R
معادل است، مشروط بر اینکه:
α′ + β′ + γ′ = 1.
نمایش یک نقطه با (α′,β′,γ′) «نمایش مختصات باریسنترک» (Barycentric Coordinates) نام دارد.
برای 0 ≤ α,β ≤ 1 همهٔ نقاط T(α,β) داخل مثلث ساختهشده از P، Q و R قرار دارند. اگر P در صفحه باشد:
P − P0 = αu + βv.
بردار w را میتوان طوری یافت که بر u و v عمود باشد، شکل ۳.۱۷. با ضرب برداری:
n = u × v
معادلهٔ صفحه به شکل زیر درمیآید:
n · (P − P0) = 0.
بردار n عمود یا متعامد بر صفحه است و «بردار نرمال» (Normal) صفحه نام دارد. فرمهای P(α) برای خط و T(α,β) برای صفحه، «فرم پارامتری» هستند چون برای هر مقدار پارامترها نقطهای در فضا میدهند.
شکل ۳.۱۷ — نرمال یک صفحه.
۳.۲ بدویهای سهبعدی
در جهان سهبعدی تنوع اشیای هندسی بسیار بیشتر از دو بعد است. در صفحهٔ دوبعدی فصل ۲، با منحنیهای سادهای مانند پارهخط و اشیای تخت دارای درون مشخص مانند چندضلعی ساده کار کردیم. در سه بعد این اشیا همچنان وجود دارند، اما دیگر مجبور نیستند همگی روی یک صفحه باشند. منحنیها به «منحنی فضایی» تبدیل میشوند، شکل ۳.۱۸، و اشیای دارای درون میتوانند سطحهایی در فضا باشند، شکل ۳.۱۹. افزون بر آن، اشیای دارای حجم مانند Parallelepiped و Ellipsoid نیز داریم، شکل ۳.۲۰.
شکل ۳.۱۸ — منحنیها در سه بعد.
شکل ۳.۱۹ — سطوح در سه بعد.
شکل ۳.۲۰ — اشیای حجمی.
گسترش سامانهٔ گرافیکی برای پشتیبانی از همهٔ این امکانات با دو مشکل روبهروست: نخست اینکه تعریف ریاضی اشیا میتواند پیچیده شود؛ دوم اینکه فقط اشیایی برای ما مطلوباند که به پیادهسازی کارآمد روی سامانههای گرافیکی منجر شوند. طیف کامل اشیای سهبعدی روی سختافزارهای موجود جز با تقریب قابل پشتیبانی نیست.
سه ویژگی، اشیای سهبعدی مناسب سختافزار و نرمافزارهای گرافیکی رایج را مشخص میکنند:
- اشیا با سطحشان توصیف میشوند و میتوان آنها را توخالی در نظر گرفت.
- اشیا با مجموعهای از رأسها در سه بعد قابل تعریفاند.
- اشیا یا از چندضلعیهای تخت و محدب تشکیل شدهاند یا میتوان آنها را با چنین چندضلعیهایی تقریب زد.
علت این شروط با توجه به نقطهٔ قوت سامانههای نوین روشن است: آنها مثلثها یا Meshهای مثلثی را بسیار سریع رندر میکنند. کارتهای گرافیکی متداول میتوانند بیش از صد میلیون مثلث تخت کوچک در ثانیه رندر کنند و معیارهای کارایی نیز معمولاً برای مثلثهای کوچک سهبعدی قابل تولید با Triangle Strip بیان میشوند. Shading، Lighting و Texture Mapping این مثلثها نیز در سختافزارهای نوین پشتیبانی میشوند.
شرط نخست یعنی برای مدلسازی اشیای سهبعدی به بدویهای دوبعدی کافی است، چون سطح موجودیتی دوبعدی است. شرط دوم تعمیم مشاهدههای فصل ۱ و ۲ است: اگر شیء با رأسها تعریف شود، معماری خط لوله میتواند رأسها را با سرعت بالا پردازش کند و تصویر نهایی فقط هنگام Rasterization تولید شود. شرط سوم نیز از بحث چندضلعی دوبعدی میآید. بیشتر سامانهها برای نقطه، پارهخط و مثلث بهینهاند؛ در سه بعد مثلث با فهرست مرتب سه رأس تعریف میشود.
اما برای چندضلعیهای عمومی با بیش از سه رأس، رأسها الزاماً همصفحه نیستند. اگر نباشند تعریف سادهای برای داخل شیء نداریم؛ بنابراین بیشتر سامانهها از برنامه میخواهند چندضلعی ساده و مسطح یا مثلث ارائه کند.
اگر سامانه چندضلعی عمومی بپذیرد و برنامه چندضلعی تخت تحویل ندهد، نتیجهٔ Rasterization تضمینشده نیست. چون مثلث همیشه تخت است، سامانهٔ Modeling یا باید همواره مثلث تولید کند یا سامانهٔ گرافیکی روشی برای تقسیم (Tessellation) چندضلعی دلخواه به مثلثها داشته باشد. همین استدلال برای جسم منحنی مانند کره به این نتیجه میرسد که باید آن را با چندضلعیهای تخت کوچک تقریب زد. حتی اگر سامانهٔ Modeling جسم منحنی ارائه کند، برای پیادهسازی فرض میکنیم تقریب Mesh مثلثی استفاده میشود.
استثنای اصلی «هندسهٔ جامد سازنده» (Constructive Solid Geometry یا CSG) است. در CSG اشیا با ترکیب مجموعهٔ کوچکی از اشیای حجمی و عملیاتی مانند اجتماع و اشتراک ساخته میشوند. مدلهای CSG در فصل ۸ بررسی خواهند شد. این روش برای Modeling بسیار مناسب است، اما رندر CSG از رندر مدلهای چندضلعی مبتنی بر سطح دشوارتر است؛ بنابراین تمرکز اصلی ما رندر سطح خواهد بود.
همهٔ بدویهای مورد استفادهٔ ما با مجموعهای از رأسها قابل تعریفاند. با حرکت از اشیای انتزاعی به اشیای واقعی باید روش نمایش نقاط فضا را به شکلی بررسی کنیم که در سامانهٔ گرافیکی قابل استفاده باشد.
۳.۳ دستگاههای مختصات و Frameها
تا اینجا بردارها و نقاط را اشیای انتزاعی و بدون نمایش در دستگاه مرجع در نظر گرفتیم. در فضای برداری سهبعدی، هر بردار w را میتوان نسبت به هر سه بردار مستقل خطی v1, v2, v3 بهطور یکتا نوشت:
w = α1v1 + α2v2 + α3v3.
اسکالرهای α1, α2, α3 مؤلفههای w نسبت به این Basis هستند، شکل ۳.۲۱. نمایش w در این Basis را میتوان ماتریس ستونی a=[α1 α2 α3]^T نوشت.
شکل ۳.۲۱ — بردار حاصل از سه بردار پایه.
حروف پررنگ نمایش یک شیء در Basis مشخص را نشان میدهند، در مقابل بردار انتزاعی w. رابطه را میتوان به صورت ماتریسی نیز نوشت:
w = a^T [v1 v2 v3]^T = a^T v.
معمولاً بردارهای پایه v1,v2,v3 را تعیینکنندهٔ دستگاه مختصات میدانیم، اما برای مسائلی که هم نقطه، هم بردار و هم اسکالر دارند به روش عمومیتری نیاز داریم. شکل ۳.۲۲ مسئله را نشان میدهد. سه بردار Basis در شکل ۳.۲۲(a) از نقطهای مشترک خارج شدهاند؛ با آنها میتوان هر بردار سهبعدی را نمایش داد. اما بردار جهت و اندازه دارد و مکان ثابت ندارد. بنابراین شکل ۳.۲۲(b)، که در آن همان بردارهای پایه بدون تغییر جهت یا اندازه جابهجا شدهاند، از نظر ریاضی معادل است، هرچند معمولاً درک آن دشوارتر است. همچنین هنوز مسئلهٔ نمایش نقاط، یعنی موجودیتهای دارای موقعیت ثابت، باقی است.
شکل ۳.۲۲ — دستگاههای مختصات: (الف) بردارها با مبدأ مشترک؛ (ب) همان بردارها پس از جابهجایی.
چون فضای آفین شامل نقطه است، با تثبیت یک نقطهٔ مرجع خاص ــ «مبدأ» ــ میتوان همهٔ نقاط را بدون ابهام نمایش داد. قرارداد معمول رسم محورهای مختصات از مبدأ در فضای آفین معنا پیدا میکند، زیرا هم نقطه و هم بردار نمایش دارند. اما برای این نمایش باید هم نقطهٔ مرجع و هم بردارهای پایه را بدانیم. «مبدأ + بردارهای پایه» یک Frame را تعیین میکنند.
به بیان ساده، Frame مبدأ دستگاه برداری را روی نقطهای مانند P0 ثابت میکند. در یک Frame هر بردار بهطور یکتا چنین نوشته میشود:
w = α1v1 + α2v2 + α3v3 = a^T v.
و هر نقطه نیز بهطور یکتا:
P = P0 + β1v1 + β2v2 + β3v3 = P0 + b^T v.
پس نمایش یک بردار در Frame به سه اسکالر نیاز دارد؛ نمایش نقطه نیز به سه اسکالر همراه با دانستن محل مبدأ. همانطور که در بخش ۳.۳.۴ خواهیم دید، جایگزینی مفهوم آشنای دستگاه مختصات و Basis با مفهوم Frame مشکل «برداری با جهت و اندازه ولی بدون مکان ثابت» را برطرف میکند و در عین حفظ تمایز هندسی نقطه و بردار امکان استفاده از نمایش ماتریسی را میدهد.
ازآنجا که نقطه و بردار دو نوع هندسی متفاوتاند، نمایشهایی که نقطه را با پارهخطی از مبدأ تا آن نقطه یکسان میگیرند، شکل ۳.۲۳، باید با احتیاط تفسیر شوند. تفسیر درست این است که یک بردار میتواند از یک نقطهٔ مرجع ثابت (مبدأ) به نقطهای مشخص تعریف شود. بردار مانند نقطه مستقل از دستگاه مرجع وجود دارد، اما در عمل ناچاریم هر دو را در دستگاهی مشخص نمایش دهیم.
شکل ۳.۲۳ — نمایش بالقوه گمراهکنندهٔ یک بردار.
۳.۳.۱ نمایشها و n-تاییها
فرض کنید e1,e2,e3 یک Basis باشند. نمایش هر بردار v با مؤلفههای (α1,α2,α3) تعیین میشود:
v = α1e1 + α2e2 + α3e3.
خود بردارهای پایه نیز نمایش دارند.
نمایش استاندارد آنها چنین است:
e1 = (1,0,0)^T
e2 = (0,1,0)^T
e3 = (0,0,1)^T.
یعنی 3-تایی (1,0,0) نمایش نخستین بردار پایه است. بنابراین بهجای کار مستقیم با بردارهای انتزاعی میتوان با 3-تاییها و ماتریسهای ستونی کار کرد. نمایش هر بردار v را میتوان a=(α1,α2,α3) یا ماتریس ستونی متناظر دانست و نوشت:
a = α1e1 + α2e2 + α3e3.
3-تاییهای پایه e1,e2,e3 بردارهای فضای اقلیدسی آشنای R³ هستند. فضای R³ با فضای بردارهای هندسی اولیهٔ ما همریخت است. از دید عملی تقریباً همیشه کار با 3-تاییها، و در حالت عمومی n-تاییها، آسانتر از نمایشهای دیگر است.
۳.۳.۲ تغییر دستگاه مختصات
اغلب لازم است بدانیم نمایش یک بردار با تغییر Basis چگونه عوض میشود. در OpenGL هندسه را معمولاً در دستگاه یا Frame طبیعی مدل، یعنی Object/Model Frame، تعریف میکنیم؛ سپس مدل به World Frame منتقل میشود و در مرحلهای دیگر باید ببینیم از دید دوربین چگونه دیده میشود، پس از World Frame به Camera/Eye Frame تبدیل میکنیم. تبدیل از Object Frame به Eye Frame با Model-View Matrix انجام میشود.
ابتدا تغییر نمایش بردارها را بررسی میکنیم. فرض کنید {v1,v2,v3} و {u1,u2,u3} دو Basis باشند. هر بردار پایهٔ مجموعهٔ دوم را میتوان بر حسب Basis اول نوشت و برعکس. پس نه اسکالر γij وجود دارند که:
u1 = γ11v1 + γ12v2 + γ13v3
u2 = γ21v1 + γ22v2 + γ23v3
u3 = γ31v1 + γ32v2 + γ33v3.
این ضرایب ماتریس ۳×۳ زیر را میسازند:
M = [[γ11,γ12,γ13],[γ21,γ22,γ23],[γ31,γ32,γ33]].
در نتیجه بردارهای Basis دوم با ضرب M در بردارهای Basis اول به دست میآیند؛ ادامهٔ استخراج تبدیل نمایش در صفحهٔ بعد انجام میشود.
رابطهٔ Basisها را میتوان فشرده به شکل u = Mv نوشت. ماتریس M اطلاعات لازم برای گذار از نمایش بردار در یک Basis به Basis دیگر را در خود دارد و معکوس M تبدیل عکس را بیان میکند.
بردار w را در Basis {v1,v2,v3} با مؤلفههای a=(α1,α2,α3)^T در نظر بگیرید:
w = α1v1 + α2v2 + α3v3 = a^T v.
فرض کنید نمایش همان w در Basis {u1,u2,u3} برابر b=(β1,β2,β3)^T باشد:
w = β1u1 + β2u2 + β3u3 = b^T u.
با جایگذاری u=Mv داریم:
w = b^T M v = a^T v.
بنابراین:
a = M^T b.
اگر
T = (M^T)^−1
باشد، T نمایش را از a به b تبدیل میکند:
b = Ta.
پس بهجای دستکاری مستقیم بردارهای هندسی انتزاعی میتوان با نمایشهای آنها، یعنی 3-تاییها یا عناصر R³، کار کرد. این نتیجه مهم است، زیرا مسئله را از بردارهای انتزاعی به ماتریسهای ستونی اسکالرها منتقل میکند. نکتهٔ حیاتی آن است که هرگاه ستونهایی از اعداد حقیقی را «بردار» مینامیم، یک Basis زیربنایی وجود دارد که نباید آن را فراموش کنیم؛ در غیر این صورت ممکن است ناخواسته در دستگاه مختصات اشتباه محاسبه کنیم.
تغییر Basis مورد بحث مبدأ را ثابت نگه میدارد. بنابراین برای چرخش و Scale کردن مجموعهٔ بردارهای پایه مناسب است، شکل ۳.۲۴، اما Translation سادهٔ مبدأ ــ یعنی تغییر Frame مطابق شکل ۳.۲۵ ــ با این روش قابل نمایش نیست. پس از یک مثال، مختصات همگن را معرفی میکنیم که اجازه میدهد تغییر Frame نیز همچنان با ماتریس نمایش داده شود.
شکل ۳.۲۴ — چرخش و Scale یک Basis.
شکل ۳.۲۵ — Translation یک Basis.
۳.۳.۳ مثال تغییر نمایش
فرض کنید بردار w در Basis اولیه نمایش زیر را داشته باشد:
a = [1,2,3]^T؛
یعنی:
w = v1 + 2v2 + 3v3.
اکنون Basis جدید را چنین تعریف میکنیم:
u1 = v1
u2 = v1 + v2
u3 = v1 + v2 + v3.
ماتریس M برابر است با:
ماتریسی که نمایش را از Basis v1,v2,v3 به Basis u1,u2,u3 تبدیل میکند:
T = (M^T)^−1
و نتیجهٔ محاسبه:
T = [1 -1 0
0 1 -1
0 0 1]
در دستگاه جدید:
b = Ta = [-1,-1,3]^T؛
پس:
w = −u1 − u2 + 3u3.
اگر بهجای فضای انتزاعی در فضای 3-تاییهای R³ کار کنیم، میتوان v1,v2,v3 را Basis واحد در R³ دانست:
e1=(1,0,0)^T، e2=(0,1,0)^T، e3=(0,0,1)^T.
مثال را میتوان ملموستر کرد. فرض کنید دستگاه پیشفرض متعامد (x,y,z) را داریم و سه بردار جهت با نمایشهای (1,0,0)، (1,1,0) و (1,1,1) داده شدهاند. اولی در امتداد محور x، دومی در جهتی موازی صفحهٔ z=0، و سومی در جهتی متقارن نسبت به سه جهت پایه است. این سه بردار هرچند متعامد نیستند، مستقل خطیاند و بنابراین Basis دستگاه مختصات جدیدی را تشکیل میدهند که میتوان (x′,y′,z′) نامید. جهتهای اولیه در دستگاه جدید با ستونهای ماتریس T نمایش داده میشوند.
۳.۳.۴ مختصات همگن
ابهام بالقوه میان نقطه و بردار که در شکل ۳.۲۳ دیدیم با نمایش سهبعدی همچنان باقی است. فرض کنید Frame با P0 و بردارهای v1,v2,v3 تعریف شده باشد. تمایل طبیعی این است که نقطهٔ P در (x,y,z) را با ستون
p=[x,y,z]^T
نمایش دهیم، زیرا:
P = P0 + xv1 + yv2 + zv3.
اما این نمایش دقیقاً همان شکل نمایش بردار
w = xv1 + yv2 + zv3
را دارد. «مختصات همگن» این مشکل را با نمایش چهاربعدی برای هر دو نوع نقطه و بردار سهبعدی حل میکند. در Frame (v1,v2,v3,P0) هر نقطهٔ P بهطور یکتا:
P = α1v1 + α2v2 + α3v3 + P0.
اگر بهطور قراردادی ضرب نقطه در ۰ و ۱ را با 0·P=0 و 1·P=P تعریف کنیم، میتوان رابطه را به صورت ضرب ماتریسی نوشت.
برای نقطه:
P = [α1 α2 α3 1] [v1 v2 v3 P0]^T.
از نظر دقیق این ضرب Dot Product واقعی نیست، چون عناصر ماتریسها همنوع نیستند؛ بااینحال مانند ضرب داخلی محاسبه میشود: عناصر متناظر ضرب و سپس جمع میشوند. ماتریس سطری چهاربعدی، نمایش مختصات همگن P در Frame تعیینشده است. بهطور معادل:
p=[α1,α2,α3,1]^T.
در همان Frame هر بردار w چنین است:
w = δ1v1 + δ2v2 + δ3v3
و میتوان آن را به صورت
w = [δ1 δ2 δ3 0] [v1 v2 v3 P0]^T
نوشت؛ بنابراین نمایش همگن بردار:
w=[δ1,δ2,δ3,0]^T.
این فرمولبندی تفسیرهای هندسی مختلف دارد. نکتهٔ عملی آن است که عملیات روی نقطه و بردار را میتوان با نمایشهای همگن و جبر ماتریسی معمول انجام داد. برای نمونه، تغییر Frame که با نمایش سهبعدی مشکلساز بود اکنون قابل حل است. اگر (v1,v2,v3,P0) و (u1,u2,u3,Q0) دو Frame باشند، میتوان بردارهای پایه و نقطهٔ مرجع Frame دوم را بر حسب Frame اول نوشت؛ روابط کامل در ادامه میآیند.
اگر Frame دوم را بر حسب Frame اول بنویسیم:
u1 = γ11v1 + γ12v2 + γ13v3
u2 = γ21v1 + γ22v2 + γ23v3
u3 = γ31v1 + γ32v2 + γ33v3
Q0 = γ41v1 + γ42v2 + γ43v3 + P0.
این روابط به صورت ماتریسی نوشته میشوند و M اکنون یک ماتریس ۴×۴ است:
M = [γ11 γ12 γ13 0
γ21 γ22 γ23 0
γ31 γ32 γ33 0
γ41 γ42 γ43 1]
M «نمایش ماتریسی تغییر Frame» نام دارد.
همچنین میتوان از M برای محاسبهٔ مستقیم تغییر نمایش استفاده کرد. اگر a و b نمایشهای مختصات همگن یک نقطه یا بردار در دو Frame باشند، با همان استدلال قبل:
a = M^T b.
هنگام کار با نمایشها معمولاً M^T برای ما مهم است؛ این ماتریس فرم
M^T = [α11 α12 α13 α14
α21 α22 α23 α24
α31 α32 α33 α34
0 0 0 1]
را دارد و با ۱۲ ضریب مستقل تعیین میشود.
مختصات همگن مزایای دیگری نیز دارند که در فصلهای بعد بهطور گسترده استفاده میکنیم. شاید مهمترین مزیت آن باشد که تمام تبدیلهای آفین ــ یعنی تبدیلهای حفظکنندهٔ خط ــ را میتوان در مختصات همگن به صورت ضرب ماتریسی نمایش داد. گرچه برای حل مسئلهٔ سهبعدی با نمایش همگن در چهار بعد کار میکنیم، حجم محاسبات کمتر میشود. نمایش یکنواخت همهٔ تبدیلهای آفین باعث میشود ترکیب تبدیلهای متوالی (Concatenation) بسیار سادهتر از فضای سهبعدی باشد. سختافزارهای نوین نیز عملیات مختصات همگن را مستقیماً و با Parallelism برای محاسبهٔ پرسرعت اجرا میکنند.
۳.۳.۵ مثال تغییر Frame
به مثال بخش ۳.۳.۳ برمیگردیم. اگر از Basisهای v1,v2,v3 به همان u1,u2,u3 برویم:
u1=v1
u2=v1+v2
u3=v1+v2+v3.
اگر نقطهٔ مرجع تغییر نکند:
Q0=P0.
آنگاه ماتریس M:
M = [1 0 0 0
1 1 0 0
1 1 1 0
0 0 0 1]
است و ماتریسهای موردنیاز، M، ترانهادهٔ آنها و معکوسهایشان هستند.
حال علاوه بر تغییر بردارهای پایه، نقطهٔ مرجع را به نقطهای با نمایش (1,2,3,1) در دستگاه اولیه منتقل کنیم. بردار جابهجایی v=v1+2v2+3v3، P0 را به Q0 میبرد و مؤلفهٔ چهارم ۱ نشان میدهد موجودیت یک نقطه است. بنابراین:
Q0=P0+v1+2v2+3v3.
و:
M^T = [1 1 1 1
0 1 1 2
0 0 1 3
0 0 0 1]
معکوس این ماتریس:
T = (M^T)^−1 = [1 -1 0 1
0 1 -1 1
0 0 1 -3
0 0 0 1]
است. این زوج ماتریس امکان رفتوبرگشت میان نمایشهای دو Frame را میدهد.
T نقطهٔ (1,2,3) در Frame اولیه با نمایش همگن
p=[1,2,3,1]^T
را به
p′=[0,0,0,1]^T
میبرد؛ یعنی همان نقطه مبدأ دستگاه جدید است. اما بردار (1,2,3) که در دستگاه اولیه
a=[1,2,3,0]^T
است، به
b=[−1,−1,3,0]^T
تبدیل میشود. این نتیجه با مثال تغییر دستگاه مختصات سازگار است و اهمیت تمایز نقطه و بردار را نیز نشان میدهد.
۳.۳.۶ کار با نمایشها
برنامههای کاربردی تقریباً همیشه با نمایشها کار میکنند، نه نقاط انتزاعی. وقتی مختصات نقطهای را در آرایه قرار میدهیم، آن مختصات نسبت به یک Frame مشخص هستند. در مثالهای قبلی با تعریف دادهها مستقیماً در Clip Coordinates از تغییر Frame پرهیز کردیم؛ اما برنامههای واقعی ترجیح میدهند در Frameهایی مرتبط با مسئله کار کنند تا مبدأ، جهت محور و Scale واحدها با فضای مسئله معنا داشته باشد.
OpenGL در نهایت داده را در Clip Coordinates نیاز دارد، بنابراین دستکم یک تغییر نمایش ضروری است. در عمل Frameهای بیشتری نیز برای Modeling و Rendering مفیدند و زنجیرهای از تغییر نمایش خواهیم داشت.
تغییر نمایش با ماتریسی از فرم زیر بیان میشود:
a = Cb،
که a و b دو نمایش همگن یک نقطه یا بردارند. مطابق بخش ۳.۳.۴، C ماتریسی همگن از فرم M^T است:
C = [α11 α12 α13 α14
α21 α22 α23 α24
α31 α32 α33 α34
0 0 0 1]
مسئله آن است که وقتی با نمایشها کار میکنیم C را چگونه بیابیم. پاسخ ساده است. فرض کنید در یک Frame اولیه، Frame جدید را با نمایش سه بردار u,v,n و مبدأ جدید p تعریف کنیم. در مختصات همگن هر چهار موجودیت 4-تایی یا عنصر R⁴ هستند.
مسئلهٔ معکوس را در نظر بگیرید. ماتریس
T=C^−1
نمایشها را از Frame (u,v,n,p) به Frame اولیه تبدیل میکند. بنابراین Basis استاندارد Frame جدید باید تحت T به بردارهای u، v، n و نقطهٔ p در Frame اولیه نگاشت شود. نخست:
T[1,0,0,0]^T = u = [u1,u2,u3,0]^T.
به همین ترتیب:
T[0,1,0,0]^T = v = [v1,v2,v3,0]^T
T[0,0,1,0]^T = n = [n1,n2,n3,0]^T
T[0,0,0,1]^T = p = [p1,p2,p3,1]^T.
از کنار هم قرار دادن این نتایج مییابیم:
T = [u v n p]
= [u1 v1 n1 p1
u2 v2 n2 p2
u3 v3 n3 p3
0 0 0 1]
و در نتیجه:
C = [u v n p]^−1.
پس نمایش یک Frame نسبت به Frame دیگر، معکوس ماتریسی را مستقیماً به ما میدهد که برای تبدیل نمایش از Frame اول به دوم لازم است. تنها کار باقیمانده محاسبهٔ معکوس یک ماتریس ۴×۴ با این ساختار است.
۳.۴ Frameها در OpenGL
OpenGL بر مدل خط لوله بنا شده است. بخش آغازین خط لوله توالیای از عملیات روی رأسهاست که بسیاری از آنها هندسیاند. این عملیات را میتوان بهصورت زنجیرهای از تبدیلها، یا بهطور معادل بهصورت زنجیرهای از تغییر Frame برای اشیای تعریفشده توسط برنامهٔ کاربردی، توصیف کرد. ادامهٔ نحوهٔ تحقق این Frameها در OpenGL در مقالهٔ بعد آمده است.