آموزش MaxScript

s_mostafa_h

Well-Known Member
:cool:
مثال دیگر :
فرض کنیم چند اشیا در صحنه داریم که بعضی خواصی مانند داشتن " شعاع " یا radius دارند . می خواهیم ،این اشیا را دارای شعاع کمتر از 10 هستند را انتخاب کنیم :
کد:
myvar=for s in geometry where (classof s==sphere or classof s==cylinder or classof s==teapot) and s.radius<10 collect s
[COLOR="Blue"]#($Sphere:Sphere02 @ [138.578674,19.289341,0.000000], $Sphere:Sphere03 @ [91.878174,-76.142136,0.000000], $Sphere:Sphere05 @ [-145.685272,-56.852791,0.000000], $Cylinder:Cylinder03 @ [-49.238579,-15.228426,0.000000], $Cylinder:Cylinder06 @ [-82.741119,-30.456852,0.000000], $Cylinder:Cylinder07 @ [-64.467003,-104.568527,0.000000], $Teapot:Teapot02 @ [61.421318,48.730965,0.000000])[/COLOR]
select myvar
[COLOR="blue"]OK[/COLOR]
myvar.count
[COLOR="blue"]7[/COLOR]

کلیه اشیای نام برده شده ای که دارای شعاعی کمتر از 10 بودند در اینجا لیست شده اند .
کد:
animate on
(
at time 30 (myvar.scale=[15,15,15])
at time 80 (myvar.scale=[2,2,2])
)
[COLOR="blue"][2,2,2][/COLOR]
animate on
(
at time 20 (myvar.pos=[0,0,0])
at time 40 (myvar.pos=[20,20,20])
)
[COLOR="blue"][20,20,20][/COLOR]

دستور hasproperty :

از این دستور برای بررسی اینکه آیا شی مثلا x دارای خاصیت y می باشد :
کد:
hasproperty $box01 "radius"
[COLOR="Blue"]false[/COLOR]

این دستور نشان می دهد که box01 دارای پارامتر یا خاصیت شعاع نمی باشد .
بنابراین دستور بالا را می توانیم به این صورت خلاصه نماییم :
کد:
select(for i in geometry where hasproperty i "radius" and i.radius<10 collect i)
[COLOR="blue"]OK[/COLOR]
این دستور نشان می دهد که اشیایی که دارای شعاع می باشند و شعاع آنها کمتر از 10 می باشد را مشخص کند .
دستور try () ….. catch () :
دستور بالا را می توانیم به این صورت هم بنویسیم :
کد:
select (for i in geometry where try(i.radius<10) catch(false) collect i)
[COLOR="Blue"]OK[/COLOR]

select (for i in geometry where try(i.radius>110) catch(false) collect i)
[COLOR="blue"]OK[/COLOR]

در داخل دستور اول ، ابتدا دستور داخل try اجرا شده در صورت درست بودن کل دستور اجرا می شود و در صورت درست نبودن دستور در داخل catch وارد شده و دستور داخل آن اجرا می شود . در صورتی در داخل دستور catch عبارت false باشد ، هیچ پیامی صادر نمی شود و در صورتی که true باشد ، اشیایی که دارای چنین خاصیتی نباشند ، انتخاب می شوند .
به عبارت خیلی عامیانه تر ، اگر دستور داخل try درست بود ، که هیچ و برنامه از حلقه خارج میشود و کل دستور اجرا می شود ، در غیر این صورت برنامه در داخل catch به تله می افتد .
:D
 

s_mostafa_h

Well-Known Member
راستش بعد از مدتها گفتم سری به این سایت بزنم و یاد آموزش ناتمام مکس اسکریپت افتادم . انشاءا... اگه خدا بخواد ادامه انو از سر می گیریم . چند تا نکته را جا انداختم در مبحث حلقه ها و ... که اونو خواهم نوشت .
 

s_mostafa_h

Well-Known Member
متغییر های سراسری یا جهانی ( global ) و محلی یا (local )

متغییر های سراسری یا جهانی ( global ) به متغییر هایی گفته می شود که در کل برنامه قابل استفاده است و در تمام جای برنامه می توان از آن استفاده نمود ولی متغییر محلی یا (local ) فقط در داخل یک بلوک قابل استفاده هستند .:

کد:
global rad = 10
sphere radius:rad

for i = 1 to 3 do
(
local rad = 10
s = sphere()
s.pos.x = i * 10
s.radius = rad
)
چنانچه متغییر های محلی در خارج از بلوک ( پرانتز ) تعریف شوند با خطای کمپایل مواجهه می شویم :

کد:
local x=10
[COLOR="Blue"]OutPut[/COLOR]
-- Compile error: no local declarations at top level:  x
--  In line: local x=
نکته :
به طور خودکار مکس متغییر های داخل بلاک را محلی و خارج از بلاک را سراسری فرض می کند .

کد:
for i = 1 to 5 do

(

global rad = 10

cyl_height = 25

c = cylinder()

c.radius = rad

c.height = cyl_height

c.pos.x = i * 25
)
s = sphere radius:rad
تعریف توابع شخصی :
مكس در ساخت توابع بسيار قدرتمند عمل مي كند . براي ايجاد تابع از كلمه كليدي function يا fn استفاده مي شود :
کد:
fn subtract x y= 
( 
   x-y 
)
Or
function subtract x y= ( x-y )
() subtract

توجه : هر متغييري كه در بدنه يك تابع ايجاد مي شود ،‌يك متغيير محلي است .
مثال طرز بكار گيري تابع ( در اينجا تابع subtract دو پارامتر مي گيرد ) :

subtract 4 3
output-->1
مثال ديگر : تابع ذيل مشخص مي كند عددي را كه وارد كرديم ،‌با يك پيام مشخص ،‌آيا عدد مثبت يا منفي يا صفر است :

کد:
function sign val:0 =
(
if val == 0
then messagebox ("Equal to 0")
else if val > 0
then messagebox ("Greater than 0")
else messagebox ("Less than 0")
)
در اينجا اگر تنها نام تابع را بصورت sign() وارد كنيم ،‌ پيام ذيل ظاهر مي شود :
کد:
Equel to0
چنانچه تابع را به صورت :
کد:
sign val:-5
وارد نماييم ،‌پيام Less than 0 و در غير اين صورت پيام Greater than 0 ظاهر مي شود .
 

mkf.cgi

Member
آقا مصطفي دستت درد نكنه,كارت درسته.:oops:
يه سوال؟!
نوشتن كدها درparameter wire چقدر با اسكريپت نويسي فرق ميكنه؟
من حركت چرخشي يه شي مثل a رو به حركت عموديb به صورت يه طرفه محدود كردم.ميخواستم اگه b به يه حدي رسيد,از سرعت چرخش a كم بشه.
كد خودم اينه:
 quest.jpg
/ رو براي اين نوشتم كه سرعت چرخش رو كم كنه.البته اين كارو ميكنه ولي يه پرش به مختصات قبلي خودش و از اونجا سرعتش كم ميشه.:-?
 

s_mostafa_h

