пятница, 27 ноября 2015 г.

Один из способов анимации меха, например, гармошки.

 Есть некая заготовка мехов:
 Создаем FFD(Box) немного бОльших размеров, чем габариты заготовки. 
Create -> Space Warps -> Geometric/Deformable -> FFD(Box)
Подгонять надо именно по размерам FFD, а не подтягиванием вершин!
Далее создаем два хелпера для будущего управления мехами:
Выделяем нужные вершины на FFD и линкуем их к хелперу с помощью модификатора Linked XForm:
Также линкуем другие вершины(меняем выделение с помощью модификатора FFD Select ) к другому хелперу:




С помощью Bind to Space Warp привязываем нашу заготовку к FFD(Box):

Все готово. Это результат:
Таким же образом можно анимировать, например, сцепление поездов и т.п.:
Спасибо за внимание!

среда, 11 ноября 2015 г.

Простой и быстрый способ выравнивания чертежей с помощью Normal Align.

Это заимпортированные исходники:

 Выделяем ось и применяем экструд:
 Создаем вспомогательный объект, - box и, с помощью Normal Align, выравниваем по плоскости:


Осталось только привязать все чертежи к вспомогательному боксу и сбросить ему вращение на 0:



Наслаждаемся результатом и продожаем работать)

пятница, 6 ноября 2015 г.

Возможности float script


-----------------------------------------------------------------
delete objects
b = box height:0.5 length:5 width:5
for i = 0 to 30 do(
    for j = 0 to 30 do(
        instance b pos: [b.length*i, b.length*j, 0]
        )
    )
s = sphere radius:5 name:"ms" pos:[-10,-10,0] wirecolor:red

for i in $box* do(
        i.rotation.controller.X_Rotation.controller = float_script ()
        i.rotation.controller.X_Rotation.controller.script =     "dependsOn $ms.transform.controller\n" +
                                            "dependsOn $"+i.name+".transform.controller\n"+
                                            "p1 = $ms.transform.controller.Position\n" +
                                            "p2 = $"+i.name+".transform.controller.Position\n" +
                                            "if (length (p1 - p2)) < 50 then degtorad ((length (p1 - p2))*3.6) else degtorad 180"
    )           
for i in $box* do(
        i.visibility = bezier_float()
        i.visibility.controller = float_script ()
        i.visibility.controller.script =     "dependsOn $ms.transform.controller\n" +
                                            "dependsOn $"+i.name+".transform.controller\n"+
                                            "p1 = $ms.transform.controller.Position\n" +
                                            "p2 = $"+i.name+".transform.controller.Position\n" +
                                            "if (length (p1 - p2)) < 100 then ((length (p1 - p2))/100.0) else 1"
    )   
   
   
/*    --return
for i in $box* do(
    i.visibility.controller = bezier_float()
    i.rotation.controller.X_Rotation.controller = bezier_float()
    )        
-----------------------------------------------------------------

Если немного доработать код, то можно поменять ось вращения зависимых объектов следующим образом:
--------------------------------------------------------------------
for i in $box* do(
        i.rotation.controller = rotation_script ()
        i.rotation.controller.script =     "dependsOn $ms.transform.controller\n" +
                                            "dependsOn $"+i.name+".transform.controller\n"+
                                            "p1 = $ms.transform.controller.Position\n" +
                                            "p2 = $"+i.name+".transform.controller.Position\n" +
    "dirVec = normalize(p1-p2)\n"+
    "rotax = cross dirVec [0, 0, 1]\n"+
    "quat (720.0/(length (p1 - p2))) rotax"
    --"if (length (p1 - p2)) < 50 then (quat (720.0/(length (p1 - p2))/3.6) rotax) else (quat 0 0 0 1)"
    )    

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