Wyburzanie muru kulą - samouczek Python w Blender 3d



Oto cały kod potrzebny do stworzenia powyższej animacji:

import bpy
bpy.ops.mesh.primitive_plane_add(radius=100location=(000)) # 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=(0x*4.3110), rotation=(0,1.5708*(x%2), 0), major_radius=3.5minor_radius=.5abso_major_rad=1.25abso_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=3location=(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*2x*4.3110), rotation=(0,1.5708*(x%2), 0), major_radius=3.5+1*(x==18), minor_radius=.5+1*(x==18), abso_major_rad=1.25abso_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:

10
11
12
13
14
    for z in range(1,10):
        bpy.ops.mesh.primitive_cube_add(radius=3location=(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=(FalseTrueFalse))
        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:

import math


Miłego burzenia!


Inne poradniki:

Efekt domino - 10 linii kodu


Fraktale w JavaScript - tylko 25 linii kodu