آموزش MaxScript

GATco

New Member
بکار بردن توابع مثلثاتی در مکس اسکریپت

در این اسکریپت من یک موضوع رو در یک مسیر دایره ای با یک شعاع معین حرکت خواهم داد
و از توابع
sin و cos استفاده میکنم


در اینجا فرض میکنیم شما با توابع مثلثاتی آشنا هستید ,اگر نه پس به کتابهای دبیرستان یه نگاهی بندازید



طبق قوانین مثلثات هر چی زاویه در
cos به صفر نزدیکتر باشد مقدار cos افزایش می یابد و بر عکس
طبق قوانین مثلثات هر چی زاویه در
sin به صفر نزدیکتر باشد مقدار sin کاهش می یابد و بر عکس



طبق این دو قانون اگر یک موضوع که در یک مسیر دایرهای حرکت میکند اگر از مختصات
x کم شود به مختصات y اضافه میشود و بر عکس
پس مینویسیم

کد:
 [/RIGHT]
[SIZE=1][SIZE=2]cur=currenttime[/SIZE]
[SIZE=2]c=(60)[/SIZE]
[SIZE=2]mm=( (currenttime as integer)/160 )[/SIZE]
[SIZE=2]x=c * cos (mm)[/SIZE]
[SIZE=2]y=c * sin (mm)[/SIZE]
[SIZE=2]$.pos=[x,y,0][/SIZE]
[/SIZE][RIGHT]


توضیح توابع
========================
کد:
[SIZE=2]currenttime[/SIZE]

با استفاده ار این تابع میتوان تعیین کرد که​
TimeSlider هم اکنون در چه فریمی قرار دارد


مثال

timeslider​
را در فریم 50 قرار دهید سپس
بنویسید

کد:
 [/RIGHT]