Well-Known Member
با سلام ، فکر می کنم ، قدری از مسیر اصلی خارج خواهیم شد ، چون قصدم این بودم این مبحث به طور کامل ( البته اگه توفیقی حاصل بشه ) تموم کنم . مبحث اسکریپت نویسی مبحث مفصل ، جالب و جذابی می باشد ، کد نویسی در لیست باکس wireparameter در واقع یک نوع اسکریپت نویسی در مکس می باشد و فرقی با اسکریپت نویسی در بخش اسکریپت ندارد . در مورد سئوالت هم بگم فایل رو زیپ کن ، برای من ( این قسمت ) ارسال کن . و همین جا پاسخ رو قرار می دم تا برای دیگران هم قابل استفاده باشه .
---------------------------------------------------------------------------------------------------
و اما ادامه مبحث :
تابع ذيل را در نظر بگيريد :
کد:
function mycube side position:[0, 0, 0] =
(
box length:side width:side height:side pos:position
)
تابع mycube() دو آرگومان مي گيرد ،‌ يكي مربوط به پارامتر هاي طول و عرض و ارتفاع ( side ) كه همه يكي است ،‌ و ديگري مربوط به موقعيت مكاني كه داراي سه پارامتر x , y , z مي باشد . البته position اختياري است :
می تونیم بنویسیم :
mycube 40

یا برای بخش position می توینم بنویسیم :
کد:
Mycube 70 position: [20, 20, 50]
 

s_mostafa_h

Well-Known Member
ساختار ها : -- struct --
با بکار گیری ساختار " struct " می توانیم توابع ای سفارشی با مقادیر ترکیبی ایجاد نمائیم .
تعریف کلی یک " struct " عبارت است از :
کد:
struct <struct_name> ( <member> , <member> )>
که هر عضو می تواند به صورت های ذیل باشد :
نام و یک بخش اختیاری که دارای مقدار باشد – نام

مثال :
یک struct به نام person ایجاد می کنیم :
کد:
struct person (name, height, age, sex)
در اینجا person یک ساختار ( strcut ) و name , height , age , sex اعضای یک ساختار هستند:
Bill = person name:"Bill" height :172 age :34 sex:#male
در اینجا ساختار یک شخص در متغییر Bill ذخیره می شود :
اعضای این ساختار ، یعنی name به صورت رشته ، age & height به صورت عددی صحیح و جنسیت به #male مقدار دهی شده اند .
ساختار دیگری را تعریف می کنیم :
کد:
joe = person name:"joseph" sex:#male
در اینجا ساختار دیگری از person تعریف شده است . با اینحال مقدار age & height مقدار دهی نشده اند . به این دلیل مقدار پیش فرض این مقادیر برابر با undefined می باشد .
کد:
struct person (name, height, age, sex)
-->
#Struct:person(
  height:<data>,
  name:<data>,
  age:<data>,
  sex:<data>)
----------------
joe = person name:"joseph" sex:#male
joe.name
joe.age
joe.height
joe.sex
-->
(person name:"joseph" height:undefined age:undefined sex:#male)
"joseph"
undefined
undefined
#male
ساختارها بیشتر در آرایه ها کاربرد دارند و برای دسترسی به اعضای آرایه ها ( ایندکس ) راحتر می توان با ساختار ها کار کرد .
دستورات مکس اسکریپت :
در مدل سازی و انیمیشن گاهی لازم است با استفاده از دستورات مکس اسکریپت منو ها و ابزار هایی را احضار کنیم . کلمه کلیدی در اینجا " max" می باشد :
کد:
max file open
max quick render
max tool zoomextents all
max hide selection
max unhide all
نکته بسیار مهم :
با بکار گیری کلمه کلیدی max ، و استفاده از "؟" می به بخش هایی از یک یک دستور دستری پیدا کرد :
کد:
max time ? – همه دستوراتی که مر بوط به زمان است را نشان می دهد 
max sel ? -- shows all the commands with ?sel? in them as a substring
max ? -- shows all the commands (there are a lot)

مثال :
کد:
max time ?
output
  time back
  time config
  time end
  time forward
  time play
  time start
OK
max time config
-->
پنجره مر بوط به پیکر بندی زمان را نشان داده می شود .
دستورات مکس همیشه ( در صورت درست بودن ) مقدار ok را بر می گرداند .
تعداد دستوراتی که با کلمه کلیدی max آغاز می شود ، برابر "254 " دستور می باشد .
برای دسترسی به این دستورات کافی است تایپ نماییم : max ? و تمام دستوراتی که با کلمه کلیدی max شروع می شود ، لیست می شوند .
 

s_mostafa_h

Well-Known Member
ذخيره دستورات مكس اسكريپت :
براي ذخيره دستورات مكس اسكريپت ،‌ كافي است از منوي maxscript > new script انتخاب و دستورات را در اين پنجره وارد نمائيم . از منوي file> save فايل را با پسوند .ms = Max Scrpit ذخيره نمائيم .
براي اجراي مجدد اين دستورات كافي است فايل مورد نظر را در مسيري كه قبلا ذخيره نموديم از طريق منوي maxscript>open scrpit … و يا از پنل Utility > MaxScript و سپس بعد از باز شدن كشوي MaxScript دكمه open Scrpit را اجرا كرده و فايل مورد نظر را براي باز كردن انتخاب مي كنيم .
براي اجراي دستورات maxscrpit روش هاي مختلفي وجود دارد . يكي از روش هاي ساده آن اينست كه بعد از باز كردن اسكريپت مورد نظر ،‌از منوي File>Evaluate All يا از طريق Ctrl+E اسكريپت مورد نظر را اجرا مي كنيم .
روش اجراي خط به خط دستورات مكس اسكريپت هم به اين صورت است كه خط يا خطوط مورد نظر را دراگ كرده ،‌و كليد Shift+Enter فشار دهيم .
شامل كردن چند اسكريپت در يك اسكريپت :
فرض كنيم اسكريپتي داريم كه يك جعبه ايجاد مي كند و اسم اون هم هست mybox.ms و ديگري هم يك كره ايجاد مي كند و اسم اون اسكريپت هم mySphere.ms هست . اين اسكريپت ها را ( كه در يك مسير ذخيره شده باشند ) مي توانيم در يك اسكريپت مثلا به اسم MyAllScrpit.ms ذخيره نمائيم .
براي فايل mybox.ms اين دستور را داريم :
کد:
-- for mybox.ms we have :
mybox = box length:20 width:20 height:20
براي فايل mySphere.ms اين دستور را داريم :

کد:
-- for mySphere.ms we have :
mySphere=sphere()
فايل MyAllScrpit.ms هم مي تواند شامل هر دو باشد :
کد:
include  "mySphere.ms"
include  "mybox.ms"
با اجراي هر خط از اين كدها ،‌پنجر MaxScrpit Listener باز شده و دستور اسكرپپت مورد نظر را در اين پنجره كپي يا باز مي كند .
توجه :
چنانچه اسكريپت مورد نظر در مسير فايل نباشد ،‌با خطاي كامپايل زمان اجرا مواجهه مي شويم ،‌مبني بر اينكه include نمي تواند فايل مورد نظر را باز كند :
کد:
-- Runtime error: Include cannot open: myBox.ms
نكته كليدي :
كليد Enter مربوط به قسمت اعداد ( Number ) در حكم اجراي يك خط از دستوري است كه كرسر موس در آن قرار دارد . بنابراين چنانچه در هر قسمت از خط كه هستيد ،‌با آوردن كرسر به ابتداي خط ( يا با استفاده از كليد Home ) و با زدن كليد Enter ،‌آن خط از دستور اجرا مي شود .
 
آخرین ویرایش:

s_mostafa_h

Well-Known Member
یادگیری مکس اسکریپت با استفاده از Macro Recorder
شاید بهترین ابزار مکس اسکریپت ، استفاده از ماکروی مکس اسکریپت می باشد . این ماکرو اعمال مربوط به کاربر را در بالای پنجره ی MAXScript Listener ( قسمت قهوه ای رنگ ) ثبت می کند . البته نه همه کار های مربوط به کاربر ، ولی به طور کلی بیشتر دکمه های مربوط به نوار ابزار ، جعبه ابزار و toolbars, Status Bar, Create panel, and Modify panel و ... توسط Macro Recorder ثبت می شود . اما عموما پنجره های ثانوی حاصل از ظاهر شدن یک پنجره یا تغییرات در پنجره اولیه مثلا پنجره "Properties " خاصیت یک شی ، توسط Macro Recorder ثبت نمی شود . با این حال این ماکرو در مکس بسیار بسیار مفید به نظر می رسد . جهت یاد آوری ، عرض کنم برای فعال کردن Macro Recorder ، به منوی MaxScript رفته و Macro Recorder را تیک بزنید .
مثال :
کد:
max move
max tti   -- tti is equal = move Transform Type-In
max select

چه زمانی از if ………… then و چه زمانی از if ……… do استفاده کنیم :
هر گاه انتظار این را داشته باشیم با بکار گیری جمله شرطی if از جمله else استفاده کنیم ، باید از جمله if ………… then استفاده کنیم ، در غیر این صورت از if ……… do استفاده کنیم :

کد:
if a==0 then print "A is Zero!"
if a==0 do print "A is Zero!"

چه زمانی از () بعد از یک تابع استفاده کنیم :
بعضی توابع هیچ پارامتری را قبول نمی کنند ولی در عوض بعضی توابع حداقل یک یا تعدا بیشتری پارامتر قبول می کنند :
اگر تنها نام تابع را تایپ کنیم ، در حقیقت تابع را صدا نمی زنیم و تنها مکس اسکریپت به ما می گوید که این یک تابع است و نام آنرا تایپ می کند .
مثلا اگر تایپ کنیم : w پاسخ ما یک چیز تعریف نشده است ، ولی اگر تایپ کنیم box ، مکس اسکریپت ، نام Box را برای ما پرینت می کند و به ما می گوید که این متغیر یک " تابع " است .

کد:
-- type in the constructor of a Box without ()
box 
Box 
-- MAXScript tells you the variable box contains the function Box
برای اینکه یک تابعی را صدا بزینم و هیچ آرگومانی ( پارامتری ) را به آن انتقال ندهیم ، کافی است ، نام تابع و سپس علامت پرانتز بسته و باز () یا مقابل آن تایپ نماییم :

کد:
box() 
$Box:Box01 @ [0.000000,0.000000,0.000000]

/CODE][/LEFT]

