قانونهای محاسباتی maxscript
میخام بعضی از قوانین یادگیری maxscript رو بگم ,البته برای اونایی که جدی میخان دنبال کنند.
.. یادگیری کتابهای ریاضی راهنمایی و دبیرستان
.. در عین حال بکار گیری اونا در maxscript
.. وتر مثلث به چه درد میخوره؟ خیلی خیلی مهمه برای maxscript فکرشو نمیکردید نه؟
.. مختصات xy...حتما توی کتابهای ریاضی مدرسه یه نگاهی بهش بندازید وگرنه تو maxscript کم میارید
.. هر چیزی تو maxscript یاد میگیرید حتما روی کاغذ اونو برای خود توضیح دهید
-------------------------------
قبل از شروع جدی maxscript باید بعضی از قانونهای محاسباتی maxscript را توضیح بدم.
maxscript برای محاسبه یک معادله اتکا زیادی به پرانتزها داره ( maxscript) , پس باید در استفاده از پرانتزها
وحتی در استفاده نکردن از آنها کاملا مسلط باشید. خیلی خیلی مهم "به کتابهای درسی ریاضی مراجعه شود"
MS مثل یک ماشین حساب میمونه
پرانتزها مثل یک مرز محاسباتی میمونند
اگر در یک محاسبه پرانتزی یا مرزی مشخص نکرده باشیم به این صورت محاسبه میشود
... ابتدا توان محاسبه میشود ^
... سپس تقسیم محاسبه میشود /
... سپس ضرب محاسبه میشود *
... سپس جمع و تفریق محاسبه میشود + - "که در این مورد آخر ترتیب محاسباتی لازم نیست"
همچنین اگر هر کدام از این عملگراها نباشد دیگری برای محاسبه مقدم خواهد شد , یعنی مثلا در یک محاسبه توان نباشد پس تقسیم مقدمتر است .
کد:
2.0 ^ 5.0 - 6.0 * 4.0 + 7.0 / 8.0
ابتدا 2 به توان 5محاسبه مشود
سپس 7 تقسیم بر 8محاسبه میشود
سپس6ضرب در 4 محاسبه میشود
در آخر سر جمع وتفریق میکنیم
جواب
8.875
:20:
قانونهای محاسباتی maxscript
فرض کنیم می خواهیم در یک معادله ابتدا جمع انجام گیرد سپس ضرب وبعد بقیه معادله , در اینجاست که از پرانتزها استفاده میکنیم, یعنی یک مرز محاسباتی تعیین میکنیم.
مثال:
کد:
2 ^ ( (5+6) * 2 )
4194304
توضیحات بیشتر در مورد این مثال :
کد:
5+6=11
2*11=22
2^22=
4194304
بعضی از شرایط خواندن کدها در MaxScript
خواندن کدها در MS دارای شرایطی است , که دانستن این مطلب بسیار مهم است
... Ms شروع بخواندن کد از خط اول می کند و هر حرف را می خواند تا خط تمام شود
سپس بررسی میکند آیا این خط دارای یک عبارت منطقی بوده تا جواب آن را بدهد
... اگر MS عبارتهای منطقی خود را در آن خط پیدا نکند (به هر دلیلی) به خطهای بعدی خواهد رفت. (در بعضی شرایط خطهای قبلی را نیزخواهد خواند) تا عبارت منطقی خود را پیدا کند تا جواب مناسب را بدهد, جواب درست یا error
... این شرایط برای خطهای بعدی نیز تکرار خواهد شد
... MS دارای سرعت فوق العاده بالایی در خواندن کدها میباشد
برای مثال: شما می خواهیدیک فضای بزرگ از ستارگان درخشان بسازید و نیاز به 4000 کره دارید با سایزهای گوناگون و قرار گرفتن آنها در مکانهای تصادفی,تاحالا فکر کردید به صورت دستی چقدر طول میکشه؟؟؟
اما این کار برای MS فقط چند لحظه است
برای درک بیشتر مطالب, بعضی توضیحات را با مثال می گم
مثال1
MS ابتدا متغیر a را برابر 10 قرار میدهد( پس خواندن خط اول تمام شد) جواب خط اول 10 است
سپس a را که همان مقدار 10 است در 5 ضرب کرده (پس خواندن خط دوم تمام شد) جواب خط دوم 50 است
10
50
مثال2
MS ابتدا میخواهد b را در 2 ضرب کند مشکل اینجاست ک حرف b برای MS بی معنی است و عدد 2 در یک حرف مجهول قابل ضرب نیست( پس خواندن خط اول تمام شد) جواب خط اول یک خطا است -- No ""*"" function for undefine
متغیر b را برابر 15 قرار میدهد (پس خواندن خط دوم تمام شد) جواب خط دوم 15 است
بیایید مثال دوم را برای بار دوم اجرا کنیم , چه اتفاقی می افته ؟
کد بدون مشکل برای بار دوم اجرا خواهد شد, چرا؟؟
جواب خط اول 30
جواب خط دوم 15
ok
علت این است که زمانی که کد را برای بار اول اجرا کردیم خط اول با خطا مواجه شد اما در خط دوم مقدار b تعیین شد, این مقدار تا زمانی که برنامه 3dsmax فعال باشد در حافظه موقت ذخیره خواهد شد
زمانی که همین کد را برای بار دوم اجرا میکنیم چون مقدار b قبلا در اجرای بار اول تعیین شده در خط اول قرار خواهد گرفت و 15 در 2 ضرب میشود و جواب خط اول 30 است
------------------------------------------
پس می بینیم که هر کد باید در مکان مناسب خودش بکار برده شود تا نتیجه ای که میخواهیم را بما بدهد
برای آشنایی با سرعت وقدرت MS این کد را اجراکنید
از منوی maxscript گزینه newscript را انتخاب کنید,
کد را در پنجره باز شده کپی کنید
از منوی فایل پنجره بازشده evaluate all را بزنید
سپس در آخر سر play کنید
کد:
for i = 1 to 500 do
(
s=sphere()
s.radius=random 5 14
s.segs = 16
s.pos=random [-400,-400,0] [400,400,0]
s.slice = on
s.sliceFrom =random 246 340
s.dir=random [50,0,70] [400,200,170]
animate on (
at time 0 s.pos.z=0
at time 30 s.pos.z = random 10 100
)
)
:5:
Randomize کردن دو عملیات مختلف
حتما با مفهوم random آشنا هستید ,یعنی به صورت تصادفی یا شانسی از بین یک مجموعه یک چیزی را انتخاب کردن.
در maxscript تابعی وجود داره به نام random که با استفاده از اون میشه دو عدد مختلف یا دو position مختلف را
randomize کرد.
مثال:
کد:
ran = Random 1.0 100.0
29.8743
ran = random 1 100
87
-------
ran_pos = random [0,0,0] [10,15,30]
[9.32051,1.01729,7.23876]
ran_pos = random [0,0,0] [10,15,30]
[7.23408,2.26196,13.4034]
اما من اینجا مخوام دو عمل مختلف را randomize کنم نه دو عدد یا دو position را
فرض کنیم یک موضوع داریم و مخواهیم از بین rotation و position هر بار به صورت تصادفی یک حالت را انتخاب کنه
پس مینویسیم
کد:
ran = random 0 1
--------------
if ( ran == 1 )
then ( move $ [10,12,15] )
else ( if ( ran == 0 ) do ( rotate $ 40.23 z_axis) )
*در قسمت اول اسکریپت>
اعداد صفر و یک را randomize کردیم
*در قسمت بعدی اسکریپت شروطی تعیین کردیم>
که اگر مقدار ran یک شد , جسم یا اجسامی که در حالت انتخاب باشند پوزیشن آنهارا تغییر دهد
اگر مقدار ran صفر شد جسم یا اجسامی که در حالت انتخاب باشند, بچرخند
*فرمول مربوط به حرکت دادن یک موضوع در مکس اسکریپت
کد:
move
name_obj [<x,y,z>]
حرکت موضوع به مقدار داده شده در محورهای مورد نظر
کد:
move $box01 [10,0,0]
OK
در این مثال ما
box را در محور x به مقدار 10 واحد حرکت دادیم
اگر این مثال را 20 بار دیگر اجرا کنیم با این کار box ما 200 واحد حرکت خواهد کرد هر بار 10 واحد
*چرخش موضوع به واحد درجه در محورهای تعیین شده
کد:
rotate
<object> (eulerangles x y z)
کد:
rotate $box01 (eulerangles 10 0 50)
با استفاده از این تابع موضوع را در واحدهای درجه به مقدار لازم در محورهای مور نظر میچرخانیم
کلمه کلیدی eulerangles باید قبل از محورها وارد شود تا چرخش به میزان درجه محاسبه شود
اگر این مثال را فرضا 10 با اجرا کنیم box ما در محور x صد درجه خواهد چرخید و در محور z پانصد درجه
*علامت $ یعنی>
هر موضوع یا موضوعاتی که در حالت انتخاب باشند
=====
=====
حالا auto key را روشن کنید هر بار timeSlider را 20 فریم حرکت دهید و همچنین اسکریپت را اجرا کنید
>>>>>>>>>>>>>>>
تمرین:
با راندوم کردن مقدارهای move و rotation در مثال
کد:
ran = random 0 1
--------------
if ( ran == 1 )
then ( move $ [10,12,15] )
else ( if ( ran == 0 ) do ( rotate $ 40.23 z_axis) )
آن را پیشرفته تر کنید
در همین تاپیک اونو قرار دهید
:31:
Randomize کردن دو عملیات مختلف _نکته
فقط یک توضیحو فراموش کردم در مورد کد
کد:
( rotate $ 40.23 z_axis)
این شکل دیگری از فرمول چرخش هستش که به صورت تک محوری عمل میکنه
صورت کلی به این صورت هستش
کد:
rotate <object> <angle> x_axis
rotate <object> <angle> y_axis
rotate <object> <angle> z_axis
محاسبه به درجه خواهد بود
بکار بردن توابع مثلثاتی در مکس اسکریپت
در این اسکریپت من یک موضوع رو در یک مسیر دایره ای با یک شعاع معین حرکت خواهم داد
و از توابع sin و cos استفاده میکنم
در اینجا فرض میکنیم شما با توابع مثلثاتی آشنا هستید ,اگر نه پس به کتابهای دبیرستان یه نگاهی بندازید
طبق قوانین مثلثات هر چی زاویه در cos به صفر نزدیکتر باشد مقدار cos افزایش می یابد و بر عکس
طبق قوانین مثلثات هر چی زاویه درsin به صفر نزدیکتر باشد مقدار sin کاهش می یابد و بر عکس
طبق این دو قانون اگر یک موضوع که در یک مسیر دایرهای حرکت میکند اگر از مختصات x کم شود به مختصات y اضافه میشود و بر عکس
پس مینویسیم
کد:
cur=currenttime
c=(60)
mm=( (currenttime as integer)/160 )
x=c * cos (mm)
y=c * sin (mm)
$.pos=[x,y,0]
توضیح توابع
========================
با استفاده ار این تابع میتوان تعیین کرد که
TimeSlider هم اکنون در چه فریمی قرار دارد
مثال
timeslider
را در فریم 50 قرار دهید سپس
بنویسید
کد:
my_current_frame = CurrentTime
50f
=========================================
as یک convertor هستش که بعضی از مقادیر خاص را به یک کلاس تبدبل میکند برای درک بهتر به مثال توجه کنید
مثال :
ما یک عدد اعشاری داریم مانند 2.5 مخواهیم اونو به یک عدد صحیح با Integer تبدیل کنیم یعنی عددی بدون اعشار, پس مینویسیم
کد:
mynum = 2.5 as integer
2
یا تبدیل اعداد صحیح به اعشاری
---------------------
در اسکریپت اصلی ما چون مقدار currenttime یک مقدار زمانی هستش نه یک عدد صحیح پس نیاز به تبدیل داره
فرض کنیم currenttime ما در فریم 1f قرار دارد پس مینویسیم
کد:
mytime = currenttime
1f
my_angle = mytime as integer
160
اما ما یک مشکل داریم زمانی که فریم 1f رو به حالت عدد صحیح یا integer تبدیل میکنیم
عدد 160 را در جواب داد در حالی که ما انتضار داشتیم مقدار 1f رو به عدد صحیح 1 تبدیل کنه
علت این است که هر فریم به کوچکترین واحد خود تبدیل شده یعنی هر فریم برابر 160tick هستش
کد:
1f == 160t
true
2f == 160t * 2
true
پس اسکریپتو اینجور اصلاع میکنیم
کد:
mytime = currenttime
1f
my_angle = (mytime as integer) / 160
1
=============================================
مقدار c همان شعاع دایره خواهد بود
مقدار mm همان زاویه ما خواهد بود برای sin , cos
مقدارهای sin و cos مختصات ما در دو بعد x و y خواهند بود
مقدار z را صفر در نظر میگیریم
در آخر سر, موضوع که در حالت انتخاب هستش position اونو تعیین میکنیم
--------------
برای بکار بردن اسکریپت به اینصورت عمل کنید
*اندازه نوار زمان رو روی 360 فریم تنضیم کنید
time slider رو در فریم صفر قرار داده AutoKey را روشن کنید و اسکریپت را اجراکنید
*سپس time slider را در هر بار 45 فریم جلو برده و اسکریپت را اجرا کنید
یعنی در فریمهای
کد:
0
45
90
135
180
225
270
315
360
باید اسکریپت اجرا شود
*در آخر سر
play کنید
======================================
حرکت دادن یک جسم توسط دو جسم دیگر
خوب شاید برای خیلی سوال باشه چجور میشه حرکت یک جسم رو به دو موضوع متصل کنیم
راهای مختلفی وجود داره من آسونترینشونو آموزش میدم که سریع کارتونو راه میندازه
خوب ما برای این کار باید به باکس اول دو محور حرکتی z تنظیم میکنیم
1: سه تا باکس بسازید (باکس اول با حرکت هر یک یا هردو باکس دیگه واکنش خواهد داد) , (حرکتو به محور z محدود میکنیم)
2: باکس یک رو انتخاب کنید واز پنل Motion در کرکره Assign Controller حالت position:position_xyz رو انتخاب کنید
سپس بر روی علامت سوال کوچک در همین کرکره کلیک کرده و از پنجره باز شده Position list را انتخاب کرده ok کنید
حالت position:position_xyz به position:position List تغییر میکنه
سپس بر روی علامت مثبت کوچک کنار position:position List کلیک کرده تا باز شود و Available ا در حالت انتخاب در بیارید
دوباره بر روی علامت سوال کوچک در همین کرکره کلیک کرده و از پنجره باز شده position_xyz ا انتخاب کرده ok کنید
تا اینجا ما دو position_xyz به box01 تنظیم کردیم برای دیدنشون کرکره position:position List رو باز کنید
که اولی رو به box02 و دومین position_xyz رو به box03 متصل میکنیم
3: اتصال دو محور Z باکس اول به باکس دو و سه
خوب برای اینکار box01 رو در حالت انتخاب قرار دهید از منوی Animation گزینه Wire Parameter>Wire parameters رو انتخاب کرده
در این حالت یک پنچره کوچک نمایان میشه که ابتدا روی Transform سپس Position در اینجا دوتا position_xyz می بینیم که اولی را
انتخاب میکنیم که در آخر سر zPosition را انتخاب میکنیم با این کار یک خط کوچک نمایان میشه که باید اونو بر روی box02 کشیده و
انتخاب کنید بعد از این کار دو باره یک پنجره سفید رنگ ظاهر میشه که مربوط به box02 است که به ترتیب Transform>Position>ZPosition را انتخاب میکنیم
با انجام اعمال مرحله 3 پنجره Parameter Wiring #1 ظاهر میشه که دارای دو بخش اصلی هست
حالا باید دقت کنید که اگر اسم box01 در بالای پنجره در بخش چپ قرار دارد فلشی که جهت اون به سمت چپ است انتخاب کنید
گر اسم box01 در بالای پنجره در بخش راست قرار دارد فلشی که جهت اون به سمت راست است انتخاب کنید
بعد از انتخاب فلش بر روی Connect کلیک کنید , با این کار box02 باید box01 رو در محور z کنترل کنه
همه اعمال مرحله سه رو برای box03 هم تکرار کنید با این تفاوت که Position_xyz دومی رو برای box03 انتخاب کنید
بعد از اتمام کار پنجره هارو ببندید و سعی کنبد box02 یا box03 را به صورت مجزا و یا باهم در محور Z حرکت دهیم
میبینید که box01 به حرکت دو باکس دیگر واکنش میده و حرکتشونو دنبال میکنه
ریگینگ یک موتورسیکلت یا هر چیز شبیه اون مثلا دوچرخه
میخام تو چند تا آموزش ریگینگ ساده یک موتور سیکلت به صورت کامل توضیح بدم
--------------------------------------------------------------------------------------------
*ریگینگ داخلی*
1: ساخت ساختار کلی
2: تنظیم HELPERS به ساختار کلی
3:اتصال ساختار کلی به HELPERS
4:لینک و ساخت واکنشهای مربوط به HELPERS
5:کنترل فرمان موتور سیکلت توسط پنجره wireparameters و اسکریپت نویسی
--------------------------------------------------------------------------------------------
*مجبور کردن تایرها به دنبال کردن پستی و بلندیهای زمین *
برای این کار نیاز به اسکریپت نویسی داریم اما من این مرحله از کار رو توضیح نمیدم فقط اسکریپت رو براتو به صورت آماده میزارم تا فقط اجراش کنید شاید در آموزشهای دیگه این اسکریپت رو توضیح بدم چون توضیحات طولانی میخاد
--------------------------------------------------------------------------------------------
*تنظیم موتور سیکلت به یک لاین*
این مرحله از کارو حتما همه میدونن, استفاده از تابع Path constrain برای ساخت مسیر موتور سیکلت
--------------------------------------------------------------------------------------------
*چرخاندن تایرها متعادل با حرکت موتور سیکلت*
این آخرین مرحله این آموزش خواهد بود که با اسکریپت نویسی انجام میدم همچنین آموزش خود اسکریپت
--------------------------------------------------------------------------------------------
به زودی قسمت اول آموزش رو میزارم