[SIZE=1][SIZE=2]my_current_frame = CurrentTime[/SIZE]
[SIZE=2][/SIZE] 
[/SIZE][SIZE=2][COLOR=#0000ff]50f
[/COLOR][/SIZE][RIGHT]


=========================================

as یک convertor هستش که بعضی از مقادیر خاص را به یک کلاس تبدبل میکند برای درک بهتر به مثال توجه کنید

مثال :
ما یک عدد اعشاری داریم مانند 2.5 مخواهیم اونو به یک عدد صحیح با Integer تبدیل کنیم یعنی عددی بدون اعشار, پس مینویسیم


کد:
[/SIZE]
[SIZE=2][/SIZE] [/RIGHT]
[SIZE=2][SIZE=2]mynum = 2.5 as integer
[/SIZE][COLOR=#0000ff]2
[/COLOR][/SIZE][RIGHT][SIZE=2][/SIZE] 
[SIZE=2]

یا تبدیل اعداد صحیح به اعشاری

کد:
 [/RIGHT]
[SIZE=2]458 as float
[/SIZE][SIZE=2][COLOR=#0000ff]458.0
[/COLOR][/SIZE][SIZE=1][/SIZE][RIGHT]

---------------------
در اسکریپت اصلی ما چون مقدار currenttime یک مقدار زمانی هستش نه یک عدد صحیح پس نیاز به تبدیل داره
فرض کنیم currenttime ما در فریم 1f قرار دارد پس مینویسیم

کد:
[SIZE=2]mytime = currenttime[/SIZE]
[SIZE=2][COLOR=#0000ff]1f
[/COLOR][/SIZE][SIZE=2]my_angle = mytime as integer[/SIZE]
[SIZE=2][COLOR=#0000ff]160
[/COLOR][/SIZE]
اما ما یک مشکل داریم زمانی که فریم 1f رو به حالت عدد صحیح یا integer تبدیل میکنیم

عدد 160 را در جواب داد در حالی که ما انتضار داشتیم مقدار 1f رو به عدد صحیح 1 تبدیل کنه

علت این است که هر فریم به کوچکترین واحد خود تبدیل شده یعنی هر فریم برابر 160tick هستش

کد:
[SIZE=2]1f == 160t
[/SIZE][SIZE=2][COLOR=#0000ff]true
[/COLOR][/SIZE][SIZE=2]2f == 160t * 2[/SIZE]
[SIZE=2][COLOR=#0000ff]true
[/COLOR][/SIZE]

پس اسکریپتو اینجور اصلاع میکنیم

کد:
[SIZE=1][SIZE=2]mytime = currenttime[/SIZE]
[SIZE=2]1f[/SIZE]
[SIZE=2]my_angle = (mytime as integer) / 160[/SIZE]
[/SIZE][SIZE=1][COLOR=#0000ff]1
[/COLOR][/SIZE][SIZE=1][/SIZE]




=============================================

مقدار
c همان شعاع دایره خواهد بود

مقدار
mm همان زاویه ما خواهد بود برای sin , cos

مقدارهای sin و cos مختصات ما در دو بعد x و y خواهند بود
مقدار z را صفر در نظر میگیریم

در آخر سر, موضوع که در حالت انتخاب هستش
position اونو تعیین میکنیم

--------------


برای بکار بردن اسکریپت به اینصورت عمل کنید


*اندازه نوار زمان رو روی 360 فریم تنضیم کنید
time slider رو در فریم صفر قرار داده AutoKey را روشن کنید و اسکریپت را اجراکنید


*سپس
time slider را در هر بار 45 فریم جلو برده و اسکریپت را اجرا کنید

یعنی در فریمهای

کد:
 [/RIGHT]
[SIZE=1][SIZE=2]0 [/SIZE]
[SIZE=2]45[/SIZE]
[SIZE=2]90[/SIZE]
[SIZE=2]135[/SIZE]
[SIZE=2]180[/SIZE]
[SIZE=2]225[/SIZE]
[SIZE=2]270[/SIZE]
[SIZE=2]315[/SIZE]
[SIZE=2]360[/SIZE]
[/SIZE][RIGHT]



باید اسکریپت اجرا شود


*در آخر سر​
play کنید

======================================

 

GATco

New Member
properties

اگر توجه کرده باشید من در بعضی کدها بعد از موضوع یک نقطه قرار میدم و سپس یک کد دیگه
مثل

کد:
[SIZE=2]$sphere01.radius = 5[/SIZE]
[SIZE=2][SIZE=2]$box01.position
 
[/SIZE][/SIZE]


به این کدهای کوچک در مکس اسکریپت Property میگن یا تنظیم کننده


مثال: ما یک کره داریم در یک کره تنظیماتی چون radius تعداد segment ها,slice وغیره داریم به اینها میگن property ی کره ما

ما یک باکس داریم در یک باکس ما تنظیماتی چون طول عرض ارتفاع تعداد segmentهای طول عرض ارتفاع و غیره داریم به اینها میگن property های بکس ما

ما یک موضوع داریم که به editable polygon تبدیل شده ما تنظیماتی چون vertexها polygonها extrode وغیره داریم به اینها میگن propertyهای موضوع من


برای دسترسی به propertyی یک موضوع بعد از آن نقطه یا dot قرار میدهیم سپس property ی موضوع را تایپ میکنیم




property ها یا تنظیم کننده ها اصولا دو تا کار در موضوعات اصلی انجام میدهند

1* با عث تغییر در تنضیمات موضوع میشوند

اگر property ی یک موضوع را بنویسیم سپس مساوی جلوی آن قرار دهیم و مقداری را بعد از مساوی قرار دهیم و اجرا کنیم ما باعث تغییر propertyی آن موضوع شدیم


مثال:

کد:
[SIZE=2]$sphere01.radius = 5
[/SIZE][SIZE=2][COLOR=#0000ff]5
 
[/COLOR][/SIZE][SIZE=2]$box01.width =50[/SIZE]
[SIZE=2][COLOR=#0000ff]50
 
[SIZE=2][COLOR=black]$Camera01.fov = 62
[/COLOR][/SIZE][COLOR=#0000ff]62
[/COLOR] 
[/COLOR][/SIZE]

----------------------

2* باعث اطلاع از مقدار تنظیمها میشوند

اگر property ی یک موضوع را بنویسیم و تغییری در آن ندهیم با اجرای آن فقط information ی از مقدار آن property در آن موضوع به ما میدهد


مثال:

کد:
[SIZE=2]$Teapot01.radius
[/SIZE][SIZE=2][COLOR=#0000ff]14.6962
 
[/COLOR][/SIZE][SIZE=2]$Omni01.castShadows[/SIZE]
[SIZE=2][COLOR=#0000ff]true
 
[/COLOR][/SIZE][SIZE=2]$Cylinder01.capsegs[/SIZE]
[SIZE=2][COLOR=#0000ff]1
[/COLOR][/SIZE]

---------------------------


اصولا propertyها سه دسته اند

propertyهای مختص به یک موضوع
propertyهای سرتاسری یا Global
propertyهای مختص به یک کلاس یا دسته
--------------------

propertyهای مختص به یک موضوع
مثلا موضوعی مانند کره دارای radius یا شعاع هست اما نمیتوان اونو به یک باکس نسبت داد چون باکس دارای طول و عرض هستند و برعکس

propertyهای سرتاسری یا Global
مانند position _rotation_direction_scale و غیره

مثلا بیشتر موضوعات در مکس قابلیت اینو دارن که مختصات اونهار تغییر داد
بیشتر موضوعات در مکس قابلیت چرخش یا rotation دارن

کد:
[SIZE=2][SIZE=2]$sphere01.position=[10,5,0]
[/SIZE][COLOR=#0000ff][10,5,0]
 
[/COLOR]$camera01.position=[0,0,0]
[SIZE=2][COLOR=#0000ff][0,0,0]
[/COLOR][/SIZE][/SIZE]


propertyهای مختص به یک کلاس یا دسته

فرض کنیم ما نمیتوانیم یک دوربین را به یک موضوع editatble poly تبدیل کنیم اما یک موضوع هندسی یا geometry مانند سیلندر بکس کره وغیره قابل تبدیل هستند پس در دوربینها نمیتوان property ی editatble poly
پس این مخصوص geometryها هستند
 

GATco

New Member
properties

بعد از توضیحات قبلی در مورد properties الان مشکل این جاست چطور بفهمیم که یک موضوع دارای چه propertyهای هست و نوع مقدارهایی که این propertyها قبول میکنه چیه

=========================================

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

*integer یا عددهای صحیح مثل 1 _ 2 _3 455_ 800 _10 _0 _1020

*float یا اعشاری مثل 2.5 _ 80.50 _ 13.0 _ 0.0 _ 1.0

*boolean یا درست و نادرست مثل true _false _on _off

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

مثال:

فرضا در propertyهای یک box هر سه این مقدارها مورد استفاده هستند

طول و عرض box مقدارهای Float را میپذیرند مثل 25.0 4.1 10.2
اگر یک مقدار عدد صحیح وارد شود به عنوان عدد اعشاری شناخته میشود

تعداد segmentهای یک box عددهای integer را میپذیرند مثل 5 10 15
ما نمیتوانیم تعداد segmentih ها را 2.5 کنیم اگر این عدد وارد شود به عنوان 2 آن رامیشناسد

روشن و خاموش کرد property ی realWorldMapSize در تنظیمات box توسط مقدارهای boolen یعنی true و false یا on ,off انجام میشود

============================================

برای اینکه بفهمیم در هر موضوع چه نو propertyهایی وجود داره باید از تابع

کد:
[SIZE=2][COLOR=red]showproperties[/COLOR] [COLOR=blue]<Object[/COLOR][COLOR=blue]>[/COLOR]
[/SIZE]


استفاده کنیم. طریقه استفاده در این مثال بیان شده

مثال:

کد:
[SIZE=2]showproperties $box01
 
[/SIZE][SIZE=5][COLOR=#0000ff][SIZE=2].height : float[/SIZE]
[SIZE=2].length : float[/SIZE]
[SIZE=2].lengthsegs : integer[/SIZE]
[SIZE=2].width : float[/SIZE]
[SIZE=2].widthsegs : integer[/SIZE]
[SIZE=2].mapcoords : boolean[/SIZE]
[SIZE=2].heightsegs : integer[/SIZE]
[SIZE=2].realWorldMapSize : boolean[/SIZE]
[SIZE=2]false[/SIZE]
[/COLOR][/SIZE]


================================
جواب این تابع همیشه از دو بخش تشکیل شده است

کد:
[SIZE=3][COLOR=#0000ff].[COLOR=darkgreen]height[/COLOR] : [COLOR=sienna]float[/COLOR]
[/COLOR][/SIZE]

*اسم propertyهایی که در این موضوع قابل استفاده است

*مقداری که هر property میتواند آن را بپذیرد مثل integer,float,boolean,.....

 

GATco

New Member
دستور FOR دستوری است که یک حالت loop یا حلقه تکرار ایجاد میکند
loop ها عملیات تکراری هستند که به maxscript میگن یک مجموعه فرمان را تکرار و اجرا کن
loop ها کاربردهای زیادی برای کار با گروهای بزرگی از objectها دارند به طوری که فقط با یک گروه از فرمانها میتوان تغییرات خود را در تعداد زیادی از موضوعات ایجاد کرد

برای مثال :

شما میخواهید 50 box بسازید میتوانید کد مربوط به ساخت box را توسط دستور for پنجاه مرتبه تکرار کنید
این کار خیلی سریعتر نسبت به اینکه کد را پنجاه بار تایپ کنید

همچنین یکی دیگر از کاربردهای loop ها تغییر در properties ها موضوعات مختلف هست

چند نوع loop داریم اینجا یکی از پراستفاده ترین آنها را بیان میکنیم

صورت کلی فرمول

کد:
[/SIZE]
[SIZE=2][/SIZE] 
[/FONT][FONT=Times New Roman][COLOR=#ff0000][SIZE=2]for[/SIZE][/COLOR][/FONT][SIZE=2][FONT=Times New Roman] [/FONT][FONT=Times New Roman][COLOR=#0000ff]<var_name>[/COLOR][/FONT][FONT=Times New Roman] [/FONT][FONT=Times New Roman][COLOR=#ff0000]=[/COLOR][/FONT][FONT=Times New Roman] [/FONT][FONT=Times New Roman][COLOR=#0000ff]<sequence>[/COLOR][/FONT][FONT=Times New Roman] [/FONT][FONT=Times New Roman][COLOR=#ff0000]do[/COLOR][/FONT][FONT=Times New Roman] [/FONT][FONT=Times New Roman][COLOR=#ff0000]([/COLOR][/FONT][FONT=Times New Roman] [/FONT][FONT=Times New Roman][COLOR=#0000ff]<expr>[/COLOR][/FONT][FONT=Times New Roman] [/FONT][FONT=Times New Roman][COLOR=#ff0000])[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Times New Roman][COLOR=#ff0000] 
[/COLOR][/FONT][/SIZE][FONT=Times New Roman][SIZE=2]

مثال :
با اجرای این کد پنجاه جعبه ساخته خواهد شد
که دارای position های random هستند

کد:
[/SIZE]
[SIZE=2][/SIZE] 
[/FONT][FONT=Times New Roman][COLOR=#0000ff][SIZE=2]for[/SIZE][/COLOR][/FONT][SIZE=2][FONT=Times New Roman] Forgotten = 1 [/FONT][FONT=Times New Roman][COLOR=#0000ff]to[/COLOR][/FONT][FONT=Times New Roman] 50 [/FONT][FONT=Times New Roman][COLOR=#0000ff]do
[/COLOR][/FONT][/SIZE][FONT=Times New Roman][SIZE=2]( mybox = box()[/SIZE]
[SIZE=2]my_random_pos = random [-40,-40,-50] [20,50,30][/SIZE]
[SIZE=2]mybox.pos = my_random_pos[/SIZE]
[SIZE=2])[/SIZE]
[SIZE=2][/SIZE] 
[/FONT][FONT=Times New Roman][SIZE=2]

این کدرو در یک newscript کپی کنید سپس از منوی فایل گزینه evaluate all را بزنید

اگر قصد انیمیشن کردن این boxهارو دارید قبل از اجرای اسکریپت auto key را روشن روی فریم 20 قرار دهید سپس اسکریپت را اجرا کنید در آخر سر play کنید
....................................

[FONT=Arial (Arabic)]
[/FONT]
 

GATco

New Member
حتما با اصطلاح Variables یا متغیرها در زبانهای برنامه نویسی آشنا هستید
Variables یا متغیرها یک ویژگی مشترک دارند که به نام Scope معروف است
scope یا هدف یا دامنه ویژگی ای هست که یک حافظه کوچک در 3dsmax ایجاد میکند که مقادیر در آن حافظه ذخیره میشوند

در کل variable یا متغیرها حافظه هایی هستند که مقدارهای مارو در خود نگاه می دارن
اما چرا ما به متغیرها , متغییر میگوییم ,این یکی از ویژگی هاش هستش یعنی مقدارهای داخل آن میتوانند هر لحظه که ما بخواهیم تغییر کنند

مانند

کد:
[SIZE=2][COLOR=red]a[/COLOR] = 10
[/SIZE][SIZE=2][COLOR=#0000ff]10
 
[/COLOR][/SIZE][SIZE=2]mynum = 100* 2[/SIZE]
[SIZE=2][COLOR=#0000ff]200
 
[/COLOR][/SIZE][SIZE=2]for [COLOR=red]forgotten[/COLOR] = [COLOR=black]1 to 50 do[/COLOR]()[/SIZE]
[SIZE=2][COLOR=#0000ff]OK
 
[/COLOR][/SIZE][SIZE=2]if [COLOR=red]mybox[/COLOR].with>50 then.......[/SIZE]
[SIZE=2][COLOR=blue]OK[/COLOR][/SIZE]
[SIZE=2][COLOR=#0000ff][/COLOR][/SIZE] 
[SIZE=2][COLOR=red]mybox [/COLOR]= box()[/SIZE]
[SIZE=2][COLOR=#0000ff]$Box:Box01 @ [0.000000,0.000000,0.000000]
[/COLOR][/SIZE]

مقدار 10 در a ذخیره شده
یا
مقدار های ساخت یک باکس در متغیر mybox ذخیره شده

.................
بعد از این مقدمات بر گردیم به loops یا حلقه های تکرار

این صورت کلی که یادتون هست

کد:
[SIZE=2][COLOR=#ff0000]for[/COLOR] [COLOR=blue]<var_name>[/COLOR] [COLOR=red]=[/COLOR]  [COLOR=blue]<sequence>[/COLOR]  [COLOR=red]do[/COLOR] [COLOR=red]([/COLOR] [COLOR=blue]<expr[/COLOR][COLOR=blue]>[/COLOR] [/SIZE][SIZE=2][COLOR=red])
[/COLOR][/SIZE]

قسمت var_name همون متغیر ماست یکی از ویژگیهای loops اینه که متغیر لحظه به لحظه تغییر میکنه
در فرمول بالا مقدار متغیر یک مقدار عددی هستش

به مثال زیر توجه کنید


کد:
[SIZE=5][COLOR=#0000ff][SIZE=2]for[/SIZE][/COLOR][/SIZE][SIZE=2] mytavan = 1 [COLOR=#0000ff]to[/COLOR] 5 [COLOR=#0000ff]do[/COLOR] [/SIZE]
[SIZE=2]( [/SIZE]
[SIZE=2]2 ^ mytavan[/SIZE]
[SIZE=2])[/SIZE]


در این مثال متغیر mytavan به این صورت تغییر میکند که >
اگر loop ما یک بار تکرارشود متغیر mytvan برار 1 خواهد شد
اگر loop ما برای بار دوم تکرار شود متغیر mytavan برابر 2 خواهد شد
اگر loop ما برای بار سوم تکرار شود متغیر mytavan برابر 3 خواهد شد
و به همین صورت بر اساس مقدار تکرارloop , متغیر آن مقدار را لحظه به لحظه میپذیرد

پس متغیر mytavan به صورت افزایشی مقدارهای 1 تا 5 را میپذیرد
پس نتیجه میگیریم عدد دو در تکرار اول به توان 1 میرسد
در تکرار بار دوم loop عدد دو به توان 2 میرسد و به همین صورت تا توان 5

کد:
[SIZE=5][SIZE=2]2^1[/SIZE]
[SIZE=2]2^2[/SIZE]
[SIZE=2]2^3[/SIZE]
[SIZE=2]2^4[/SIZE]
[SIZE=2]2^5[/SIZE]
[/SIZE]

با استفاده از این ویژگی میتوان چنین مثالی زد

کد:
[SIZE=2]mybox = box()
[/SIZE][SIZE=2][COLOR=#008000]------------
[/COLOR][/SIZE][COLOR=#0000ff][SIZE=2]for[/SIZE][/COLOR][SIZE=2] mytavan = 1 [COLOR=#0000ff]to[/COLOR] 5 [COLOR=#0000ff]do[/COLOR] [/SIZE]
[SIZE=2]( t_m = mytavan *10[/SIZE]
[SIZE=2] [/SIZE]
[SIZE=2] [/SIZE]
[COLOR=#0000ff][SIZE=2]animate[/SIZE][/COLOR][SIZE=2] [COLOR=#0000ff]on[/COLOR] [/SIZE]
[SIZE=2]( [COLOR=#0000ff]at[/COLOR] time (t_M) (rotate mybox 45 z_axis)[/SIZE]
[SIZE=2])[/SIZE]
[SIZE=2] [/SIZE]
[SIZE=2])[/SIZE]

حالا play را بزنید تا نتیجه کار را بعد از اجرای این script ببنید
ما در این اسکریپت box خود را در فریمهای

10
20
30
40
50

چرخاندیم هر بار 45 درجه

----------------------------------------------------
 

aloke

Member
سلام
چرا ادامه ندادید
بعدشم یک سوال داشتم و اونم اینکه آیا max script می تونه با XML کار کنه ؟؟
 

جدیدترین ارسال ها

بالا