본문 바로가기
블렌더

3D 블렌더 2.83 + 파이썬 스크립트 / 돌리고돌리고~ for 반복문

반응형

첫 게시글 보기 https://itadventure.tistory.com/319

 

3D 블렌더 2.83 + 파이썬 스크립트와의 만남

3D 블렌더 프로그램에는 파이썬 스크립트 엔진이 내장되어 있는데요. 관련 스크립트를 통해 재미난 것들을 할 수가 있지요. 앞으로 이걸로 어디까지 할 수 있을지 알아 보는 시간을 가져보도록 �

itadventure.tistory.com

 

지난 챕터에서는 파이썬 스크립트 레이아웃과 텍스트 편집기를 통하여 
파이썬 스크립트를 작성하고 간단히 실행하는 방법을 살펴보았습니다.

그리고 나서 스크립트를 하나 제시해드렸었는데요.
실행해 보셨나 모르겠습니다 :)

아래와 같은 스크립트인데요.

import bpy

bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete()

for x in range(0, 10):
    for y in range(0, 10):
        bpy.ops.mesh.primitive_cone_add(location=(x * 2, y * 2, 0))
        bpy.ops.object.modifier_add(type='SUBSURF')

실행해보시면 3D 뷰어 화면에 결과는 아래와 같을 겁니다.

 

화면을 좀 이동해서 보시면, 100개의 초코볼(?)이 나타난 것을 보실수 있지요.
화면이동 방법은 Shift + 마우스 클릭, 드래그입니다.

이제부터 하나씩 원리를 다루어보겠습니다.

먼저 파이썬 스크립트 입력을 준비해주세요.

블렌더를 시작하시고 스크립트 레이어를 선택

스크립트 창에서 새로운 버튼을 눌러 주세요.

그러면 스크립트 입력창이 등장합니다!

먼저 블렌더 파이썬 스크립트를 사용하려면 항상 아래 내용을 기본으로 적어 주셔야 합니다.

import bpy

그리고 나서 그 아래부터 코딩이 되는 것이지요.

오늘도 원뿔을 추가하는데 한단계 더 나아가 보겠습니다.

먼저 상자를 삭제(Delete)하고 Shift + A 키를 눌러 원뿔을 추가해보겠습니다.

그리고 오늘은 한단계 더 진행해보겠습니다.

우측의 모디파이어 아이콘 탭을 선택하신 다음

모디파이어를 추가 - 섭디비젼 표면 순으로 선택해 주세요.

원뿔의 경계가 둥글 둥글해졌습니다. 하나의 초코볼이군요.
경계 부분에 약간의 작업이 필요할 것 같지만 모델링 완성이 아닌 스크립트를 익히는 단계이니 넘어가도록 하지요.

이제 좌측 하단 정보 창에 금방 작업한 액션의 목록이 노출되는데 아래쪽 3개 항목을 집중해주세요.

첫번째는 원뿔을 추가하는 액션입니다. 앞에서부터 하나씩 면밀히 살펴보자면,

bpy.ops.mesh.primitive_cone_add(radius1=1, radius2=0, depth=2, enter_editmode=False, align='WORLD', location=(0, 0, 0))

bpy  블렌더 파이썬에 관련된 총칭이고 ops  오퍼레이터 ( Operators ) 의 약어입니다.

그 중에서도 bpy.ops.mesh  메쉬 오브젝트에 대한 유틸리티같은 것인지요.

primitive_cone_add 는 직역하면 '원형(primitive) 콘(cone) 추가(add)'입니다.

콘(원뿔)의 원형을 추가하는 명령어인데요. 
블렌더 파이썬에게 이 명령을 내리면 즉시 원뿔을 하나 추가합니다.

그런데 원뿔도 원뿔 나름대로의 개성이 있지 않겠습니까?

어떤 원뿔은 홀쭉하고 어떤 원뿔은 납작하고 어떤 원뿔은 거대할 수도 있겠지요.

뒤에 괄호 안에 따라붙는 것들은 이러한 원뿔 나름대로의 개성을 의미합니다.

각 항목들은 콤마로 구분되어 있는데요.

radius1=1, radius2=0, depth=2, enter_editmode=False, align='WORLD', location=(0, 0, 0)

첫번째 등장하는 radius1 파라미터는 원뿔의 반지름을 의미합니다.

radius1=1 이 의미는 
원뿔의 생성할 때 반지름을 1로 정해라~ 라는 의미입니다.

그러면 2번째 radius2=0 인데요. 원뿔에는 반지름2가 있습니다.

그래서 만일 이 값을 0.5로 주면 아래와 같은 원뿔을 만들게 됩니다.

원뿔이라기보다는 전등갓에 가깝지요.

depth 높이를 의미하고,