[COLOR="Blue"][SIZE="3"]فرق بین undefined و unsupplied :[/SIZE][/COLOR]
Undefined زمانی رخ می دهد که برای یک " متغییر " یا یک " آرایه " هنوز هیچ مقداری نسبت نداده ایم :
به عنوان یک آرایه  :
[LEFT][CODE]a = #()
a[4] = "Yeah!"
a
OUTPUT:
#()
"Yeah!"
#(undefined, undefined, undefined, "Yeah!")

به عنوان یک متغییر :
کد:
a
a == undefined
OUTPUT:
undefined
true

unsupplied ، برای توابعی که مقداری را برای آن مشخص نکرده ایم :

کد:
fn test_function thePrameter: =
(
if thePrameter == unsupplied then
(
print "How about providing a parameter?"
false
) 
else
(
print "Thank you for calling the function with a parameter!"
true
)
)
 
test_function()
"How about providing a parameter?"
false
test_function theParameter:123
"Thank you for calling the function with a parameter!"
true
 

GATco

New Member
object to vert linker

امروز می خوام یک اسکریپت ساده اما بسیار پر کاربرد رو آموزش بدم که جدیدا برای یک انیمیشن نوشتم البته برای کسانی که آشنایی قبلی با maxscript دارند
موضوع اون درباره لینک یک آبجکت به یک vertex قبل از شروع میخام بعضی از توابع استفاده شده رو توضیح بدم
converttomesh myobject
این تابع متواند موضوع مورد نظر را به editableMesh تبدیل کنه در قسمت myobject موضوع خود را وارد کنید
مثال:
converttomesh $sphere01
...........................................................................................
getnumverts myOBJ
بعد از تبدیل OBJ به مش با این تابع میتوانیم تعداد vertex های موضوع را شمارش کنیم
مثال:
getnumverts $sphere01
...........................................................................................
(getvert (object) (index_vertex_number
با استفاده از این تابع میتوان position یک vertex در فضا بدست آورد
دارای دو parameter تنظیم کننده است
در قسمت (object) موضوع خود را وارد میکنیم
در قسمت (index_vertex_number) شماره vertexی را که position آن را می خوهیم وارد مکنیم
مثال:
میخواهیم بدانیم که vertex شماره 10در sphere$01 در چه positionی قرار دارد
getvert $sphere01 10
...........................................................................................
instance OBJ
instance کردن یک موضوع یک نوع کپی از موضوع است, با این تفاوت اگر پارامترها یا vertex های موضوع
instance را تغییر بدی, موضوعات instance گرفته دیگر همزمان با آن تغییر میکنند
مثال:
instance $sphere01
........................................................................................
object . DIR
dir یک propertyی برای بیشتر موضوعات در maxscript مثل propertyیpos ,هر موضوعی در maxscript
دارای position باشد میتوان pos اونو در فضا تغییر داد, کهDIR هم دارای همچین ویژگی هست که بیشتر موضوعات اونو دارن DIR مخف Direction است یعنی جهت یا سمت وسو
اما dir چیه ؟ dir : هم جهت شدن با یک position یا pos در فضا میباشد
این هم جهت شدن با چرخش انجام میشود
برای اطلاع یا تغییر dir یک موضوع بعد از object کلمه direction یا مخفف آن dir را قرار میدهیم
مثال:
کد:
[B][SIZE=3][FONT=Times New Roman][COLOR=#0000ff]$sphere.DIR[/COLOR][/FONT][/SIZE][/B]
[B][SIZE=3][FONT=Times New Roman][COLOR=#0000ff]$box01.dir = [10,10,0][/COLOR][/FONT][/SIZE][/B]

------------------------------------------------------------------------------------------------
complete SCRIPT
کد:
Mobj = sphere radius:50 segments:32
converttomesh mobj
counter_vert_mesh = getnumverts mobj
slave_obj =box length:5 width:5 height:40 pos:[-100,60,0]
   ------------------
for i = 1 to (counter_vert_mesh) do
(
 
   simul_slave_obj = (instance slave_obj)
   ------------------   
 
   myvertpos = (getvert mobj i)
   simul_slave_obj.pos = (myvertpos)
 
   simul_slave_obj.dir = (myvertpos)
   ------------------
 
   animate on 
             (
               at time   0    ( simul_slave_obj.height = 40 )
               at time (i*10) ( simul_slave_obj.height = random 40 150 )
              )
 
)


..................................
توضیح اسکریپت
* در خط اول موضوع اصلی ساخته شده را به مش تبدیل میکنیم
*در خط دوم تعداد vertexهای موضوع اصلی را شمارش میکنیم
*در خط سوم یک جعبه میسازیم با ارتفاع 40 میسازیم,برای قرار دادن آن روی vertex مورد نظر
*در مرحله بعد یک loop یا حلقه تکرار میسازیم تا در هر بار کپی جعبه ما,که به تعداد vertexهای موضوع اصلی مباشد آن را در pos وdir ورتکس خود قرار دهد
*در داخل loop:
در خط اول از box خود یک کپی به صورت instance
در خط دوم پوزیشن vertex اول تا تعداد کل vertexهای مورد نظر را بدست میآوریم
در خط سوم position جعبه را با position ورتکس برابر مکنیم
در خط چهارم dir جعبه را با پوزیشن بدست آمده از ورتکس برابر میکنیم
و در آخر سر ارتفاع box را یک animate ساده میکنیم
...............................

[FONT=Arial (Arabic)]در اینجا یک برنامه کوچیک نوشتم که بر اساس همین اسکریپت کار میکنه, اماباتنظیمات بیشتر که متوانید از این آدرس دانلود کنید ,که به صورت visvaul maxscript هست

[FONT=Arial (Arabic)]اسم برنامه هم هست GATco_Objects_to_Vertexes Linker[/FONT]



[FONT=Arial (Arabic)]نتایج کار این برنامه را در این عکسها میتوانید ببینید[/FONT]


[FONT=Arial (Arabic)]RESULT gatc_objecttovertlinker.JPG[/FONT]

[FONT=Arial (Arabic)]RESULT gatc_objecttovertlinker2.JPG[/FONT]

[FONT=Arial (Arabic)]RESULT gatc_objecttovertlinker3.JPG[/FONT]

[FONT=Arial (Arabic)]RESULT gatc_objecttovertlinker4.JPG[/FONT]
:cool:

[/FONT]
 
آخرین ویرایش:

GATco

New Member
آقا مصطفي دستت درد نكنه,كارت درسته.:oops:
يه سوال؟!
نوشتن كدها درparameter wire چقدر با اسكريپت نويسي فرق ميكنه؟
من حركت چرخشي يه شي مثل a رو به حركت عموديb به صورت يه طرفه محدود كردم.ميخواستم اگه b به يه حدي رسيد,از سرعت چرخش a كم بشه.
كد خودم اينه:
مشاهده پیوست 26984
/ رو براي اين نوشتم كه سرعت چرخش رو كم كنه.البته اين كارو ميكنه ولي يه پرش به مختصات قبلي خودش و از اونجا سرعتش كم ميشه.:-?



* پست اصلاح شد*
جواب سوال اولت: بیشتر کدها را قبول میکنه و فرقی به اون صورت با اسکریپت نویسی در اسکریپت کنترولر نداره
ولی محدود به بعضی از پارامترها شده و در بعضی موارد دقت بالای نمی تونه در اجرا داشته باشه.
به طورکلی میتوان گفت
parameter wire خلاصه شده ای از اسکریپت نویسی آزاد است که متونه سرعت کا را افزایش دهد.

و در جواب سوال دومت به طور خلاصه, مشکل در اینجاست که با تقسیم کردن ,دو عمل اتفاق می افته,
اول اینکه سرعت چرخشو کم میکنه درسته, اما با این کار چرخشو به میزان بدست آمده از جواب تقسم دوباره می چرخونه
که تو اونو به صورت پرش میبینی, پس باید اونو حفظ کرد
پس به این صورت عمل کن::
1. یک سیلندر بساز

2. بک باکس در مختصات صفر بساز

3.سپس آنهارا به این صورت
wire کن
rot.z سیلندرو با pos.x باکس wire کن و مسترو با کس قرار بده

4.بک لاین بساز
x اونو در 45 بزار و بقیه رو صفر کن(فقط برای تنظیم میخام)

5.حالا این کدهارو وارد کن
[CODE]
xp_then = 45.0/200.0
xp_else = 44.99/25.0
crash = (( xp_else - xp_then
))
green_card = crash * 25.0
----------------------------------------------------------------------
if ( X_position >= 45 )
then ( X_Position/200 ) + green_card
else ( X_Position/25
)
[/
CODE]
....................................
توضیحی که میتونم بدم اینه که در قسمت اول کد, ما محاسباتی انجام دادیم تا فاصله شروع پرش تا پایان پرش را بدست بیاریم
در قسمت بعدی, فاصله ای که در کد اسم اونو green_card گذاشتم, با مقدار Then جمع کردم تا این اختلاف حل بشه
البته در بعضی موارد که جهت چرخش تغییر میکنه باید کم کرد.
...................................

در اینجا میتونی خود صحنه و یک انیمیشن از اونو دانلود کنی ,در تریدی مکس 8 ساخته شده::

مشاهده پیوست render wire.rar

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

GATco

New Member
ساخت تصاویر پین اسکرین با MaxScript

با سلام خدمت همه دوستان, عید بر همگان مبارک
با یک آموزش دیگه در خدمتتونم .
بوسیله یک فایل تصویری ساده میتونید اونو به یک پین اسکرین پیچیده تبدیل کنید,اگه آموزش زیر را دنبال کنید.
در اینجا چون بعضی از توابع نیاز به توضیحات بیشتر دارند لذا این آموزش در چند مرحله پست میشه
قسمت اول "ساخت تصاویر پین اسکرین با MaxScript"

[CODE]OpenBitmap <ADRESS AS STRING> [/CODE]
با استفاده از این تابع میتوان یک فایل عکس را که روی هارد رایانیتان ذخیره شده در تری دی مکس باز کرد.
در قسمت adress مسیر فایل عکس که میتواند تمام فرمتهایی که در materialeditor استفاده میکنید باشد ,باید به حالت string باشد.
کد:
"c:\myfile.format"
زمانی که تصویر باز شد شما عملا چیزی در رviewport نخواهید دید چون تصاویر برای نمایش در viewport نیاز به موضوعات دارند.
تصویری که آماده میکنید بهتر است دارای روزلیشن بیشتر از 100 نباشد چون برای هر pixel یک boxخواهیم ساخت و برای یک تصویر با روزلیشن 100*100 نیاز به 10000 box خواهد
بود و لذا اگر دارای سیستم قوی ای هستید می توانید تصویر بزرگتری انتخاب کنید.

مثال:

کد:
my_image = openbitmap "C:\pictures\image.bmp"
 
[SIZE=1][COLOR=#0000ff][SIZE=2][COLOR=blue]BitMap:C:\image.bmp[/COLOR][/SIZE]
[SIZE=2][COLOR=#000000][/COLOR][/SIZE][/COLOR][/SIZE]

مثال:
کد:
my_image = openbitmap "D:\pictures\image.jpg"
 
[COLOR=blue]BitMap:D:\image.jpg[/COLOR]

تصاویر اگر رنگی باشند یک پین اسکرین رنگی خواهید دید اگر سیاه و سفید باشند به صورت سیاه وسفید در خواهد آمد
...................................
بعد از باز کردن تصویر میتوانیم با دو properteis :
کد:
<bitmap>.[COLOR=red]width[/COLOR]
<bitmap>.[COLOR=red]height[/COLOR]

میتوانیم عرض و ارتفاع تصویر را بدست آوریم
در قسمت bitmap باید متغیری که به openbitmap داده شده قرار داد

مثال:
کد:
my_image = openbitmap "C:\pictures\image.bmp"
 
[COLOR=blue]BitMap:C:\image.bmp[/COLOR]
 
[SIZE=1][SIZE=2][SIZE=2]myhei = myimage.height
[/SIZE][/SIZE][SIZE=1][COLOR=blue]100[/COLOR]
 
[SIZE=1][SIZE=2]mywid = myimage.width[/SIZE]
[COLOR=blue]100[/COLOR]
[/SIZE][/SIZE][/SIZE]



:)

 

GATco

New Member
قسمت دوم "ساخت تصاویر پین اسکرین با MaxScript"
تابع

کد:
   [/FONT][B][FONT=Courier New][COLOR=red]getPixels[/COLOR][/B][/FONT][FONT=Courier New] [COLOR=blue]<bitmap> <coord_point2> <num_pixels>[/COLOR] [/FONT][FONT=Times New Roman]

این یکی از مهمترین توابع در این آموزش است که با سرعت بالایی pixelهای یک تصویر رو برای ما می خونه.

زمانی که این تابع یک pixelرو میخونه در جوا ب رنگ او pixelرو به ما میده.

رنگ پیکس به عنوان یک رنگ RGB خواهد بود red ,blue ,green که بالاترین عدد برای هر کدام
255 است که رنگ سفید خالص به این صورت است
کد:
  color 255,255,255

و رنگ سیاه خالص هم
کد:
  color 0,0,0

اگر مقدار بیشتر از 255 برای هر رنگ وارد کنید به مقادیر اولیه خود بر میگردد مثلااگر 256 وارد کنید اونو به منزله صفر خواهد گرفت و بر عکس

<<<<<<>>>>>>
برای تغییر رنگ یک موضوع یا اطلاع از مقادیر رنگ ما از این properties استفاده میکنیم

کد:
  <OBJ>.Wirecolor

که در قسمت OBJ موضوع خود وارد میکنیم ,که میتوان هر موضوعی باشد که خاصیت رنگ پذیری داشته باشه

مثال:
کد:
$box01 . wirecolor = (color 255 255 255)
[/FONT][FONT=Times New Roman][COLOR=#0000ff](color 255 255 255)
[/COLOR][/FONT][FONT=Times New Roman]

مثال:
کد:
$sphere01 . wirecolor
[/FONT][FONT=Times New Roman][COLOR=#0000ff](color 255 102 10)
[/COLOR][/FONT][FONT=Times New Roman]

<<<<<<>>>>>>
برگردیم به تابع GetPixels و توضیح هر قسمت آن

دارای سه قسمت تنظیمی است>

bitmap : در اینجا تصویر خود را وارد میکنیم که با تابع openbitmap قبلا باز کردیم به قسمت اول آموزش مراجعه کنید

coord_point2: این یک مختصات دو بعدی است که به صورت زیر به نمایش در خواهد آمد,منظور ما پهنا و ارتفاع است

کد:
  [x , y]

x همون پهنا و Y همون ارتفاع
از این مختصات برای تعیین محدوده خواندن پیکسل ها استفاده میکنیم

نکات خیلی مهم:
پیکسلها به صورت افقی یعنی در راستای x یا پهنا خوانده میشود.

هر pixel با یک عدد شماره گذاری شده , پس اولین pixel با صفر شماره گذاری شده.
پس اگر بخواهیم 100 پیکسل داشته باشیم باید از صفر تا 99 شماره گذاری کنیم چون خود صفر هم شماره اولین pixel است

(برای توضیحات کاملتر پیوست را مطاله فرمایید)

GetPixel function learning.jpg



فرض کنید یک تصویر 100*100 داریم که جمعا 10000 پیکسل دارد میخواهیم آ خرین پیکسل در ارتفاع صفر تصویر را بخوانیم پس به این صورت مختصات را تنضیم میکنیم

کد:
  [99,0]

num_pixels: [FONT=Courier New (Arabic)]این قسمت از تابع به طور کامل وابسته است به مختصات دو بعدی که قبلا توضیح دادم[/FONT].
[FONT=Courier New (Arabic)]در این قسمت تعداد پیکسلهایی که قرار است خوانده شوند تعیین میکنیم ,که وابسته به مختصات داده شده ماست[/FONT].
[FONT=Courier New (Arabic)]اگر تعداد پیکسلها با مختصات همخوانی نداشته باشد جواب ما یک[/FONT] Array
[FONT=Courier New (Arabic)]خالی خواهد بود

[/FONT]([FONT=Courier New (Arabic)]برای جزئیات پیوست را مطاله فرمایید[/FONT])

GetPixel function learning.jpg



............
[FONT=Courier New (Arabic)]مثال1[/FONT]::
[FONT=Courier New (Arabic)]فرض کنید تصویری با کیفیت 5*5 داریم میخواهیم ببینیم در مختصات[/FONT]
کد:
  [0,3]
پنج پیکسل وجود دارد یا نه


کد:
[/FONT]
[FONT=Times New Roman][/FONT] 
[FONT=Times New Roman]myimage = openbitmap "d:\five_five.bmp"[/FONT]
[FONT=Times New Roman][COLOR=#0000ff]BitMap:D:\five_five.bmp
[/COLOR][/FONT][FONT=Times New Roman]myhei = myimage.height
5
mywid = myimage.width
5
my_pixels = GetPixels myimage [0,3] 5
[/FONT][FONT=Times New Roman][COLOR=#0000ff]#((color 255 128 64), (color 255 128 64), (color 255 128 64), (color 128 0 0), (color 128 0 0))
 
[/COLOR][/FONT][FONT=Times New Roman]


میبینیم که در مختصات فوق, ما 5 پیسل داریم که رنگ آنها را در یک Array مرتب کرده
.............................

مثال2::

[FONT=Courier New (Arabic)]میخواهیم ببینیم در مختصات[/FONT]
کد:
  [4,3]
پنج پیکسل وجود دارد یا نه


کد:
[/FONT]
[FONT=Times New Roman][/FONT] 
[FONT=Times New Roman]myimage = openbitmap "d:\five_five.bmp"[/FONT]
[FONT=Times New Roman][COLOR=#0000ff]BitMap:D:\five_five.bmp
[/COLOR][/FONT][FONT=Times New Roman]myhei = myimage.height
5
mywid = myimage.width
5
my_pixels = GetPixels myimage [4,3] 5
[/FONT][FONT=Times New Roman][COLOR=#0000ff]#()
 
[/COLOR][/FONT][FONT=Times New Roman]
میبینیم که در مختصات دوم, 5 پیکسل وجود ندارد و در پاسخ یک array خالی به ما میدهد
....................................

مثال3::
[FONT=Courier New (Arabic)]میخواهیم ببینیم در همین مختصات که در بالا تکرار کردیم
[/FONT]
کد:
  [4,3]
یک پیکسل وجود دارد یا نه


کد:
[/FONT]
[FONT=Times New Roman][/FONT] 
[FONT=Times New Roman]myimage = openbitmap "d:\five_five.bmp"[/FONT]
[FONT=Times New Roman][COLOR=#0000ff]BitMap:D:\five_five.bmp
[/COLOR][/FONT][FONT=Times New Roman]myhei = myimage.height
5
mywid = myimage.width
5
my_pixels = GetPixels myimage [4,3] 1
[/FONT][FONT=Times New Roman][COLOR=#0000ff]#((color 128 0 0))
 
[/COLOR][/FONT][FONT=Times New Roman]

پس در مختصات مورد نظر 5 پیکسل وجود ندارد , اما یک پیکسل وجود دارد
(برای توضیحات کاملتر پیوست را مطاله فرمایید)

GetPixel function learning.jpg


............................
نکته قابل توجه :ما در این آموزش فرض کردیم که شما با Array ها آشنا هستید و لذ از توضیح اونها صرف نضر میکنیم به هر حال اگر مشکلی با array ها داشتید میتوانید پست بزنید


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

hellboy3d

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

موفق باشی
 

GATco

New Member
خواهش میکنم دوست عزیز

در اینجا میتونی یک فایل تصویری در باره ریگینگ یک تایر اتومبیل که با مکس اسکریپت ریگ کردم ببینی

مشاهده پیوست GATco_simple_car_tire_rig.rar

اگر خود فایل 3dsmax در باره ریگینگ این تایر اتومبیل میخوای میتونی از اینجا دانلود کنی,البته با 3dsmax8 ریگ کردم.
کافی play رو بزنی

مشاهده پیوست gatco_car tire rig.rar

......................................
ضمنا قسمت سوم "ساخت تصاویر پین اسکرین با MaxScript" بزودی میزارم:D
 

shirani

مدیر انجمن <A href="http://forum.majidonline.com/f
واقعاً حرف نداره ببینم از کجا میشه اسکریپت آماده دریافت کرد اصلاً یک همچین سایتهای هست
 

GATco

New Member
واقعاً حرف نداره ببینم از کجا میشه اسکریپت آماده دریافت کرد اصلاً یک همچین سایتهای هست


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

http://scriptspot.com
 

GATco

New Member
قسمت سوم "ساخت تصاویر پین اسکرین با MaxScript"

در این قسمت میخوام کارو تموم کنم و اسکریپتو کامل کنم ,البته بعضی از دستورات و توابع مثل FOR وARRAY ها توضیح داده نمیشه
چون خیلی ها با این دستورات آشنا هستند .

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

ما قبلا با استفاده از photoshop روزلیشن تصویر مورد نظر رو روی 100*100 گذاشتیم و اونو به دو صورت سیاه و سفید و رنگی ذخیره کردم و برای ذخیره از فرمت bmp استفاده کردم.

ما با کم و زیاد کردن ارتفاع باکسها آن تصویرو به حالت برجسته نمایش میدهیم و همچنین ما در این اسکریپت دو نوع پین اسکرین میسازیم رنگی و سیاه وسفید.

من در این آموزش از تصویر لو گوی خودم با روزولیشن 100*100 استفاده میکنم و بعد از اتمام کار از یک زاویه مناسب از او رندر میگیرم
همچنین ما میخواهیم از تمام پیکسلهای تصور استفاده کنیم و ما جمعا 10000 باکس خواهیم ساخت
................................
در اینجا می خوام اسکریپتو توضیح بدم


کد:
[/SIZE]
[SIZE=3][/SIZE] 
[SIZE=3]mylogo = openbitmap "d:\Mylogo.bmp"[/SIZE]
[SIZE=3]w=Mylogo.width
h=Mylogo.height[/SIZE]
[SIZE=3]for GATco = 0 to (h-1) do
([/SIZE]

[SIZE=3]Read_Width = getPixels mylogo [0 , GATco] w[/SIZE]

[SIZE=3]For me = 1 to w do
([/SIZE]
[SIZE=3]my_box = box width:10 length:10 
my_box.pos = [ me*25 , GATco*25 ,0 ] 

my_color = Read_Width [ me ]
my_box . wirecolor = my_color


get_red = my_color . red[/SIZE]
[SIZE=3]get_green = my_color . green[/SIZE]
[SIZE=3]get_blue = my_color . blue[/SIZE]

[SIZE=3]My_Height_Box = (get_red + get_blue + get_green ) / 2

my_box . height = My_Height_Box[/SIZE]

[SIZE=3])----end ME loop

)----end GATco loop[/SIZE]
[SIZE=3][/SIZE] 
[SIZE=3]

*[FONT=Times New Roman (Arabic)]خوب خطهای اول دوم و سومو قبلا در قسمتهای قبلی آموزش توضیح دادم[/FONT]
[FONT=Times New Roman (Arabic)]
[/FONT]
*[FONT=Times New Roman (Arabic)]در قسمت بعدی اسکزیپت, ما دو تا[/FONT] Loop [FONT=Times New Roman (Arabic)]داریم که یکی از[/FONT] loop[FONT=Times New Roman (Arabic)]ها در داخل[/FONT] Loop [FONT=Times New Roman (Arabic)]دیگر قرار دارد
در اینجا زمانی که[/FONT] loop [FONT=Times New Roman (Arabic)]بیرونی یک بار اجرا بشه[/FONT] ,loop [FONT=Times New Roman (Arabic)]داخلی به طور کامل اجرا میشه[/FONT]
[FONT=Times New Roman (Arabic)]
فرض کنیم دو[/FONT] loop [FONT=Times New Roman (Arabic)]داریم که یک[/FONT] loop [FONT=Times New Roman (Arabic)]در داخل[/FONT] loop [FONT=Times New Roman (Arabic)]دیگر قرار دارد[/FONT],loop [FONT=Times New Roman (Arabic)]بیرونی باید 10 بار تکرار بشه و[/FONT] loop [FONT=Times New Roman (Arabic)]داخلی 5 بار باید تکرار بشه پس این اسکریپت به این صورت عمل میکنه که با یک بار تکرار[/FONT] loop [FONT=Times New Roman (Arabic)]بیرونی[/FONT] ,loop [FONT=Times New Roman (Arabic)]داخلی 5 بار تکرار میشه و به همین صورت با تکرار بار دوم[/FONT] loop [FONT=Times New Roman (Arabic)]بیرونی[/FONT] ,loop[FONT=Times New Roman (Arabic)]داخلی دوباره 5 بار تکرار میشه و این روند ادامه دارد[/FONT]
[FONT=Times New Roman (Arabic)]
پس[/FONT] loop [FONT=Times New Roman (Arabic)]داخلی 5*10 بار اجرا میشه[/FONT]
[FONT=Times New Roman (Arabic)]
[/FONT]
*loop [FONT=Times New Roman (Arabic)]بیرونی باید از 0 تا 99 یعنی جمعا صد بار باید تکرار بشه یعنی به تعداد مقدار[/FONT] Y [FONT=Times New Roman (Arabic)]یا ارتفاع تصویر[/FONT]

[FONT=Times New Roman (Arabic)]و در خط

[/FONT]
کد:
[/SIZE]
[SIZE=3][/SIZE] 
[SIZE=3]Read_Width = getPixels mylogo [0 , GATco] w[/SIZE]
[SIZE=3][/SIZE] 
[SIZE=3]

[FONT=Times New Roman (Arabic)]میخواهیم پیکسلها رو در هر ردیف بخونه چون مخوام کل پیکسلهای یک ردیف رو بخونه مقدار مختصات[/FONT] x [FONT=Times New Roman (Arabic)]یا پهنارو صفر گذاشتم[/FONT]
[FONT=Times New Roman (Arabic)]
سپس بعد از خوندن پیکسلهای هر ردیف میخوام به ردیف بعدی بره, پس مختصات[/FONT] y [FONT=Times New Roman (Arabic)]رو یا همون ارتفاع رو باید تغییر بدم, لذا با گذاشتن مقدار[/FONT] loop [FONT=Times New Roman (Arabic)]بیرونی در مختصات[/FONT] y , [FONT=Times New Roman (Arabic)]در هر بار تکرار[/FONT] loop [FONT=Times New Roman (Arabic)]بیرونی ارتفاع به طور خود کار تغییر میکنه[/FONT]
[FONT=Times New Roman (Arabic)]
[/FONT]
*[FONT=Times New Roman (Arabic)]اما در[/FONT] loop [FONT=Times New Roman (Arabic)]داخلی چه اتفاقی می افته,این[/FONT] loop [FONT=Times New Roman (Arabic)]باید به اندازه مقدار پهنای تصویر یا[/FONT] width [FONT=Times New Roman (Arabic)]تکرار بشه[/FONT]
[FONT=Times New Roman (Arabic)]
یعنی این[/FONT] loop [FONT=Times New Roman (Arabic)]باید 100 مرتبه تکرار بشه که در این 100 مرتبه باید یک ردیف صدتایی از جعبه هارو بسازه
خب در داخل[/FONT] loop [FONT=Times New Roman (Arabic)]داخلی ما یک[/FONT] box [FONT=Times New Roman (Arabic)]با عرض و طول مناسب میسازیم , سپس[/FONT] pos [FONT=Times New Roman (Arabic)]اونو شبیه[/FONT] pos [FONT=Times New Roman (Arabic)]پیکسل در تصویر قرار میدم , رنگ اون[/FONT] box [FONT=Times New Roman (Arabic)]رو از[/FONT] ARRAY [FONT=Times New Roman (Arabic)]یا آرایه[/FONT] READ_WIDTH [FONT=Times New Roman (Arabic)]فراخوانی میکنم و رنگ اون[/FONT] box[FONT=Times New Roman (Arabic)]رو به رنگ پیکسل تغییر میدم[/FONT]
[FONT=Times New Roman (Arabic)]
[/FONT]
*[FONT=Times New Roman (Arabic)]در قسمت[/FONT]

کد:
[/SIZE]
[SIZE=3][/SIZE] 
[SIZE=3]get_red = my_color . red[/SIZE]
[SIZE=3]get_green = my_color . green[/SIZE]
[SIZE=3]get_blue = my_color . blue[/SIZE]
[SIZE=3][/SIZE] 
[SIZE=3]


[FONT=Times New Roman (Arabic)]ما باید بر اساس مقدارهای رنگ پیکسلها ارتفاعهای مختلفی برای[/FONT] box [FONT=Times New Roman (Arabic)]تعریف کنیم یعنی هر چه رنگ ما به سیاه خالص نزدیکتر باشه ارتفاع کمتر , و هر چه رنگ ما به سفید خالص نزدیکتر باشه ارتفاع بیشتر بشه[/FONT].

[FONT=Times New Roman (Arabic)]من در اینجا از سه[/FONT] properties [FONT=Times New Roman (Arabic)]استفاده کردم[/FONT] >


کد:
[/SIZE]
[SIZE=3][/SIZE] 
[SIZE=3]<mycolor>.Red[/SIZE]
[SIZE=3]<mycolor>.Green[/SIZE]
[SIZE=3]<mycolor>.Blue[/SIZE]
[SIZE=3][/SIZE] 
[SIZE=3]

[FONT=Times New Roman (Arabic)]به این مثال توجه کنید

[/FONT]
کد:
[/SIZE]
[SIZE=3][/SIZE] 
[SIZE=3]my_color = (color 255 10 0)[/SIZE]
[SIZE=3][COLOR=#0000ff](color 255 10 0)
[/COLOR][/SIZE][SIZE=3]my_color.Red[/SIZE]
[SIZE=3][COLOR=#0000ff]255.0
[/COLOR][/SIZE][SIZE=3]my_color.Green[/SIZE]
[SIZE=3][COLOR=#0000ff]10.0
[/COLOR][/SIZE][SIZE=3]my_color.Blue[/SIZE]
[COLOR=#0000ff][SIZE=3]0.0[/SIZE]
[SIZE=3][/SIZE] 
[/COLOR][SIZE=3]


[FONT=Times New Roman (Arabic)]پس با استفاده از این تنضیمات میتونیم به مقدارهای اصلی رنگهای[/FONT] RGB [FONT=Times New Roman (Arabic)]دسترسی پیدا کنیم
در آخر سر این سه عدد را با هم جمع میکنیم تا این عدد ارتفاع[/FONT] box [FONT=Times New Roman (Arabic)]مارا تشکیل دهد برای تنظیم بهتر ارتفاع ومن اونو تقسیم بر 2 کردم
و در آخر سر ما این عدد را به عنوا ن ارتفاع[/FONT] box [FONT=Times New Roman (Arabic)]قرار دادیم[/FONT]
[FONT=Times New Roman (Arabic)]
اگر رنگ پیکسل به سفید نزدیک شود این عدد بزرگتر در نتیجه ارتفاع افزایش می یابد
اگر رنگ پیکسل به سیاه نزدیک شود این عدد کوچکتر در نتیجه ارتفاع کاهش می یابد[/FONT]

[FONT=Times New Roman (Arabic)]نتیجه کار را متونید در این تصاویر ببینید



RESULT GATco_PinScreen_Creater_2009_1.jpg

RESULT GATco_PinScreen_Creater_2009_2.jpg

RESULT GATco_PinScreen_Creater_2009_3.jpg

RESULT GATco_PinScreen_Creater_2009_4.jpg

RESULT GATco_PinScreen_Creater_2009_5.jpg

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


.................................................
اگر مشکلی با این آموزش بود مطرح کنید:wink:
[/FONT]
 

GATco

New Member
Randomize کردن دو عملیات مختلف

حتما با مفهوم random آشنا هستید ,یعنی به صورت تصادفی یا شانسی از بین یک مجموعه یک چیزی را انتخاب کردن.
در maxscript تابعی وجود داره به نام random که با استفاده از اون میشه دو عدد مختلف یا دو position مختلف را
randomize کرد.

مثال:

کد:
[SIZE=2]ran = Random 1.0 100.0
[/SIZE][SIZE=2][COLOR=#0000ff]29.8743
[/COLOR][/SIZE][SIZE=2]ran = random 1 100[/SIZE]
[SIZE=2][COLOR=#0000ff]87
[/COLOR][/SIZE][SIZE=2]-------[/SIZE]
[SIZE=2]ran_pos = random [0,0,0] [10,15,30][/SIZE]
[SIZE=2][COLOR=#0000ff][9.32051,1.01729,7.23876]
[/COLOR][/SIZE][SIZE=2]ran_pos = random [0,0,0] [10,15,30][/SIZE]
[SIZE=2][COLOR=#0000ff][7.23408,2.26196,13.4034]
[/COLOR][/SIZE]

اما من اینجا مخوام دو عمل مختلف را randomize کنم نه دو عدد یا دو position را
فرض کنیم یک موضوع داریم و مخواهیم از بین rotation و position هر بار به صورت تصادفی یک حالت را انتخاب کنه
پس مینویسیم

کد:
[SIZE=2]ran = random 0 1
[/SIZE][SIZE=2][COLOR=#008000]--------------
[/COLOR][/SIZE][COLOR=#0000ff][SIZE=2]if[/SIZE][/COLOR][SIZE=2] ( ran == 1 )[/SIZE]
[COLOR=#0000ff][SIZE=2]then[/SIZE][/COLOR][SIZE=2] ( move $ [10,12,15] )[/SIZE]
[COLOR=#0000ff][SIZE=2]else[/SIZE][/COLOR][SIZE=2] ( [COLOR=#0000ff]if[/COLOR] ( ran == 0 ) [COLOR=#0000ff]do[/COLOR] ( rotate $ 40.23 z_axis) )[/SIZE][SIZE=1]
[/SIZE]

*در قسمت اول اسکریپت>

اعداد صفر و یک را randomize کردیم

*در قسمت بعدی اسکریپت شروطی تعیین کردیم>

که اگر مقدار ran یک شد , جسم یا اجسامی که در حالت انتخاب باشند پوزیشن آنهارا تغییر دهد
اگر مقدار ran صفر شد جسم یا اجسامی که در حالت انتخاب باشند, بچرخند

*علامت $ یعنی>

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

=====
=====

حالا auto key را روشن کنید هر بار timeSlider را 20 فریم حرکت دهید و همچنین اسکریپت را اجرا کنید


-----------------------------------------
موتونید با تغییر اسکریپت اونو پیشرفته تر کنید مثلا خود مقدار move یا rotate را هم randomize کنید که بر عهده خودتونه
 

GATco

New Member
ساخت تصاویر فوق پیچیده با سرعت نور در مکس اسکریپت

با یک آموزش دیگه در خدمتتونم
این اسکریپت برای کسانی هست که عاشق مدلینگ هستند که با استفاده از اون میتونید مدلهای بسیار پیچیده ای بسازید
توضیح توابع

کد:
[SIZE=2][COLOR=#0000ff][FONT=Times New Roman]myobjext[/FONT][/COLOR][FONT=Times New Roman][COLOR=#ff0000].dir[/COLOR][COLOR=#0000ff]=[/COLOR][COLOR=#0000ff][x,y,z][/COLOR][/FONT][/SIZE]

dir یک propertyی هستش برای بیشتر موضوعات در maxscript مثل propertyیpos ,
هر موضوعی در maxscript دارای position باشد میتوان pos اونو در فضا تغییر داد, کهDIR هم دارای همچین ویژگی هست که بیشتر موضوعات اونو دارن DIR
مخف Direction است یعنی جهت یا سمت وسو
اما dir چیه ؟ dir : هم جهت شدن با یک position یا pos در فضا میباشد
این هم جهت شدن با چرخش انجام میشود
برای اطلاع یا تغییر dir یک موضوع بعد از object کلمه direction یا مخفف آن dir را قرار میدهیم

برای جزئیات بیشتر تصویرو مطاله کنید


مشاهده پیوست 28882


کد:
[FONT=Times New Roman][SIZE=2]$box01.dir = [10,10,0][/SIZE][/FONT]
[FONT=Times New Roman][SIZE=2][COLOR=#0000ff][10,10,0][/COLOR][/SIZE][/FONT]

................................................................................................

کد:
[SIZE=2][COLOR=red]copy[/COLOR] [COLOR=blue]myobject[/COLOR][/SIZE]

از موضوع مورد نظر کپی میگیرد
مثال

کد:
[FONT=Times New Roman][SIZE=2]mycopy = copy $box01[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=2][COLOR=#0000ff]$Box:Box02 @ [-0.216052,-88.215973,0.000000][/COLOR][/SIZE][/FONT]

..............................................................................................

کد:
[SIZE=3][FONT=Times New Roman][COLOR=#ff0000]for [/COLOR][/FONT][FONT=Times New Roman][COLOR=#0000ff]variable [/COLOR][/FONT][FONT=Times New Roman][COLOR=#ff0000]= [/COLOR][/FONT][FONT=Times New Roman][COLOR=#0000ff]number_a [/COLOR][/FONT][FONT=Times New Roman][COLOR=#ff0000]to [/COLOR][/FONT][FONT=Times New Roman][COLOR=#0000ff]number_b [/COLOR][/FONT][FONT=Times New Roman][COLOR=#ff0000]do [/COLOR][/FONT][FONT=Times New Roman][COLOR=#ff0000]([/COLOR][/FONT][FONT=Times New Roman][COLOR=#0000ff]my_script[/COLOR][/FONT][FONT=Times New Roman][COLOR=#ff0000])[/COLOR][/FONT][/SIZE]

این تابع یک حلقه تکرار ایجاد میکند,که با استفاده از اون میتوان یک اسکریپت را از یک عدد تا یک عدد دیگر تکرار کرد
مثال1:میخواهیم 10 کپی از یک box بگیریم پس مینویسیم

کد:
[FONT=Times New Roman][SIZE=2]for example = 1 to 10 do ( copy $box01)[/SIZE][/FONT]

مثال2:میخواهیم عدد x را از 1 تا 5 به توان برسانیم

کد:
[FONT=Times New Roman][SIZE=2]x=5[/SIZE][/FONT]
[SIZE=2][FONT=Times New Roman][COLOR=#0000ff]for[/COLOR][/FONT][FONT=Times New Roman] tavan = 1 [/FONT][FONT=Times New Roman][COLOR=#0000ff]to[/COLOR][/FONT][FONT=Times New Roman] 5 [/FONT][FONT=Times New Roman][COLOR=#0000ff]do[/COLOR][/FONT][/SIZE]
[FONT=Times New Roman][SIZE=2]( m = x ^ tavan[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=2]print m[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=2])[/SIZE][/FONT]

کد:
[FONT=Times New Roman][SIZE=2][COLOR=#0000ff]5[/COLOR][/SIZE][/FONT]
[FONT=Times New Roman][SIZE=2][COLOR=#0000ff]5[/COLOR][/SIZE][/FONT]
[FONT=Times New Roman][SIZE=2][COLOR=#0000ff]25[/COLOR][/SIZE][/FONT]
[FONT=Times New Roman][SIZE=2][COLOR=#0000ff]125[/COLOR][/SIZE][/FONT]
[FONT=Times New Roman][SIZE=2][COLOR=#0000ff]625[/COLOR][/SIZE][/FONT]
[FONT=Times New Roman][SIZE=2][COLOR=#0000ff]3125[/COLOR][/SIZE][/FONT]
[FONT=Times New Roman][SIZE=2][COLOR=#0000ff]OK[/COLOR][/SIZE][/FONT]
[FONT=Times New Roman][SIZE=2][COLOR=#0000ff]OK[/COLOR][/SIZE][/FONT]

در این مثال از دستور print استفاده کردیم تا جواب توان رسانی را print کند یا نمایش دهد
............................................................................................

کد:
[SIZE=2][FONT=Times New Roman][COLOR=#ff0000]Rotate [/COLOR][/FONT][FONT=Times New Roman][COLOR=#0000ff]myobject ([/COLOR][/FONT][FONT=Times New Roman][COLOR=#ff0000]eulerangles [/COLOR][/FONT][FONT=Times New Roman][COLOR=#0000ff]x y z[/COLOR][/FONT][FONT=Times New Roman])[/FONT][/SIZE]

این تابع باعث چرخش جسم ما در محورهای تعیین شده میشود
در قسمت myobject موضوع را وارد میکنیم
د قسمت x y z مقادیر چرخش را تعیین میکنیم
کلمه کلیدیeulerangles باید حتما قبل از مقدارهای x y z وارد شود

مثال1:

کد:
[FONT=Times New Roman][SIZE=2]rotate $box01 (eulerangles 0 30 0)[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=1][COLOR=#0000ff]OK[/COLOR][/SIZE][/FONT]

مثال2:

کد:
[FONT=Times New Roman][SIZE=2]for myrot = 1 to 5 do [/SIZE][/FONT]
[FONT=Times New Roman][SIZE=2]([/SIZE][/FONT]
[FONT=Times New Roman][SIZE=2]rotate $box01 (eulerangles 0 10 0)[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=2])[/SIZE][/FONT]

در این مثال موضوع ما 50 درج خواهد چرخید
...............................................................................................................
اسکریپت کامل>>

کد:
[FONT=Times New Roman][SIZE=3][COLOR=#008000]--GATco_SUPER ROT_DIR[/COLOR][/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3][COLOR=#008000]di = [10,10,10][/COLOR][/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3][COLOR=#008000]$.dir = di[/COLOR][/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3][COLOR=#008000]myrot =20[/COLOR][/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3][COLOR=#008000]my_numloop = 360/myrot[/COLOR][/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman][COLOR=#0000ff]for[/COLOR][/FONT][FONT=Times New Roman] GATco =1 [/FONT][FONT=Times New Roman][COLOR=#0000ff]to[/COLOR][/FONT][FONT=Times New Roman] (my_numloop-1) [/FONT][FONT=Times New Roman][COLOR=#0000ff]do[/COLOR][/FONT][/SIZE]
[FONT=Times New Roman][SIZE=3][COLOR=#008000]([/COLOR][/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3][COLOR=#008000]mycopy =copy $[/COLOR][/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3][COLOR=#008000]rotate mycopy (eulerangles 0 0 (myrot * GATco) )[/COLOR][/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3][COLOR=#008000])[/COLOR][/SIZE][/FONT]
[SIZE=1][FONT=Times New Roman][COLOR=#008000][SIZE=3]--by GATco for learning on MajidOnline.com[/SIZE] [/COLOR][/FONT][/SIZE]

موضوع را در حالت انتخاب قرار دهید سپس اسکریپت را اجرا کنید
همچنین با تغییر rotation و dir میتوانید شکلهای دیگری را خلق کنید
عکسی از نتیجه کار


مشاهده پیوست 28881


===============
مشکل یا سوالی بود مطرح کنید
:cool:
 
آخرین ویرایش:

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

بالا