استاد سجاد ربیعی مدرس دوره های Houdini در cmiVFX و بخش آخر از سری مقالات تفاوت زبان های اسکریپت نویسی و برنامه نویسی را در ادامه خواهیم داشت . در این مقاله به 3 روش از استفاده از Python در Maya ، استفاده از Python به جای زبان MEL ، استفاده از Python به جای API ،استفاده از PyMEL و ایجاد پل ارتباطی RealTime بین نرم افزار Maya و نرم افزار Houdini ، نمونه برنامه در PyMEL به صورت شی گرا و همچنین آشنایی کلی با PyQt از مباحث این مقاله است .
تفاوت زبان های اسکریپت نویسی و برنامه نویسی
آشنایی با PyMEL ، Python ، API ، PyQt
(قسمت آخر)
کانال مقالات استاد سجاد ربیعی در ImanVFX
آشنایی با مفاهیم زبان های برنامه نویسی و اسکریپت نویسی در انیمیشن و VFX قسمت 1
آشنایی با مفاهیم اولیه زبان های برنامه نویسی و اسکریپت نویسی در انیمیشن و VFX قسمت 2
آشنایی با مفاهیم اولیه زبان های برنامه نویسی و اسکریپت نویسی در انیمیشن و VFX قسمت 3
آشنایی با مفاهیم اولیه زبان های برنامه نویسی و اسکریپت نویسی در انیمیشن و VFX قسمت 4
آشنایی با مفهوم Physically Based Rendering در موتورهای رندر
تفاوت زبان های اسکریپت نویسی و برنامه نویسی,قسمت 5 معرفی اسکریپت نویسی
تفاوت زبان های اسکریپت نویسی و برنامه نویسی,سجاد ربیعی قسمت 6
تفاوت زبان های اسکریپت نویسی و برنامه نویسی,سجاد ربیعی قسمت 7
تفاوت زبان های اسکریپت نویسی و برنامه نویسی,آشنایی با PyMEL – Python – API – PyQt
مروری بر مقاله قبلی
در مقاله قبلی با انواع زبان های اسکریپت نویسی معروف آشنا شدید و همچنین راجب سیستم جدید در اسکریپت نویسی صحبت کردم که به آن اسکریپت نویسی ویژوال یا Node Base میگویند ، گفته شد که در این روش اسکریپت نویسی ما به جای نوشتن و تایپ کردن کدها ، از Node ها و connect کردن آنها به یکدیگر استفاده میکنیم. گفته شد که نوشتن برنامه به این روش بسیار ساده تر و خوانا تر از روش های متداول میباشد و شرکت ها و نرم افزار های امروزی هر یک به نحوی مشغولند تا این تکنولوژی را در خود جای میدهند. مثلا تازه ترین این اتفاقات ، اضافه کردن بخش Max Creation Graph به نرم افزار 3D Max 2016 توسط شرکت Autodesk می باشد. همچنین گفته شد که از بین تمام زبان های اسکریپت نویسی ، زبان Python از بقیه بسیار رایج تر و پرکاربرد تر میباشد ، به این دلیل که در اکثر نرم افزار ها و سیستم عامل ها قابل استفاده میباشد و همچنین کتابخانه ها و امکانات جانبی بسیار زیادی دارد. گفته شد که در حوزه انیمیشن و جلوه های ویژه ، یکی از مهمترین کاربرد های Python در نرم افزار Maya میباشد و قرار شد که در این مقاله در ارتباط با استفاده های مختلف آن در Maya صحبت بکنم.
ادامه مقاله
خوب در مقاله قبلی گفتم ما به 3 روش از Python در Maya استفاده میکنیم ، عموما دوستان تنها با یکی از این روش ها کار میکنند یا فکر میکنند که همه این روش ها فقط در مورد اول خلاصه میشوند ، در حالی که اینطور نیست و هر یک با دیگری تفاوت های زیادی دارد. روش های استفاده از Python در Maya :
1. استفاده از Python به جای زبان MEL
2. استفاده از Python به جای API
3. استفاده از PyMEL
استفاده از Python به جای زبان MEL
این روش متداولترین روش میباشد و تقریبا 99.9% دوستان با این روش کار میکنند ، این روشی است که همه فکر میکنند روشهای دیگر زیر مجموعه این روش قرار دارند ، ولی جالبه بدانید که این روش ، ساده ترین ، ضعیف ترین و کندترین روش برای استفاده از Python در Maya می باشد ! چرا ؟ اجازه بدید اول این روش را معرفی بکنم . شاید متوجه شدید که در بیشتر اسکریپت های Python که در اینترنت وجود دارند یا خودتان مینویسید ، در خط اول برنامه از این دستور استفاده شده است : maya.cmds یا همچین چیزی . در زبان Python ما به کتابخانه ها ، ماژول یا Module میگوییم (در مقالات قبلی توضیح دادم که کتابخانه ها ، مجموعه بسیاری زیادی تابع و دستور در خود دارند که ما با اضافه کردن این کتابخانه ها به برنامه خود ، میتوانیم از توابع و دستورات داخلی آنها استفاده بکنیم ) ، برای استفاده از کتابخانه ها و یا ماژول ها ما ابتدا باید با دستور import آنها را به برنامه خود وارد کنیم تا بتوانیم از دستورات و توابع داخل آن استفاده بکنیم. در روش اول برنامه نویسی Python در Maya ما از ماژول maya.cmds استفاده میکنیم ، این ماژول امکان استفاده از تمامی توابع زبان MEL را در زبان Python به ما میدهد ، خوب مشکل این روش همینجاست ، در حقیقت در روش اول Python ، ما هنوز داریم با زبان MEL برنامه مینویسیم ولی فقط این کدها را با زبان Python تایپ میکنیم ، در حقیقت در این روش زبان Python روی زبان MEL قرار میگیرد و دستوراتی را که ما به زبان Python مینویسیم مستقیما به زبان MEL تبدیل میشوند و بعد اجرا میشوند ، خوب این روند دو تا مشکل ایجاد میکنه : 1. چون هنوز به زبان MEL وابسته هستیم ، بنابراین دستورات Python که مینویسیم از لحاظ سرعت تفاوتی با زبان MEL ندارد. (البته به جز مواقعی که این سرعت مربوط به دستورات اصلی زبان برنامه نویسی میباشد ، مثل زمانهایی که از Loop ها و حلقه ها استفاده میکنیم که در این زمان Python بسیار سریعتر از MEL است ، بنابراین در بیشتر برنامه ها ، سرعت Python از MEL بیشتر است ) 2. گفتم که زبان Python یک زبان شی گرا مثل ++C می باشد و شی گرا بودن یک زبان بسیار بسیار مزیت بزرگی میباشد ، ولی زبان MEL یک زبان شی گرا نمی باشد و به آن تابع بیس میگویند ، خوب وقتی در روش اول برنامه نویسی Python قراره دستورات ما به زبان MEL تبدیل بشوند و یا اینکه ما در حقیقت داریم از همان توابع MEL استفاده میکنیم ، پس نمیتوانیم از این دستورات به صورت شی گرا یا Object Oriented استفاده بکنیم و این خیلی بد است !
پس چرا باید از Python استفاده کرد ؟
خوب اینجا میتوانید سوال کنید که اگر نوشتن برنامه با ماژول maya.cmds چیزی شبیه MEL است و همچنین ما نمیتوانیم به صورت شی گرا برنامه بنویسیم ، مگر ما مجبوریم که از Python استفاده کنیم ؟ خوب میتوانیم از MEL استفاده کنیم که یادگیری آن بسیار راحتتر هست ! مسلما اگر شرکت Autodesk امکان برنامه نویسی Python را در کنار MEL داده ، حتما باید مزیتی هم داشته باشد ، این مزیت و همچنین جواب سوال شما ، امکانات ویژه زبان Python نسبت به MEL می باشد.
امکانات Python نسبت به MEL
اگرچه ما با ماژول maya.cmds نمیتوانیم از دستورات Maya به صورت شی گرا استفاده کنیم ، ولی اگر نیازباشد که خودمان تابع و یا دستور جدیدی و انحصاری را بنویسیم ، میتوانیم به صورت شی گرا آنها را بنویسیم. 2. کتابخانه ها و توابع داخلی زبان Python نسبت به MEL بسیار گسترده تر و کاملتر است ، مثلا با وارد کردن ماژول os به برنامه خودمان ، میتوانیم به تمامی توابع مربوط به کارکردن و ارتباط با سیستم عامل دسترسی داشته باشیم. 3. از لحاظ امکانات کد نویسی ، کلا زبان Python از MEL پیشرفته تر و کاملتر است ، مثل کار کردن با انواع اطلاعات متنی یا string که dictionary ها در پایتون یکی از این امکانات هستند Python بسیار قدرتمند است ، یا ساخت و کار کردن با متغیرها در پایتون بسیار راحتتر و بهتر است ، به طور مثال ما در زبان Python میتوانیم هر وقت که لازم است نوع متغیر های از پیش تعریف شده را تغییر دهیم . (مثلا نوع Int را به String تبدیل کنیم بدون اینکه نام متغیر را تغییر دهیم ) 4. چون برنامه های دیگری هم ممکن هستند با پایتون سازگاری داشته باشند مثل Nuke یا Houdini ، ما خیلی راحتتر میتوانیم یک پل ارتباطی بین این نرم افزار ها با نرم افزار Maya بزنیم . من قبلا دو پروژه ساخته بودم که از زبان Python برای ارتباط بین نرم افزار های Maya و Nuke و همچنین Maya و Houdini استفاده کرده بودم ، برای آشنایی بیشتر پیشنهاد میکنم که فیلم این ابزارها را در لینک های زیر مشاهده فرمایید :
ابزاری برای اضافه کردن امکان کامپوزیت نرم افزار Nuke در برنامه Maya
ویدئو از Vimeo
به زودی لینک مستقیم خواهد شد
ایجاد پل ارتباطی RealTime بین نرم افزار Maya و نرم افزار Houdini
ویدئو از Vimeo
به زودی لینک مستقیم خواهد شد
خوب با توجه به توضیحات بالا متوجه شدید که اگر بخواهیم اسکریپت خیلی بزرگ و پیچیده ای بنویسیم ، مسلما با امکانات زیاد زبان پایتون ، نوشتن آن برنامه با پایتون راحتتر باشد.
استفاده از Python به جای API
پس فهمیدیم که در روش اول زبان Python روی زبان MEL سوار میشود و ما میتوانیم از دستورات زبان MEL در قالب زبان Python استفاده بکنیم ، در روش دوم زبان Python روی زبان ++C و دستورات آن سوار میشود ، قبلا گفتم که زبان C در مایا شامل دستورات و کتابخانه های API در مایا میشود که ما به وسیله آن میتوانیم پلاگین بنویسیم ، خوب وقتی Python روی C سوار شود بدین معنی است که ما با زبان Python به API مایا دسترسی پیدا میکنیم و میتوانیم به وسیله کتابخانه های آن مثل maya.openmaya برای Maya پلاگین بنویسیم ، خوب نوشتن برنامه پلاگین با Python مزیت بزرگی است ، چون زبان Python از زبان C بسیار بسیار ساده تر است بنابراین نوشتن پلاگین با این روش بسیار ساده خواهد بود ، همچنین وقتی ما میخواهیم پلاگینی را با C برای Maya بنویسیم ، باید حتما آن را در نرم افزار های برنامه نویسی مانند Visual Studio بنویسیم و نهایتا برنامه را کامپایل کنیم تا یک فایل mll ساخته شود و ما آن را در Maya در پنجره Plug-in Manager فعال کنیم تا بتوانیم از آن پلاگین استفاده بکنیم ، اما با نوشتن پلاگین با زبان Python ما نیازی به نرم افزار های برنامه نویسی نداریم و میتوانیم برنامه خود را در خود مایا در پنجره Script Editor یا حتی برنامه Node Pad در ویندوز بنویسیم و مستقیما آن را در Plug ins Manager فعال کنیم ، خوب این خیلی کار ما را راحت میکند ، همچنین در روش دوم برنامه نویسی Python در Maya ، چون ما در پشت پرده داریم از دستورات زبان ++C اسفاده میکنیم ، بنابراین ما میتوانیم از قابلیت شی گرا بودن استفاده کنیم و به جای استفاده از توابع ساده ، میتوانیم از کلاس ها و آبجکت ها در برنامه نویسی استفاده کنیم. با تمام این مزیت ها ، تنها یک عیب وجو دارد که باعث میشود در برخی از پلاگین ها نتوانیم از زبان Python استفاده بکنیم ، احتمالا خودتان این عیب را حدس زدید و آن سرعت کم Python نسبت به ++C است ، به جز اینکه زبان ++C یک زبان سطح پایین است (یعنی زبان C ماهیتا از Python سریعتر است) ، چون کدهای ما در Python قراره به دستورات ++C تبدیل شود ، این خود اندکی تاخییر به وجود می آورد. البته به جز مورد بالا ، زبان C یک مزیت دیگر هم دارد و آن این است که بیشتر کتابخانه ها و API های بزرگ نظیر انواع موتور های فیزیک . موتور های رندر ، تنها در زبان C قابل استفاده هستند.
چرا ما باید با Python برنامه پلاگین بنویسیم ؟ چرا نباید از خود C استفاده کرد ؟
معمولا در دو مورد برای نوشتن پلاگین در Maya از Python استفاده میکنند. اول اینه که همانطور که قبلا گفتم ، برنامه نویسی با زبان C بسیار سختتر از سایر زبانها به ویژه Python میباشد ، بنابراین نوشتن پلاگین با Python ساده تر است ، پس اگر در پلاگینی که مینویسید ، سرعت اجرای دستورات زیاد مهم نیست و یا نیاز به استفاده از API های مختلفی که تنها در زبان C قابل استفاده نیستند ندارید ، بهتر است از زبان Python استفاده بکنید. همچنین در موارد دیگری هم از پایتون استفاده میکنند ، فرض کنید که قرار است ابزاری بنویسید که سرعت اجرای دستورات در آن خیلی مهم است ، مثل همان نوشتن Deformer ، چون با زبان Python خیلی زودتر و راحتتر میتوانید برنامه خود را بنویسید ، ابتدا میتوانید با Python ابزار خود را بسازید ، بعد از اینکه مطمئن شدید برنامه و منطق برنامه شما درست کار میکند ، میتوانید نهایتا ابزار خود را با زبان C بازنویسی کنید.
استفاده از PyMEL
خوب تا اینجا فهمیدید که اگر با ماژول maya.cmds کار کنید ، از قابلیت شی گرا یا Object Oriented نمیتوانید استفاده کنید . شرکت Autodesk در این رابطه ابتکار دیگری به خرج داده و امکان برنامه نویسی با PyMEL را به کاربران Maya داده که این مشکل بالا را حل میکند. در PyMEL شرکت Autodesk از اول تمامی دستوراتی را که در زبان MEL موجود هستند را به صورت شی گرا برای Python بازنویسی کرده و آنها را در کتابخانه های مخصوص Python قرار داده است. وقتی کدی را با maya.cmds مینوسید و تابعی را صدا میزنید ، کد شما ابتدا به زبان MEL تبدیل میشه و بعد این کد تابعی را در زبان C صدا میزند تا دستور شما اجرا بشود. ولی در PyMEL دستور شما به API مربوط به Python که ماهیت شی گرا دارد منتقل میشود و سپس تابعی را در زبان C صدا میزند و بنابراین شما میتوانید به صورت شی گرا برنامه بنویسید. حتی به دلیل قدرت و سرعت زبان Python نسبت به MEL ، اگر برنامه مشابهی را با MEL و PyMEL بنویسید ، این برنامه در PyMEL بسیار بسیار سریعتر از مشابه خود در MEL اجرا میشود ، برای تست این موضوع میتوانید اسکریپت PyMEL و MEL را برای خروجی گرفتن مدلهای Maya در قالب فرمت .x پیدا کنید (فرمت مخصوص مدل در DirectX) ، سپس یک مدل بسیار سنگین را با هر دو خروجی بگیرید ، خواهید دید که نمونه PyMEL قادر است نزدیک به 5 برابر سریعتر از نمونه MEL مدل شما را خروجی بگیرد ! چون میتوانید به صورت شی گرا برنامه نویسی کنید ، کار شما بسیار راحتتر از زبان Python معمولی میشود ، در بخش زیر من نمونه یک برنامه را در PyMEL و Python معمولی (maya.cmds) براتون نوشتم. این برنامه مختصات translate Y را برای اولین مدل polygon موجود در Maya میگیره و برای ما این عدد را چاپ میکند.
نمونه برنامه گرفتن مختصات مدل در Python معمولی
import maya.cmds as cmds Meshes = cmds.ls(type=”mesh”) ParentFirstMesh = cmds.listRelatives(Meshes[0] , p = 1) GetTranslateY = cmds.getAttr(ParentFirstMesh[0] + “.translate”)[0][1] print GetTranslateY
نمونه برنامه در PyMEL به صورت شی گرا
from pymel.core import * GetTranslateY = ls(type=’mesh’)[1].getParent().translate.get().y print GetTranslateY
خوب دیدید که این برنامه در PyMEL بسیار ساده تر و خوانا تر نوشته شده است.
توجه
کلا زبان Python از MEL سریعتر است ، حالا چه از Python معمولی استفاده بکنید و چه از PyMEL ، بنابراین اگر در برنامه خود مثلا یک Loop ساخته باشید که قراره یک کار خاص را انجام بده ، PyMEL و Python هردو از MEL سریعتر هستند و همچنین اختلاف سرعت این دو تفاوت چندانی با هم ندارند (چون هردو پایتون هستند) . حالا با توجه به صحبت های بالا اگر بخواهیم یک مقایسه سرعت بین روش های مختلف برنامه نویسی و پلاگین نویسی در Maya انجام دهیم ، احتمالا به همچین چیزی میرسیم :
MEL < (Python/PyMEL) < Python API < C++ API
بنابراین از لحاظ سرعت رتبه 1 را باید به C++ API بدهیم و از لحاظ سرعت یادگیری رتبه 1 را باید به MEL بدهیم.
آشنایی کلی با PyQt
بسیاری از دوستان وقتی میخواهند کلمه Qt را بخوانند ، به آن کیو تی میگویند ، در حالی که تلفظ صحیح آن کیوت میباشد ، اگرچه به صورت محاوره ای در برخی از فیلم ها به آن کیو تی میگویند ! اگرچه این مقاله تا اینجا به اتمام رسیده است ، ولی لازم میدونم تا به صورت بسیار خلاصه و کوتاه راجب PyQt توضیحاتی را ارائه بدهم ، چون کلمه PyQt هم دقیقا مثل کلمات Python ، PyMEL و API زیاد به چشم میخورد. در برنامه نویسی برای انواع سیستم عامل ها ، ما برنامه خود را به دو بخش تقسیم میکنیم : 1. هسته یا Core اصلی برنامه که در حقیقت همان برنامه ای است که ما مینویسیم. 2. رابط یا محیط گرافیکی و کاربری برنامه که به آن GUI یا Graphical User Interface میگویند ، GUI در حقیقت شکل گرافیکی برنامه که شامل دکمه ها ، منوها و پارامترها میباشد که کاربر از طریق آنها اطلاعات خود را به هسته یا Core منتقل میکند ، مثلا نرم افزار Maya یک هسته داخلی دارد که ما آن را نمیبینیم ، و یک GUI دارد که وقتی Maya را باز میکنیم آن را میبینیم که شامل بخش های مختلف نظیر Viewport ، Attribute Editor ، TimeLine ، ، Menu Bar ، StatusLine و غیره می باشد. خوب اگرچه نوشتن خود هسته و منطق اصلی برنامه ممکن است سخت باشد ، ولی نوشتن و ساختن محیط کاربری و همچنین ارتباط این رابط کاربری با هسته اصلی نرم افزار هم با روش های قدیمی کار زیاد راحتی نیست. قبلا بیشتر برنامه نویسان مجبور بودند که خود این رابط کاربری را برنامه نویسی کنند و بسازند ، ولی کم کم شرکت های مختلفی پیدا شدند که یکسری کتابخانه و API ساختند تا برنامه نویسان نرم افزار ، بدون وقت گذاشتن زیاد روی ساخت GUI بتوانند از این کتابخانه ها برای ساخت GUI استفاده کنند . کتابخانه های زیادی در این رابط وجود دارند ، مثل wxWidgets ، GTK ، FTK و غیره. اما شاید بتوان گفت که بهترین ابزار برای ساخت GUI ، ابزار Qt که توسط شرکت Nokia ساخته شده است ، میباشد. این ابزار روی تمامی سیستم عاملها و Device ها نظیر Windows ، Linux ، IOS ، IOX ، Android و همه کامپیوتر ها ، گوشی های موبایل و تبلت ها قابل استفاده میباشد. شرکت Autodesk از نسخه Maya2010 به بعد ، محیط کاربری Maya را با Qt بازنویسی کرد و به همین دلیل از آن زمان به بعد ، برنامه نویسان و اسکریپت نویسان Maya قادرند تا از Qt در برنامه های نوشته شده با زبان Python ، MEL ، C استفاده کنند و برای برنامه نوشته شده خود GUI بسازند. اگر برنامه نویس قدیمی MEL در Maya باشید ، حتما به خاطر دارید که قبلا وقتی میخواستیم برای اسکریپت خود یک پنجره و UI بسازیم ، چه قدر با زبان MEL این کار سخت و دشوار بود ، به صورت دستی باید Layout می ساختیم و همیشه هم سر Parent کردن دکمه ها و پارامتر ها به این Layout ها به Error برخورد میکردیم. اما به کمک Qt الان میتونیم بسیار راحتتر و سریعتر از قبل ، هم برای اسکریپت های Python ، و هم برای اسکریپت های MEL ، رابط کاربری بسیار پیشرفته بسازیم. حالا کلمه PyQt هم به همین معنا میباشد ، یعنی ما با PyQt به یکسری از کتابخانه ها و ماژول هایی دسترسی داریم که به کمک آنها میتوانیم برای برنامه Python خود یک رابط کاربری زیبا با Qt بسازیم. چون بحث Qt خود خیلی گسترده و وسیع است ، انسالا توضیحات کاملتر مربوط به آن را در مقالات دیگری ارائه میدهم.
سخن پایانی
بالاخره این مجموعه مقالات برنامه نویسی و اسکریپت نویسی به اتمام رسید و فکر میکنم تمام چیزهایی را که روز اول دوست داشتم در این مقاله بنویسم را نوشتم. به نظر بنده این مقاله برای دوستان علاقه مند از انواع فیلمها و کتابهای آموزش برنامه نویسی میتواند مهمتر است ، اولا به دلیل اینکه معمولا در فیلمهای آموزشی در مورد این مفاهیم زیاد صحبت نمیشود و دوما به این دلیل که بیشتر چیز هایی که در این مقالات توضیح دادم در مورد نرم افزار خاصی نیست و دوستانی که با انواع نرم افزارها کار میکنند ، اگر میخواهند وارد مسیر آموزش برنامه نویسی بشوند ، میتوانند با خواندن این مقالات ، آن مسیر و زبان برنامه نویسی را که بیشتر به دردشان میخورد را به درستی انتخاب بکنند . دوستانی هم که به برنامه نویسی علاقه ای ندارند هم ، با خواندن این مقالات ، اطلاعات عمومی خوبی در این رابطه میتوانند بدست بیاورند تا اگر روزی به این کلمات و مفاهیم برخورد کردند (که حتما در انیمیشن و VFX برخورد میکنند ) ، بدانند آنها چی هستند ! فکر کنم حالا دیگه اگر کسی پیدا شد و ابزاری را که با زبان MEL یا ماژول maya.cmds در Python نوشته بود را به شما نشان داد و گفت که یک پلاگین نوشته است ، شما میدانید به او باید چی بگید 🙂 ! یا اینکه اگر شخصی از شما دلیل استفاده از ++C و یا Python را پرسید ، میتوانید جواب کاملی به او بدهید. من برای نگارش این مقاله با تمام محدودیت های زمانی که داشتم ، سعی کردم همه دانسته های خودم را با زبانی روان به همراه مثالهایی ساده بیان کنم تا کسانی که همیشه از برنامه نویسی ترس داشتند ، اندکی از ترسشان کم بشود و بتوانند با آگاهی از این مفاهیم ، قدمی جدید را بردارند و وارد بخش جدید از انیمیشن و VFX بشوند که به کمک این بخش میتوانند پروژه هایی را فراتر از امکانات نرم افزار انجام دهند. انشالا این پایان مقالات بنده نمیباشد و مقالات دیگری هم مربوط به بخش های مختلف انیمیشن نظیر داینامیک و رندر مینوسم ، انشالا مقالاتی که نوشتم را بزودی در سایت خودم و همچنین سایت ImanVFX منشر میکنم. اگر هم در مورد اصطلاحت و بخش هایی خاص از انیمیشن دوست داشتید مقاله ای بنویسم ، حتما پیشنهادات خود را برای بنده ایمیل بکنید تا در صورتی که در توانم بود ، در مورد این موضوعات ، مقالات دیگری بنویسم.
همیشه موفق و پیروز باشید
سجاد ربیعی
23 دیدگاه
رسول
ممنون
امیرعباس فیض
سلام سجاد !
احسان
عزیزم خسته نباشی واقعا کلی اطلاعات کسب کردم.
به امید مقالات جدید (:
مرتضی
سلام
دیدم این دوره تموم شده، گفتم کل هشت قسمت رو تبدیل به یه کتاب با فرمت epub کنم. فرمت Epub فرمت خیلی عالی ای برای مطالعه توی کتابخوان ها و یا گوشی های هوشمنده. از لینک زیر می تونین دانلودش کنین:
http://iranupload.com/nkqrctxi6gzf/tfawt_zban_hay_askhrypt_nwysy_w_-_sjad_rby`y.epub.html
سجاد ربیعی
بله ، از پیشنهادتون ممنونم ، حتما چک میکنم.
دانیا
واقعا عالی بود من با مقالات ارزشمند شما برنامه نویسی را شروع کردم.
سجاد ربیعی
سلام ، بسیار خوشحالم که این مقالات تونسته کمکی به شما بکنه و انشالا که خیلی زود بتونید از این انتخابتون بهره ببرید.
مصطفی
سلام استاد ممنون از مقالات ارزش مندتون .یک سوال دارم ولی نمیدونم اصلا صورت مسئله ام درسته یا نه.فرمودید سرعت پایتون از C کمتره.خوب آیا راهی هست که ما کد های نوشته شده با پایتون رو به C تبدیل کنیم و از اونا برای «پلاگین» استفاده کنیم
یعنی یه جورایی کد های پایتونِ تبدیل شده به C رو کپی پِیست کنیم
که هر بار احتیاج نباشه پایتون اجرا بشه ؟
مرتضی گشتی
با سلام
واقعا از سجاد عزیز تشکر می کنم که این سری مقالات رو بطور رایگان در اختیار عموم قرار داد. با خواندن این مقالات نسبت به گذشته دیدم خیلی بازتر شد و الان میتونم کد نویسی رو راحتتر دنبال کنم.
در مورد ترجمه هم که قرار بود منتشر کنم بخاطر تآخیر ایجاد شده (بعلت خرابی کارت گرافیک و بعد از اون هم مسافرت) عذر میخام و انشاالله در آینده نزدیک دراختیار دوستان قرار خواهم داد.
سجاد ربیعی
خواهش میکنم ، انشالا که مشکلتون زود حل بشه.
جواد
دست شما درد نکنه جناب ربیعی عزیز
و همین دست آقا ایمان عزیز و آقای زراعتی هم درد نکنه بخاطره زحماتشون
سجاد ربیعی
خواهش میکنم ، دوست عزیز ، لطف دارید.
مرتضی
درود بر سجاد ربیعی عزیز. واقعا خسته نباشید بابت این همه زحمت.
میشه در مورد شی گرایی هم توضیح بدین؟آخه هر سایتی یک تعریفی از شی گرایی داره و من واقعا گیج شدم که برنامه نویسی شی گرا چیه و چه فرقی با برنامه نویسی پیمانه ای داره؟
سجاد ربیعی
بله ، اتفاقا حدس میزدم که دوستان با تعریف شی گرا که در این مقاله چندین بار گفتم ، مشکل بخورند، امکان شی گرا بودن توضیحات زیادی داره که شاید خود یک مقاله بشه ، ولی در حد مختصر که مشکلتون حل بشه میتونم توضیح بدم.
اگر چه برنامه نویسی شی گرا مزیت های زیادی داره ، ولی یکی از مهمترین آنها را در خدممتون توضیح میدهم.
در برنامه نویسی شی گرا ما چیزی به اسم کلاس یا Class داریم که چیزی شبیه به یک گروه یا کتابخانه میباشد که در داخل آن تعداد زیادی تابع را قرار میدهیم.
فرض کنید که میخواهید یک برنامه رندر بنویسید ، در برنامه رندر خود تعداد زیادی تابع برای نور ، دوربین ، متریال و غیره دارید ، مثلا یک تابع برای ساخت دوربین دارید ، یک تابع برای ساخت نور ، چند تابع برای ساخت متریال و غیره ، حالا اگر بخواهید زمان کد نویسی یک نور یا دوربین بسازید ، باید بین تعداد بسیار زیادی تابع که دارید بگردید و از بین آنهایی که برای نور است ، تابع مخصوص ساخت نور را پیدا کنید و استفاده کنید. ولی با کمک کلاس یا Class (برنامه نویسی شی گرا) ، شما میتوانید تابع های مخصوص نور را در کلاسی به اسم Light قرار دهید و تابع های مخصوص دوربین را در کلاسی به اسم Camera قرار دهید و تابع های متریال را در کلاس Material قرار دهید.
حالا در برنامه نویسی اگر بخواهید یک نور بسازید ، فقط کافیه اسم کلاس نور یا Light را تایپ کنید و بعد از آن اسم تابع ساخت نور را بنویسید (معمولا برنامه های IDE به صورت خودکار بعد از تایپ کردن اسم کلاس ، اسم تمامی تابع های داخل آن را به شما نشان میدهند) ، چیزی مثل کار زیر :
Light.createLight
بنابراین میبینید که یکی از کاربرد های کلاسها ، دسته بندی و منظم کردن توابع میباشد ، کلاس ها کاربرد های دیگری هم دارند که در مقاله دیگر توضیح میدهم.
فقط این را بدانید که کلاس ها چیزی شبیه کلاس های درس در دانشگاه میباشد ، در هر کلاس دانشجویانی که شرکت میکنند ، توابع هستند ، بنابراین در کلاس ریاضی ، تنها کسایی شرکت میکنند که رشته ریاضی میخونند ، یا در کلاس جغرافی به همین ترتیب ، حالا شما اینجوری خیلی راحت میتونید تمامی کسانی(توابع) رو که ریاضی میخونند یا به ریاضی مربوط هستند را پیدا کنید ، فقط کافیه برید سر کلاس ریاضی !
هر زبان برنامه نویسی که از قابلیت کلاس ها برخوردار باشد را میگویند Object Oriented .
البته دوباره تاکید میکنم که برنامه نویسی شی گرا فقط به این مورد محدود نمیشود و امکانات بسیار دیگری نظیر وراثت را دارا هستند که اینجا توضیح نمیدهم.
موفق باشید
nadali
سلام خسته نباشید ناشنوا هستم لطفا اموزشی برنامه نویسی یادبگیرم؟؟
ایمان . ب
سلام
چه زبانی رو می خواین یاد بگیرین ؟
danial
سلام اقای ربیعی عزیز .
مطالب واقعا عالیی بودن دستتون درد نکنه 🙂
amir
خسته نباشید واقعن از خوندن مقالاتتون لذت بردم و همشون رو خوندم.منتظر مقالات دیگری از شما هستیم.
تشکر
nima
عالی بود بی صبرانه منتظر مقلات بعدی شما هستم.
فقط در پایان من چند تا سوال دیگه در رابطه با این سری مقالات برام پیش اومد با عرض پوزش اگر زیاد سوال میپرسم:
1_پلاگین هایی نظیر FumeFX یا Arnold که برای مایا نوشته شدن با تمام قسمت های مایا سازگاری ندارن، این عدم سازگاری به خاطر خواسته ی عمد خود شرکت های سازنده ی پلاگین هست یا واقعا مشکلی وجود دارد؟؟؟؟
به عنوان مثال در خود سایت solidangle نوشته شده که موتور رندر آرنولد فعلا از پارتیکل های مایا که به صورت thick cloud هستند پشتیبانی نمیکند و اگر شما از این نوع پارتیکل رندر بگیرید حاصل کار گوی هایی گرد خواهد بود!!!!!
یا در پلاگین FumeFX چنانچه بخواهیم یک آتش را با پارچه تماس دهیم به ناهماهنگی هایی بر میخوریم و مجبوریم آتش رو به ذررات نسبت دهیم!!!!!
——————————————————————–
2_هر پلاگین خود API دارد مثلا همین آرنولد خودش در هنگام نصب به مایا SDK خود را اضافه میکند.
این امکان چه کاربردی دارد؟آیا از این SDK میتوان برای رفع محدودیت ها نظیر آنچه که در شماره یک پرسیدم استفاده نمود؟؟؟؟
——————————————————————–
3_چرا زبان MEL با برخی از متغیر ها مشکل دارد؟؟
به عنوان مثال چنانچه شما در شرط اولیه حلقه ی for از متغیری با نام i$ استفاده کنید اسکریپت شما با خطا مواجه خواهد شد و جالبتر این ماجرا اینجاست که پیام خطای این حالت هم هیچ ارتباطی با نام i$ ندارد!!!
یا در مثالی دیگر:
string $sel[] = `ls -sl -tr`;
با کمال تعجب وقتی این کد رو اجرا میکنم خطای:
// Error: Line 1.13: Invalid redeclaration of variable “$sel” as a different type. //
نمایش داده میشود حالا اگر شما متغیر رو string $selList[] تعریف کنید مشکل حل میشود!!!!!
فوق العاده سپاس گزار از شما استاد گرامی و ارجمند.
سجاد ربیعی
سلام.
1. در مورد سوال اولتون باید بگم ، یکسری از چیزها مثل مثالی که برای رندر پارتیکل با Arnold زدید ، فقط چون برای شرکت نسبت به سایر امکانات دیگر که باید اضافه کند از درجه اهمیت کمتری برخوردار است ، هنوز این امکان را اضافه نمیکنند ، وگرنه اگر شرکت بخواهدمیتواند بسیاری از آنها را حل کند و برای آنها انجام آن زیاد مشکل نیست . در مورد FumeFX هم باید بگم ، چون هسته پردازش با Solver این پلاگین ها با هسته پردازش بخش های داینامیک مایا یکی نیست و به صورت جدا نوشته شده ، بنابراین این دو سیستم یکدیگر رو نمیشناسند و نمیتوانند با هم تعامل داشته باشند ، اگرچه میشود کلک زد ، مثلا حرکت Fume را به Particle داد و Particle را با nCloth برای Collision استفاده بکنیم ، ولی به هر حال به صورت مستقیم نمیشه. اگر بدانید ، تفاوت سیستم nDynamic و Dynamic در Maya همین است ، Autodesk ابتکار به خرج داد و هسته پردازش سیستم Particle ، Cloth و Rigid را یکی ساخت (Nucleus) ، بنابراین سیستم nParticle و nCloth و nHair و nRigid همدیگر رو میشناسند و با هم تبادل اطلاعات میکنند.
در نرم افزار Houdini هم چون تمام عناصر داینامیک ماهیتا از یکسری Node های یکسان و در یک سیستم داینامیک ساخته شده اند ، همه آنها با هم در تعامل هستند.
2. همانطور که در مقاله هم اشاره کردم ، از SDK برای ساخت پلاگین استفاده میکنند ، پلاگین یعنی اضافه کردن قابلیت اضافی به نرم افزار ، حالا خود Arnold هم در حقیقت یک نرم افزار هست که فقط از طریق پلاگین با مایا در ارتباط است ( هسته این نرم افزار همان فایل ai.dll میباشد) ، شما به کمک SDK میتوانید امکانات زیادی به آرنولد اضافه کنید ، مثلا متریال های جدید برای آن بسازید ، متریال های ALShaders نمونه کامل این قضیه میباشند.
ولی برای ارتباط با بخش های داخلی مایا مثلا کاری کنید که Fume روی پارچه تاثیر بگذارد ، شما اگر به API مربوط به FumeFX دسترسی داشته باشید و از طریفی هم به API مربوط به پارچه در Maya دسترسی داشته باشید ، تا حدی میتونید یکسری قابلیت به آنها اضافه کنید ، ولی اگر واقعا بخواهید مثل سیستم nDyna,mic ، برنامه FumeFX را جزوی از داینامیک مایا بکنید ، باید حتما به سورس کدهای اصلی سیستم nDynamic مایا دسترسی داشته باشید و آن را بازنویسی کنید. اگرچه من با SDK آرنولد کار نکردم ، ولی اگر با آن آشنا باشید ، باید خودتون بتنونید اون محدودیت رندر پارتیکل ها را برطرف کنید.
3. در مورد بخش سوم سولاتتون من نمیدونم دقیقا منظورتون چیه ؟ مثلا در زبان MEL در حلقه for هیچ مشکلی در رابطه با متغیر $i بر نمیخوریم ، شاید شما متغیر را خارج از حلقه تعریف نکردید ، چون در این موضوع زبان MEL مثل زبان C نیست !
انشالا اگر با زبان MEL بیشتر آشنا بشوید و بیشتر تمرین کنید ، دلیل بسیاری از مشکلاتتون رو پیدا میکنید و میبینید که چه قدر راحت هستند.
مثلا در مورد متغیر $Sel که فرمودید ، اگر خودتون پیغام خطا را ترجمه کنید ، میبینید که میگه متغیر $Sel قبلا تعریف شده و ما نمیتوانیم آن را با یک نوع جدید تعریف کنیم.
مثلا شما اگر اول بنویسی string $Sel و بعد این کد رو اجرا کنید ، چون این متغیر از نوع string معمولی تعریف شده ، دیگه نمیتونید بنویسید string $Sel[] ، حتی اگر کد قبلی را پاک کنید .چون این متغیر قبلی تا وقتی که مایا را نبندید ، در Ram سیستم تعریف شده و پاک نمیشه ،
این محدودیت زبان MEL میاشد که در مقاله هم توضیح دادم ، گفتم که در زبان Python شما هر وقت که اراده کنید ، میتونید نوع متغیر ها را تغییر دهید.
امیدوارم که تونسته باشم جواب سوالاتتون را داده باشم
nima
ممنون از پاسختون واقعا کامل و عالی بود.
سپاس گزارم.
شهیر
استاد عزیز سلام امید وارم خوب باشین از مقالات تان بی نهایت استفاده خوبی داشتم .
من یک مشکل در برنامه نویسی دارم یعنی من دارم برنامه نویسی را شروع کردم با سی پلاس پلاس مفاهیم loop , condtional statement … میدانم اما چطور میشه برنامه های به این بزرگی تنها با این دستورات و چند دستور دیگر توسعه داده شود یعنی درک بهتر نداشتم تا حال میشه کمی در باره اش توضیح بدین .
سجاد ربیعی
دوست عزیز اینجا نمیتونم خیلی توضیح بدم ، ولی فکر میکنم اگر به مقالات کامل توجه بکنید ، جواب سوالتون رو پیدا میکنید ، بنده گفتم که برای ساخت نرم افزاری بزرگ مثل Maya یا موتور بازی ، ما نمیتوانیم از اول همه کدها را خودمون بنویسیم ، و شاید هم کسی این کار را نکنه ، اینجاست که از API های مختلف استفاده میکنیم.
یادگیری زبان C اصلا سخت نیست و البته مهم هم نیست ، مهم اینه که شما API های مختلف را بشناسید و برای انجام کار خود بدانید چه طور باید از آنها و توابع و کلاسهای داخل انها استفاده کنید ، مثلا برای ساخت موتور رندر GPU Base ، باید با API های DirectX و یا OpenGL آشنایی داشته باشید.
چیزی که باید یاد بگیرید ، نحوه استفاده از API های مختلف است ، وگرنه همانطور که خودتون فرمودید ، خود زبان C چیزی جز تعریف کردن و کار کردن با متغیرها ، کلاسها و توابع و غیره نیست .(البته همه زبانها همینطور هستند).
بنابراین شاید جمله آخرتون را باید اینطور اصلاح کنم :
برای نوشتن برنامه های بزرگ از این چندتا دستور زبان C استفاده میکنیم تا بتونیم با کتابخانه ها و API های مختلف کار بکنیم.