editmode 는 원뿔을 생성한 후 바로 편집모드로 진입하는 것을 의미합니다.

align  월드좌표 기준으로할지 로컬좌표 기준으로 할지를 결정하고

location  3차원 공간상의 x, y, z 좌표를 자유롭게 지정해주는 것이지요.

여기서 제일 흥미로운 것은 location 입니다.

3차원 공간 상의 좌표를 자유롭게 줄 수 있다면 원뿔로 탑을 쌓을 수도 있고 
큐브를 이용한다면 빌딩을 만들수도 있을 겁니다.

블렌더에서 이렇게 특정 액션을 취해준 다음에,
정보 창에서 그 파라미터를 분석해서 조금만 내용을 바꿔주면 바뀐 액션이 실행되는 것이지요.

2번째 줄의 명령어는 모디파이어 아이콘을 선택한 액션인데요.

파이썬 스크립트로는 아쉽게도 실행이 되지 않습니다.

bpy.context.space_data.context = 'MODIFIER'

하지만 위 명령은 그리 필요치 않습니다.

바로 3번째 줄의 명령어로 넘어가도 정상적으로 실행이 되기 떄문이지요.

bpy.ops.object.modifier_add(type='SUBSURF')

이 명령어는 원뿔에 섭디비전 모디파이어를 실행해줍니다.
SUBSURF 가 이를 의미합니다.

그래서 각진 부분들을 모두 둥글 둥글하게 만들어 주지요.
결국 아래와 같은 형태를 만들어 줍니다.

 

결국은 아래 2줄만 있으면 원뿔은 초코볼은 오케이!

bpy.ops.mesh.primitive_cone_add(radius1=1, radius2=0, depth=2, enter_editmode=False, align='WORLD', location=(0, 0, 0))
bpy.ops.object.modifier_add(type='SUBSURF')

이 내용은 첫번째 줄의 경우 일부 내용을 지워도 됩니다.

파라미터를 제공하지 않으면 메쉬를 생성할 때 기본값을 사용하게 되는데요.

위의 제공된 파라미터는 모두 기본값이기 때문에 location만 주면 됩니다.

bpy.ops.mesh.primitive_cone_add(location=(0, 0, 0))

이제 만들어진 원뿔을 삭제한 다음에,

파이썬 텍스트 편집기 창에 아래 내용을 넣어보세요.

import bpy

bpy.ops.mesh.primitive_cone_add(location=(0, 0, 0))
bpy.ops.object.modifier_add(type='SUBSURF')

그리고 스크립트를 실행하면 되는데요. 
화살표 버튼을 눌러주시거나 Alt+P 단축키를 눌러주시면 됩니다.

주의하실 점은 Alt+P 단축키 사용시에는 마우스가 반드시 텍스트 편집기 범위 안에 있어야 하는 점입니다.

이런 원뿔이 하나 만들어질 겁니다.

이번엔 location 값을 좀 바꿔보겠습니다.

(0, 0, 0) 대신 (2, 2, 0) 으로 바꿔 보도록 할까요?

그리고 원뿔을 삭제, 다시 스크립트를 실행하면 원뿔이 만들어진 위치가 좀 색다를 겁니다.

 

이번엔 원뿔을 2개 만들어 보도록 할까요?

원뿔을 만드는 코드를 한줄 더 추가해보도록 합시다.
아래 2줄을 추가한 다음에 또 다시 원뿔을 삭제하고 실행해주시면 되는데요.

bpy.ops.mesh.primitive_cone_add(location=(0, 2, 0))
bpy.ops.object.modifier_add(type='SUBSURF')

원뿔 삭제하는게 은근히 귀찮습니다.

자동으로 삭제하는 방법이 있을까요?

물론 있지요 :)

import bpy 아랫 부분에 이 2줄을 넣어줍니다.

bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete()

첫번째 줄은 모든 오브젝트를 선택하는 명령이고

두번째 줄을 선택된 오브젝트를 삭제하는 명령입니다.

 

그래서 깨끗이 비우고 실행하게 되는데요.

전체 스크립트는 아래와 같습니다.

import bpy

bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete()


bpy.ops.mesh.primitive_cone_add(location=(2, 2, 0))
bpy.ops.object.modifier_add(type='SUBSURF')

bpy.ops.mesh.primitive_cone_add(location=(0, 2, 0))
bpy.ops.object.modifier_add(type='SUBSURF')

이번엔 원뿔을 삭제하지 않으셔도 됩니다. 그냥 스크립트를 실행해주시면

이런 그림이 등장하지요.

만약 가로로 10개의 원뿔을 생겨나게 하려면 어떻게 해야 할까요?

그냥 이렇게 하셔도 됩니다. 10개를 스크립트로 일일히 추가해주는 것이지요.

import bpy

bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete()

