Oto cały kod potrzebny do stworzenia powyższej animacji:
import bpy |
bpy.ops.mesh.primitive_plane_add(radius=100, location=(0, 0, 0)) # tworzenie płaszczyzny |
bpy.ops.rigidbody.object_add() |
bpy.context.object.rigid_body.type = 'PASSIVE' |
for x in range(1,19): # tworzenie torusów |
bpy.ops.mesh.primitive_torus_add(location=(0, x*4.3, 110), rotation=(0,1.5708*(x%2), 0), major_radius=3.5, minor_radius=.5, abso_major_rad=1.25, abso_minor_rad=0.75) |
bpy.ops.rigidbody.object_add() |
bpy.context.object.rigid_body.collision_shape = 'MESH' |
if x==1: |
bpy.context.object.rigid_body.enabled = False |
for z in range (0,9): # create Cubes |
bpy.ops.mesh.primitive_cube_add(radius=3, location=(x*6-60,2,2.8+z*6)) |
bpy.ops.rigidbody.object_add() |
bpy.context.object.rigid_body.mass = 0.0001 |
Będziemy potrzebować trzech zestawów Ciał Sztywnych (kiedy włączysz atrybut Ciała Sztywnego dla obiektu w Blenderze, program będzie symulował kolizje z innymi Ciałami Sztywnymi):
1. Płaszczyzna
Linia kodu [1] tworzy prostą Płaszczynę, na której będą stały Sześciany. Aby nie spadała ona w dół pod wpływem grawitacji, zmienimy ją na Pasywną [3].
2. Torusy
Pętla x [4-9] tworzy łańuch stworzony z 18 torusów, które uderzą w klocki:
[5] określa współrzędne i obraca co drugi torus o 90 stopni względem osi Y. Obrót osiągnięty jest przez pomnożenie 90 stopni (1.5708 radianów) przez resztę z dzielenia x przez 2 (to brudny trick, by uzyskać sekwencję "0-1-0-1-0-...".
[7] ustala kształt kolizji jako "siatka" (Mesh). Gdybyśmy pozostali przy domyślnym 'Convex Hull', Blender nie brałby pod uwagę otworów w środku i nasz łańcuch by się rozpadł.
[8-9] ustawia atrybut 'Uaktywniony' (Enabled) pierwszego torusa na "fałsz", by grawitacja nie ściągnęła go w dół. Dzięki temu będzie wisiał w powietrzu trzymając wszystkie pozostałe ogniwa łańcucha.
3. Sześciany
W liniach [10-14] tworzymy kolumnę dziesięciu Sześcianów i zmieniamy ich wagę na bardzo niewielką, aby daleko leciały po uderzeniu.
Ponieważ pętla z [10] jest zagnieżdżona wewnątrz pętli x [4], otrzymujemy mur z 18 rzędów i 10 kolumn.
To wszystko! Po kliknięciu 'Play' na pasku czasu, nasz łańcuch spada, uderza w klocki i wyrzuca je w powietrze!
Teraz powiększmy nieco ostatni torus, by wyglądał bardziej jak prawdziwa kula do wyburzania - zamiast rozbijania muru samym łańcuchem. Przy okazji obróćmy nieco łańcuch, by uderzył w mur pod kątem, powodując efektowniejszą kolizję. Zamień linię [5] na:
bpy.ops.mesh.primitive_torus_add(location=(x*2, x*4.3, 110), rotation=(0,1.5708*(x%2), 0), major_radius=3.5+1*(x==18), minor_radius=.5+1*(x==18), abso_major_rad=1.25, abso_minor_rad=0.75) |
Kliknij tutaj, by ściągnąć plik .blend, który zawiera nasz program
Gotowi na zburzenie czegoś innego niż mur? Rozwalmy tego dziwoląga:
Zamień linie [10-14] na następujący kod:
for z in range(1,10): |
bpy.ops.mesh.primitive_cube_add(radius=3, location=(z*6-60,0,x*6-3)) |
bpy.ops.transform.resize(value=(1, .5+10*math.cos(x/3.14)*math.sin(z/3.14),1), constraint_axis=(False, True, False)) |
bpy.ops.rigidbody.object_add() |
bpy.context.object.rigid_body.mass=0.0001 |
i dodaj poniższą linię na samym początku kodu, byśmy mogli używać funkcji trygonometrycznych sin i cos:
Miłego burzenia!