본문 바로가기
프로그래밍/파이썬

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

by 훨훨날아 2021. 5. 20.

블렌더에서 코딩을 통해서 물체를 만들고 블렌더의 물리엔진을 이용해서 자유낙하 시뮬레이션을 만들었다. 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

 

반응형