bpy.ops.mesh.primitive_cone_add(location=(0, 2, 0))
bpy.ops.object.modifier_add(type='SUBSURF')

bpy.ops.mesh.primitive_cone_add(location=(2, 2, 0))
bpy.ops.object.modifier_add(type='SUBSURF')

bpy.ops.mesh.primitive_cone_add(location=(4, 2, 0))
bpy.ops.object.modifier_add(type='SUBSURF')

         :
         
bpy.ops.mesh.primitive_cone_add(location=(20, 2, 0))
bpy.ops.object.modifier_add(type='SUBSURF')

뭐 이런 방법도 나쁘진 않지만, 만일 100개를 추가하려면 꽤 양이 될겁니다. 
그래서 더 좋은 방법이 있습니다.

아래와 같은 소스를 살펴볼까요?

import bpy

bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete()

for x in range(0, 10):
    bpy.ops.mesh.primitive_cone_add(location=(x * 2, 2, 0))
    bpy.ops.object.modifier_add(type='SUBSURF')

 이 소스는 아래와 같은 결과물을 도출해 내는데요,

어떻게 된 원리일까요? 초코볼(?)이 10개 생겨났습니다.

우선 for 로 기재된 줄은, 반복이라고 생각해주시면 됩니다.

그래서 아래 문장은 x 라는 상자를 만들어 준다음 0~9까지의 숫자를 하나씩 대입해서

( 마지막은 10이 아니라 9입니다. 10이 되면 빠져 나오는 조건이라 생각하시면 됩니다. 요주의! )

for x in range(0, 10):

그 아랫 부분 2줄을 10번을 실행해 줍니다.

    bpy.ops.mesh.primitive_cone_add(location=(x * 2, 2, 0))
    bpy.ops.object.modifier_add(type='SUBSURF')

location 부분을 보면 ( x * 2, 2, 0 )으로 되어 있는데요.

x * 2 의 '*' 기호는 곱하기를 의미합니다. 수학의 'x'와 같은 의미이지요.

x가 0부터 9까지의 바뀌면서 10번을 실행하니까,

x * 2 값은 다음값으로 대응됩니다.

0, 2, 4, 6, 8, 10, 12, 14, 16, 18

그래서 각각 X축으로 거리가 2만큼 떨어진 초코볼을 만들어 내는 것이지요.

만일 가로 10개, 세로 10개의 초코볼을 만들려면

여기에 다시 한단계의 반복을 더 추가해 주면 됩니다.

소스는 아래와 같은데 for 문이 2개이고 두번의 들여쓰기가 되어 있지요?

반복루프 안에 반복루프가 있다고 해서 중첩루프라고도 부릅니다.

import bpy

bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete()

for x in range(0, 10):
    for y in range(0, 10):
        bpy.ops.mesh.primitive_cone_add(location=(x * 2, y * 2, 0))
        bpy.ops.object.modifier_add(type='SUBSURF')

100개의 초코볼을 만드는데 좀 시간이 걸리는데요.
X와 Y에 각각 0~9를 대입해서 총 100번을 실행해줍니다.

그러면 여기서 퀴즈!

만일 Z축 방향도 한 단계를 더 추가하려면 어떻게 할까요?

트리플 중첩 루프를 구성하면 되는데요.

무려 1000개를 만들어야 해서 시간이 꽤 걸립니다.

서브디비전은 너무 시간이 걸릴것 같아 뺐지요 :)

import bpy

bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete()

for x in range(0, 10):
    for y in range(0, 10):
        for z in range(0, 10):
            bpy.ops.mesh.primitive_cone_add(location=(x * 2, y * 2, z * 2))

결과 화면입니다.

 

아래는 이 결과물로 멋 좀 부려봤습니다 :)

 

오늘도 여기까지 읽어주셔서 감사합니다.

필요하신 분에게 도움이 되셨나 모르겠습니다.

 

독자님들 모두 건강, 기쁨 가득한 한 주간 되시길 소망합니다 :)


성경말씀을 마음에 담아두면 어려울 때 도움이 됩니다.

 

서로 돌아보아 사랑과 선행을 격려하며 
모이기를 폐하는 어떤 사람들의 습관과 같이 하지 말고 
오직 권하여 그날이 가까움을 볼수록 더욱 그리하자
 

-히브리서 10장 24,25절 말씀 -

다음 게시글로 이동https://itadventure.tistory.com/322

 

3D 블렌더 2.83 + 파이썬 스크립트 / 패널 UI 추가하기

첫 게시글 보기 : https://itadventure.tistory.com/319 3D 블렌더 2.83 + 파이썬 스크립트와의 만남 3D 블렌더 프로그램에는 파이썬 스크립트 엔진이 내장되어 있는데요. 관련 스크립트를 통해 재미난 것들�

itadventure.tistory.com

반응형