X
تبلیغات
نماشا
رایتل
پشم سنگ عایق الاستومری
دوشنبه 21 اردیبهشت‌ماه سال 1388
توسط: آلفا پک

اصول گرفیک سه بعدی

 

 

فضای سه بعدی :

فضای سه بعدی ( 3D Space ) عبارت از یک مکعب ریاضی تعریف شده در داخل کامپیوتر و کنترل شده توسط نرم افزارهای گرافیکی میباشد.

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

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

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

فضای سه بعدی :

فضای سه بعدی ( 3D Space ) عبارت از یک مکعب ریاضی تعریف شده در داخل کامپیوتر و کنترل شده توسط نرم افزارهای گرافیکی میباشد.

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

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

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

گرافیک سه بعدی غیر همزمان Non-Real-Time :

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

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

سخت افزارهای گرافیکی در حقیقت فقط میتوانند سه عنصر نقطه، خط، و مثلث را رسم کنند باید گفت که حتی پیچیده ترین سطوح - از یک مربع ساده گرفته تا یک نوار موبیوس – از مثلثها تشکیل شده اند. یک نکته مهم در مورد کارت های گرافیکی این است که آنها به هیچ وجه قادر نیستند بطور مستقیم منحنی رسم کنند، و حتی چند ضلعی های بیشتر از سه گوش را هم عملا نمیشناسند. نکته مهم دیگر این که هم صفحه بودن در گرافیک کامپیوتری بسیار با اهمیت میباشد، و از این رو تنها سطحی که سخت افزارهای سه بعدی قادر به رسم مستقیم آن هستند، مثلث میباشد. عملیات شکستن سطوح منحنی به مثلثهای کوچک، tessellation نامیده میشود که این روزها در برنامه های گرافیکی بعنوان یک قابلیت مهم تلقی میشود. در واقع اصطلاح Higher Order Primitive (اشیاء سطح بالا) به اشیائی اشاره دارد که هم صفحه نیستند، مثلا سطوح درجه دو یا منحنی ها. اگرچه ممکن است خیلی برنامه ها آنها را تنها با گرفتن چند ورودی از شما بر روی صفحه رسم کنند، ولی چیزی که اتفاق می افتد با چیزی که شما بر روی تصویر میبینید اندکی فرق میکند. بسته به وضوح صفحه، فاصله شیء از شما و توان گرافیکی سیستم، سطوح منحنی بر طبق محاسبات پیچیده و سنگین به یک سری مثلث کوچک تبدیل میشوند. هر چه در یک محل تعداد این مثلثهای کوچک بیشتر باشد منحنی شما هموارتر به نظر میرسد. از سایر ویژگی های اشیاء سه بعدی باید به قابلیت آنها برای دریافت نور و در نتیجه داشتن رنگ اشاره کرد. بدون نور هیچ چیز قابل رویت نمیباشد و اگر هم بتوان اشیاء را دید، نهایتا به شکل کاملا تخت و دو بعدی میسر خواهد بود. هنگامی که اشیاء موجود در یک صحنه را رسم میکنید باید به نحوه نورپردازی هم کاملا فکر کنید، زیرا زیباترین اشکال سه بعدی بدون وجود نور مناسب جلوه خوبی نخواهند داشت. در واقع دو مبحث نور و رنگ ارتباط تنگاتنگی با هم دارند؛ رنگ، دریافت چشمان ما از نوری است که به سطوح برخورد کرده و انعکاس می یابد. نور هم مجموعه ای از فوتونهاست که با برخورد به سلولهای مخروطی چشمها، آنها را تحریک میکند. حالا بار دیگر به مثال مکعب بازمیگردیم، همانطور که در طبیعت همه اشیاء دارای سطح و رنگ مخصوص به خود میباشند، اشکال سه بعدی درون صفحه کامپیوتر هم باید دارای ویژگی خاصی باشند که نوع واکنش آنها در مقابل نور را مشخص کند. در اصل، خصوصیات سطحی هر جسم ماده آن جسم نامیده میشوند. ماده یا(material) میتواند نشانگر رنگ نهایی یک جسم در حالتی باشد که نورپردازی اعمال میشود. شما میتوانید بسته به نیاز، از نورپردازی استفاده نکنید و تنها از رنگهای ثابت برای اشیاء بهره ببرید. از نکات مهم دیگر نحوه سایه زنی اشیاء است، به شکل زیر توجه کنید :

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

