Unconfigured Ad Widget

تقليص

إعـــــــلان

تقليص
لا يوجد إعلان حتى الآن.

سؤال في الـ Max Script

تقليص
X
 
  • تصفية - فلترة
  • الوقت
  • عرض
إلغاء تحديد الكل
مشاركات جديدة

  • سؤال في الـ Max Script

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


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


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

  • #2
    نعم يمكنك طبعا باكثر من طريقة ... لكن ما عرضته فى الفيديو .. اسهل طريقة له هى ال reaction manager
    http://heilschwingung.at/188e0

    تعليق


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

      تعليق


      • #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 ضعها فى اخر السطر و ليس فى اوله
        http://heilschwingung.at/188e0

        تعليق


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

          تعليق


          • #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
            http://heilschwingung.at/188e0

            تعليق


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

              تعليق


              • #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
                  اخى العزيز .. انت تسير بشكل جيد جدا و بامانة لا اريد ان اكتب انا لك الكود .. اريدك انت ان تكتبه .
                  هناك بعض النقاط التى اريد ذكرها هنا .

                  فى اول اجابة لى .. اخبرتك ان هناك عدة طرق لذلك . و اول ما كنت افصده هو ال 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)"
                  راعى ان المنابر تفسد الكود
                  http://heilschwingung.at/188e0

                  تعليق


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

                    تعليق


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

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

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

                      تعليق

                      يعمل...
                      X