موضوع: سؤال في الـ Max Script

ردود: 11 | زيارات: 962
  1. #1

    سؤال في الـ Max Script

    السلام عليكم أخوتي ....
    أريد أن أعرف إذا كان من الممكن التأثير على موقع عنصر في المشهد من خلال تحريك عنصر أخر في نفس اللحظة
    بإستخدام الماكس أسكربت بطريقة ديناميكية بحيث لا أضطر لعمل Evaluate كل مرة بعد تحريك العنصر
    وهذا فيديو لتوضيح المطلوب


    http://www.s3dd.ws/wip/maxscript.swf


    ولكم خالص
    الشكر


  2. #2
    نعم يمكنك طبعا باكثر من طريقة ... لكن ما عرضته فى الفيديو .. اسهل طريقة له هى ال reaction manager

  3. #3
    شكراً أخي على تجاوبك ولكني سألت عن طريقة عمل ذلك بواسطة كتابة كود ماكس اسكربت فهل استطيع من خلال
    كود الحصول على نفس النتيجة أم لا ................. وشكراً

  4. #4
    WireParameter


    كود:
    B = Box pos:[80,50,0]
    s = Sphere pos:[-80,50,0]
    
    paramWire.connect B.pos.controller[#Z_Position] S.pos.controller[#Z_Position] "-Z_Position"
    للاسف مرة اخرى تفسد المنابر الكود
    قبل ParamWire هناك Double quotes ضعها فى اخر السطر و ليس فى اوله

  5. #5
    الله يبارك فيك أخي ومعليش لو غلبتك أخي ممكن طريقة الحصول على مثل هذه الحركة بالكود إذا أمكن

  6. #6
    كود:
    B = Box pos:[80,50,0] 
    s1 = Sphere pos:[-80,50,0] recenter:true
    s2 = Sphere pos:[-80,50,80] recenter:true
    s3 = Sphere pos:[-80,50,160] recenter:true
    
    P1 = point pos:(S2.pos + [0,40,0])
    P2 = point pos:(S3.pos + [0,40,0])
    
    paramWire.connect B.pos.controller[#Z_Position] S1.pos.controller[#Z_Position] "-Z_Position"
    	
    paramWire.connect $Sphere01.pos.controller[#Z_Position] $Sphere02.pos.controller[#Z_Position] "
    if ($Point01.pos.z - $Sphere01.pos.z >$Sphere01.radius) Then
    (
    	Z_Position = Z_Position+ (($Point01.pos.z- $Sphere01.pos.z)) 
    )
    else (Z_Position  + $Sphere01.radius)"
    
    
    paramWire.connect $Sphere02.pos.controller[#Z_Position] $Sphere03.pos.controller[#Z_Position] "
    if ($Point02.pos.z - $Sphere02.pos.z >$Sphere02.radius) Then
    (
    	Z_Position = Z_Position+ (($Point02.pos.z- $Sphere02.pos.z)) 
    )
    else (Z_Position  + $Sphere02.radius)"


    اخترت انا نصف القطر للدائرة كمقياس ... انت فى الغالب ستحتاج لمقياس اخر
    ال point لابد من وجودها لحساب المسافات لان كل كرة من هؤلاء مكانها يتغير .. و لذلك لابد من شىء ثابت لتقيس المسافة منه .

    غير الامتداد الى ms

  7. #7
    الله يكرمك يا شيخ سوف أجرب الكود وأعود عليك لإني محتاج مساعدتك الله يرزق من حيث لا تحتسب

  8. #8
    كيف استخدم Float_Expression بدلاً عن ParamWire للأجسام التي ترتفع بمجرد ملامسة الجسم السفل له علماً أني توصلت لتعريف متغير من نوع Scalar وربطه بـ Constant كما يوجد بالكود التالي بس مقدرت أربطه بـ controller وهو المهم


    B = Box pos:[0,0,0] height:1 width:30 length:5 wirecolor: (color 255 0 0)
    P = Point pos:[20,0,20] box:false size:8 wirecolor: (color 255 0 0)
    D = Dummy pos:[30,0,50]

    for i = 1 to 4 do
    (
    CB = copy B
    CB.pos = [0,0,i*20]
    CB.wirecolor = (color ((255/i)-30) 0 0)
    )
    for i = 2 to 4 do
    (
    CP = copy P
    CP.pos = [20,0,i*20]
    CP.wirecolor = (color ((255/i)-30) 0 0)
    )

    paramWire.connect $Dummy01.pos.controller[#Z_Position] $Box01.pos.controller[#Z_Position] "(-Z_Position+50)"

    po = $point* as array
    bo = $box* as array
    m = 20

    for i = 2 to bo.count do
    (
    FE = Float_Expression ()
    bo[i].pos.controller.Z_Position.controller = FE
    FE.AddScalarConstant "BPos" m
    FE.SetExpression "BPos"
    m = i * 20
    )


  9. #9
    اخى العزيز .. انت تسير بشكل جيد جدا و بامانة لا اريد ان اكتب انا لك الكود .. اريدك انت ان تكتبه .
    هناك بعض النقاط التى اريد ذكرها هنا .

    فى اول اجابة لى .. اخبرتك ان هناك عدة طرق لذلك . و اول ما كنت افصده هو ال Expression Controller ... لكن هذا بالتحديد رغم انه اسرع Controller الا انه اصعب واحد فيهم .
    السبب فى ذلك انه يستخدم لغة ليست هى ماكس سكريبت و لا سى بلس بلس ولا اى شىء مشهور بل لغة خاصة به تجد مفرداتها فى ال Function List .

    ايضا ..اذا كنت تستخدمه لاول مرة ففى الغالب ستنسى اين انت فى النود و ستقع فى ال Circular Dependency

    قبل الحديث عن الكود .. لابد ان تعرف ان فى بعض الحالات ستضطر الى استخدام ال Explicit Calls ... انا الاحط انك تحاول تفادى استخدام اسم العنصر .. حتى يكون الكود عام و يصلح لاى حالة اخرى .. هذا عظيم جدا ... لكن خصوصا فى الريجنج .. احيانا يكون هذا الموضوع بالغ الصعوبة .

    نقطة اخرى ايضا .. تستطيع ان تفعل نفس الحركة بالطريقة السهلة جدا .. ParamWire
    او حتى بدلا من ال Expression controller ... تستخدم Float_Script
    ابطأ فى الحقيقة من ال Expression Controller لكن على الاقل انت تكتب بداخله كود ماكس سكريبت


    الان بالنسبة للكود فى اخر مشاركاتك .. انت قمت باضافة Scalar Value ...
    حسنا .. لكن انت تحتاج لاكثر من متغير هنا ... تحتاج ل Vector Value لل pointHelper التى سيتم قياس المسافة بالنسبة اليها
    مثلا :

    كود:
    FE.AddVectorTarget "PO_Pos" ($Point01.Position.controller)
    ثم انك ستحتاج فيكتور اخر لكل بوينت هيلبر لقياس المسافة بالنسبة اليه .. و كل فيكتور لابد ان تربطه بالنود الصحيح ... الخ ...
    اقصد انك ستحتاج ل Vector و Scalar values .. لتنفيذ نفس المعادلة السابقة التى كتبناها بال
    WireParam

    رغم انى اترك لك كتابة الكود ... لكن هذا مثال لكيفية كتابة Expression بهذه اللغة ... يجب ان تقرأ ال Function List و ايضا لاحظ ان هذه اللغة Case Sensitive


    كود:
    B = Box pos:[0,0,0] height:1 width:30 length:5 wirecolor: (color 255 0 0)
    P = Point pos:[20,0,10] box:false size:8 wirecolor: (color 255 0 0)
    
    
    FE = Float_Expression ()
    B.pos.controller.Z_Position.controller = FE
    
    FE.AddVectorTarget "PO_Pos" ($Point01.Position.controller)
    
    FE.SetExpression "if(PO_Pos.z >= 10 ,F+PO_Pos.z,0)"
    راعى ان المنابر تفسد الكود

  10. #10
    الله يعطيك العافية أخي وكل عام وأنت بخير ..
    سأحاول أن أصل إلى الكود المناسب ولكني أرغب بمساعدتك إذا تكرمت
    ولي سؤال ما هو الفرق بين الفكتور والأسكيلر ........... اللي أعرفه أن الفكتور يعتمد على الثلاثة محاور فهل هذا صحيح
    وهل إذا استخدمت الأسكيلر لوحدة فقط بدون فيكتور مارح تضبط الأمور لإن بالطريقة اليدوية اختار أسكيلير واحدد المحور
    المطلوب ........ أمل الإفادة وشكراً

  11. #11
    كل عام و انت بخير اخ Sask و عيد سعيد ان شاء الله

    ال scalar هى قيمة ثابتة او بمعنى اخر هى قيمة واحدة ... مثلا المسافة بين البوينت هيلبر و البوكس هى scalar
    الفيكتور ... حتى لا ندخل فى موضوع طويل .. ممكن ان تعتبره Point 3 value .. اى له 3 مكونات
    و مثلا ال position لاى نود هو فيكتور و لذلك ممكن ان نستخرج منه مكون ال x او ال y او ال z

    لذلك اذا نظرت فى المعادلة التى وضعناها فى المثال السابق بال ParamWire ستجد اننا استخدمنا الاثنين ... لذلك كنت اقول لك اننا سنحتاج الى scalar & vector اذا كنا نريد تطبيق نفس المعادلة باستخدام ال Expression Controller

Bookmarks

قوانين الموضوعات

  • لا يمكنك اضافة موضوع جديد
  • لا يمكنك اضافة ردود
  • لا يمكنك اضافة مرفقات
  • لا يمكنك تعديل مشاركاتك
  •  
  • كود BB مفعّل
  • رموز الحالة مفعّل
  • كود [IMG] مفعّل
  • [VIDEO] code is مفعّل
  • كود HTML معطل