.

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

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

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

همه رنگها بر اساس ترکیبی از مولفه های قرمز، سبز و آبی ساخته میشوند. واژه RGB هم از حروف اول این کلمات گرفته شده است. معمولا مقدار هر یک از این سه مولفه بین 0 تا 1 میباشد. میتوان با تنظیم مقادیر مختلف برای این متغیرها انواع رنگها را ایجاد کرد.


حال به نظر شما با چه ترتیبی تصاویر سه بعدی متحرک را بر روی مانیتور نمایش میدهند. یکی از راههای ساخت تصاویر متحرک توسط کاغذ، رسم تصاویری با اختلافات جزئی نسبت به هم بر روی صفحات متوالی کاغذ میباشد، سپس میتوانید با ورق زدن این صفحات، تصاویر متحرکی را مشاهده کنید. در کامپیوتر معمولا دو (یا حداکثر سه) صفحه برای رسم تصاویر رنگی در نظر گرفته میشوند. در اصطلاح به این صفحه ها که مسئولیت نگهداری اطلاعات تک تک پیکسلهای صفحه را دارند، بافر (buffer) گفته میشود. بافرهای گوناگونی در گرافیک سه بعدی بکار میروند که میتوان از بین آنها به دو بافر رنگی (color buffer) و بافر عمق اشاره کرد. بافر رنگی غالبا مجموعه ای از دو بافر مجزا به نامهای بافر پشتی و بافر جلویی است. بافر جلویی (front buffer) صفحه ای است که در هر لحظه تصاویر را بر روی صفحه نمایش میدهد. در همین حال که اطلاعات موجود در بافر جلویی بر روی صفحه هستند، برنامه شما در حال ایجاد تغییرات مورد نظر بر روی بافر پشتی (back buffer) است؛ به محض اینکه بافر پشتی آماده نمایش شد، جای این دو بافر عوض میشود(در اصطلاح page-flipping)، این روند تا انتهای اجرای برنامه ادامه دارد و سرعت تعویض این بافرها همان سرعت اجرای برنامه شماست که با واحد فریم در ثانیه (FPS) سنجیده میشود. هر چه این نرخ بالاتر باشد، تصویری هموارتر خواهید داشت. چشمک زدن تصویر (flicker) مشکلی است که غالبا بواسطه پایین بودن نرخ فریم پیش می آید. معمولا نرخ فریمهای بالای 30، مناسب میباشند. بطور کلی هر چه صحنه شما شلوغتر باشد و در آن از تکنیکها و اشیاء بیشتری استفاده کرده باشید نرخ فریم برنامه پایینتر می آید. بافر مهمی دیگر، بافر عمق میباشد. بافر عمق (depth buffer) که گاهی اوقات بافر z هم نامیده میشود وظیفه تنظیم رنگ نهایی پیکسلهای روی مانیتور را بر عهده دارد. اگر یادتان باشد گفتیم که در گرافیک سه بعدی، همه چیز از یک سری نقاط به نام گره تشکیل شده است، گره هایی که همگی دارای مختصات سه بعدی در فضا میباشند. معمولا سیستمهای مختصاتی که در گرافیک سه بعدی بکار میروند سمت مثبت محور x را جهت راست، سمت مثبت y را جهت بالا و سمت مثبت محور z را رو به بیرون یا داخل مانیتور در نظر میگیرند. با این توضیح، فرض کنید شما در مختصات (10, 15, 5) یک کره رسم کرده اید. این کره قرمز رنگ میباشد. حالا در قسمت دیگری از برنامه نیاز به رسم یک مکعب آبی در مختصات (10, 15, 0) دارید. فرض میکنیم از سیستم مختصات چپگرد استفاده شده باشد (یعنی مختصه z به سمت داخل مانیتور میباشد)، در نتیجه کره قرمز رنگ پشت سر مکعب آبی قرار خواهد گرفت و شما قاعدتا باید تنها مکعب را در آن محل ببینید. تعیین اینکه در هر موقعیت، چه شیئی و با چه رنگی باید روی پیکسلهای صفحه رسم شود، بر عهده بافر عمق میباشد. بافر عمق، پس از ارسال موقعیت گره های هر شیء توسط شما آنها را ذخیره کرده، و در صورت رسم اشیائی دیگر (که احتمالا رنگ متفاوتی خواهند داشت) در موقعیتهای قبلی، مختصه عمق (یا همان z) اشیاء قدیم و جدید را با هم مقایسه میکند. پس از انجام این تست، هر یک از اشیاء که به بیننده نزدیکتر بود میتواند در نهایت پیکسلهای صفحه را با رنگ خود، رنگ آمیزی نماید! مطالب فوق الذکر اسکلت گرافیک سه بعدی را بنا میکنند، اما همه چیز به آنها ختم نمیشود، و روز به روز، با پیشرفت کارتهای گرافیکی، تکنیکهای ویژه ای عرضه میشوند که البته مبنای اکثر آنها همینهایی است که در بالا گفتیم. برای مثال در مبحث نور و بافت، میتوان علاوه بر نورپردازی های معمولی و نگاشت بافتهای ساده بر روی اشیاء، بسیاری از پدیده های دنیای واقعی را هم شبیه سازی نمود. بعنوان نمونه، میتوان به کمک یک ماتریس خاص و نوع ویژه ای از بافت زنی (texture mapping)، جلوه انعکاس محیط اطراف بر روی اشیاء را پیاده سازی نمود. یا میتوان بافتهای حجمی را برای ایجاد جلوه رنگین کمان یا منشور نوری بکار برد. همچنین میتوان با ترکیب مولفه های رنگی تصاویر، بافتهایی را بر روی اشیاء نگاشت که به نظر برجسته می آیند (این تکنیک bump mapping نام دارد). ایجاد مه و سایر پدیده های اتمسفری هم به راحتی در برنامه های گرافیکی امکان پذیر میباشد. اصولا دو نوع مه وجود دارد، یکی مه پیکسلی (table fog) که بصورت جدولی از پیش آماده شده در اکثر کارتهای گرافیکی پیاده سازی شده و دیگری مه گره ای (vertex fog) که با انجام محاسباتی بر روی گره های اشیاء اعمال میشود.

