프로그래밍/파이썬

블렌더에서 파이썬으로 자유낙하 시뮬레이션하기

훨훨날아 2021. 5. 20. 00:36

블렌더에서 코딩을 통해서 물체를 만들고 블렌더의 물리엔진을 이용해서 자유낙하 시뮬레이션을 만들었다. for 조건문을 통해서 작은 큐브들이 반복해서 만들어지고 물리엔진의 조건들이 적용된다. 

import bpy

number = 3
counter = 0
for a in range(0, number+25):
    counter += 2
    counter2 = 0
    for b in range(0, number):
        counter2 +=2 
        counter3 = 0
        for c in range(0, number):
            bpy.ops.mesh.primitive_cube_add(size=2, location=(counter3+2, counter2-2, counter-2))
            counter3 +=2
            bpy.ops.rigidbody.object_add()
            bpy.context.object.rigid_body.collision_shape = 'BOX'
            bpy.context.object.rigid_body.use_margin = True
            bpy.context.object.rigid_body.collision_margin = 0
            bpy.context.object.rigid_body.linear_damping = 0.35
            bpy.context.object.rigid_body.angular_damping = 0.6
            bpy.context.object.rigid_body.mass = 20

 

윈도우 설정에서 console info. 를 열면 물체를 넣거나 할때 적용되는 코드가 생성된다. 이것을 text editor에 복사해서 넣으면 같은 명령어가 실행되기 때문에 bpy에 대한 코드를 다 알지 못해도 명령어를 만들 수 있다.

왼쪽 모델링화면, 가운데 텍스트에디터, 오른쪽 console info.

 

물리엔진은 physics properties 에서 physic를 선택하고 값을 입력하면된다.

여러 물체에 material 효과를 한번에 적용하기 위해서는 원하는 물체를 모두 선택하고 특성값을 적용하고 왼쪽위 object - make links - materials을 누르면 선택한 모든물체에 material이 적용된다.

오른쪽 scene properties - rigid body world 에서 물리엔진이 적용되는 프레임숫자와 cache 에서 모든 프레임을 bake하면 물리엔진이 적용된 것을 확인 할 수 있다.

텍스트 에디터를 실행했을 때 오류가 생길 수 있는데 시스템 콘솔을 확인하라고 한다. 시스템 콘솔은 블렌더 처음 시작할때 나오는 콘솔이고 메뉴의 window - toggle system console에서 어떤 오류가 생겼는지 확인할 수 있다. 

 

https://youtu.be/0vhvApTBYUA

댓글에 좌표값을 설정하는 방법에 대한 조언이 있었다. x와 y값을 z 반복문 뒷쪽에 넣어서 기존 z 값에서 -2를 해주지 않아 좀 더 쉽게 이해할 수 있게 만들었다.

import bpy

number_of_cubes = 7
x_pos = 0
y_pos = 0
z_pos = 0
for i in range(number_of_cubes):
    y_pos = 0
    for j in range(number_of_cubes):
        z_pos = 0
        for k in range(number_of_cubes):    
             
            bpy.ops.mesh.primitive_cube_add(enter_editmode=False,
                                             location=(z_pos, y_pos, x_pos))
            z_pos += 2
            
            bpy.ops.rigidbody.object_add()
            bpy.context.object.rigid_body.collision_shape = 'BOX'
            bpy.context.object.rigid_body.use_margin = True
            bpy.context.object.rigid_body.collision_margin = 0
            bpy.context.object.rigid_body.linear_damping = 0.35
            bpy.context.object.rigid_body.angular_damping = 0.6
            bpy.context.object.rigid_body.mass = 20
        
        y_pos+=2 
    
    x_pos+=2

 

렌더링중

 

 

 

참고

https://youtu.be/KI0tjZUkb5A

 

반응형