قبلا اشاره شد که میتوان با استفاده از ماتریسها، تصاویر متحرک را بوجود آورد. این نوع تصاویر متحرک، انیمیشن از نوع ماتریسی نامیده میشوند که علی رغم داشتن تواناییهای بالا، امروزه بدلایلی کمتر از آنها استفاده میشود. در عوض روش نسبتا جدیدتری برای ایجاد انیمیشن مورد استفاده قرار میگیرد که در اصطلاح گرافیک سه بعدی، انیمیشن اسکلتی خوانده میشود. در این روش که بیشتر برای متحرک کردن کاراکترهای بازی بکار گرفته میشود، میتوان کل بدن و دست و پای شخصیت بازی را بصورت یک شیء واحد ساخت. سپس با استفاده از قابلیتهایی همچون پوست انعطاف پذیر (skin)، حرکتهای لازم به اجزاء مختلف بدن فرد داده میشود.
از دیگر ویژگی هایی که میتوان برای واقعی تر کردن یک صحنه سه بعدی از آن استفاده کرد، سایه میباشد. سایه ها که ارتباط مستقیمی با نور دارند، بطور کلی شامل چند دسته میشوند. ساده ترین نوع آنها (همانطور که در مبحث ماتریسها اشاره شد) با نگاشتن گره های یک شیء بر روی یک صفحه تخت بوجود می آید. این نوع محدودیتهای زیادی دارد. بنابراین جز در موارد خاص از آن استفاده نمیشود. نحوه دیگر پیاده سازی سایه، کاربرد بافتهایی میباشد که حاوی تصاویر رندر شده از سایه ها و سایر اثرات نورها در صحنه میباشند. به این تصاویر ویژه light map گفته میشود. این روش سریعترین نوع ایجاد سایه است. ولی تنها میتوان برای اعمال سایه بر روی سطوح تخت از آن استفاده کرد. انعطاف پذیر ترین نوع سایه ها، سایه های حجمی هستند. سایه های حجمی (shadow volume) میتوانند بر روی هر نوع سطحی اعمال شده، و حتی قابلیت ایجاد سایه برای اشیاء متحرک را هم دارا میباشند. البته باید توجه داشت که این، پیچیده ترین و کندترین نوع سایه ها هم میباشد. از سیستمهای ذره ای (particle system) معمولا برای شبیه سازی پدیده های طبیعی همچون برف، باران، آتش، انفجار و گرد و غبار استفاده میشود. سخت افزارهای جدید، دارای اشیاء آماده ای میباشند که میتوانند بطور مستقیم رندر شده، و حتی تصویری را هم بعنوان بافت بر روی خود داشته باشند. بدین ترتیب میتوان با تنظیم موقعیت، سرعت حرکت، تعداد، طول عمر، رنگ و بافت این ذرات (point sprite) انواع پدیده ها از جمله آتش و برف و باران را به شکلی کاملا واقعی در صحنه های سه بعدی ایجاد کرد. قبلا به بافرها اشاره کردیم، ولی یک بافر مهم دیگر هم وجود دارد. یعنی بافر استنسیل (stencil buffer) که تکنیکهای بسیار زیادی توسط آن قابل پیاده سازی میباشند. از جمله این تکنیکها سایه حجمی (که پیشتر به آن اشاره شد)، آینه، ماسک کردن تصویر، برش زدن مناطق دلخواهی از تصویر، ایجاد اشیاء شفاف، محو تصاویر در پس زمینه و ترکیب تصاویر با هم میباشد. در آخر هم باید به سایه زنها اشاره کنیم. سایه زنها (shader) در واقع پرده آخری میباشند که فراروی شما قرار دارند. با عرضه سایه زنها، و زبانهای سایه زنی، انقلابی در عرصه گرافیک کامپیوتری ایجاد شد و بسیاری از محدودیتهای که تا چندی پیش در سر راه برنامه نویسان گرافیکی (بخصوص سازندگان بازی) قرار داشتند عملا کنار رفتند. امروزه سایه زنهای گره، سایه زنهای پیکسل، سایه زنهای بافت و سایه زنهای نوری وارد صحنه شده اند و میتوان توسط زبانهایی مثل Assembly، C، و حتی Delphi برای آنها برنامه نوشت. وقتی شما از سایه زنها استفاده میکنید، به گونه ای خط رندر کارتهای گرافیکی را بطور کامل تحت تسلط خود در آورده اید. در اینجا کلیه عملیات، از گرفتن گره های ورودی، پردازش، تبدیل، برش، و نگاشت آنها تا پیاده سازی فرمولهای مه، نورپردازی، بافت زنی، سیستمهای ذره ای و انعکاسهای نوری بر عهده خودتان میباشد. حتی میتوانید در سطحی پایینتر، بر روی تک تک پیکسلهای صفحه کار کنید و آنها را با فرمولهای ابداعی خودتان تحت تبدیلات مختلف قرار دهید.
در انتها نام چند از بزر گان و پایه گذاران گرافیک کامپیوتری سه بعدی را ذکر میکنیم :

افرادی چون James Blinn، Andy Catmull، Phillip Taylor و John Carmack
در کل می توان گفت این مقوله هر روز رو به گسترش و پیشرفت است وجای کار بسیاری برای افراد کنجکاو و جویای پیشرفت دارد به عنوان مثال می توان به مبحث سایه زنها که در پیش شرح داده شد اشاره کرد که امروزه موضوع اصلی رقابت سازندگان کارت های گرافیک است.
به امید روزی که متخصصان ایرانی جای واقعی خود را در این زمینه پیدا کنند.

******************************
منابع :
ویژه نامه ی کلیک روزنامه ی جام جم مورخ 1387.2.29 دو مقاله ی
گرافیک با طعم رایانه نوشته ی فریبا فرهادیان
تصاویر سه بعدی ، جادوی گرافیک دو بعدی نوشته ی رضا صادقی
دانشنامه ی آزاد ویکی پدیا به آدرس http://fa.wikipedia.org مقاله های
کامپیوتر گرافیک سی اس (آشنایی با گرافیک کامپیوتری ) نوشته ی سید علی الحسینی
گرافیک دو بعدی
گرافیک سه بعدی
گرافیک و صنعت چاپ
پویانمایی