brunch

You can make anything
by writing

C.S.Lewis

by 배로만쌤 Mar 30. 2020

3. 그래픽 좌표 개념 이해하기

오픈 소스 3D 그래픽 도구 블렌더 Python으로 알아가는 수학의 맛

지난 번에는 #파이썬 편집기에 대한 기본을 살펴보았습니다. 이번에는 파이썬 그래픽 모듈과 함께  그래픽 #좌표계를 살펴보겠습니다.


우선 좌표를 통해 큐브가 어떻게 이동하는지를 살펴보면 다음과 같습니다.


객체의 좌표의 이동이나 회전, 확대는 모두 Transform이라는 탭에서 동작합니다.


이러한 동작을 Location, Rotation, Scale라는 동작으로 우측 하단의 속성창에서 6번째 아이콘을 클릭하면 다음 이미지와 같습니다.


블렌더 Transform 속성창


위 속성창에서 우선 Location X의 값을 1부터 10까지 변경해보시면 cube가 X축으로 이동하는 것을 볼 수 있습니다. Y값과 Z값을 변경하면 Cube의 중심 좌표가 바뀌게 됩니다.


bpy.context.object.location[0] = 1 # X축 (1,0,0) 이동

bpy.context.object.location[1] = 1 # Y축 (1,1,0) 이동

bpy.context.object.location[2] = 1 # Z축 (1,1,1) 이동


세개의 명령을 스크립트창에서 수행하면 좌표값이 (1,1,1)의 위치로 이동하게 됩니다.


bpy.context.object.location[0] = -1 # X축 (-1,1,1) 이동

bpy.context.object.location[1] = -1 # Y축 (-1,-1,1) 이동

bpy.context.object.location[2] = -1 # Z축 (-1,-1,-1) 이동


연속으로 위의 명령을 입력하면 (-1,-1,-1)의 위치로 좌표를 이동하게 됩니다.


이를 통해 좌표계의 이동에 대한 이해가 되었을 것이라 생각이 됩니다.


블렌더 2.8에는 좌표축이 다른 3D모델링 프로그램과 약간 다른데 좌표계가 아래 이미지와 같으니 이전 버전 소스나 다른 그래픽 프로그램의 소스나 강좌를 참고할 때 이 좌표계의 다름을 꼭 확인고하시기 바랍니다.


블렌더 좌표계 설명 이미지


위의 이미지에서 보는 바와 같이 좌표값의 음과 양의 값에 따라 변동이 있으니 참고하시기 바랍니다.


이번에는 회전에 대해 알아보겠습니다.


Rotation X의 값을 90도로 입력하면 다음과 같은 스크립트가 생성됩니다.


bpy.context.object.rotation_euler[0] = 1.5708


위의 그림과 같이 90도=1.5708라디언입니다.


따라서 이를 파이썬 수학 함수를 이용해 확인한다면 다음과 같이 프로그램하면 확인가능합니다.


import math

print math.radians(90)

print math.degrees(1.57)


블렌더를 명령어 창에서 실행하면 윈도우내의 콘솔화면에서 결과값을 확인할 수 있습니다. 현재로는 블렌더 내부에서 Print 출력을 볼 수 있는 방법은 없는 걸로 확인됩니다.


다음과 같이 명령창에서 블렌더를 시작하고 명령창에서 print출력 결과를 확인 할 수 있습니다.


맥OS에서는 다음과 같이 실행할 수 있습니다. 

$ /Applications/Blender.app/Contents/MacOS/Blender


윈도우는 다음과 같이 실행하면 됩니다.

> "c:\Program Files\Blender Foundation\Blender 2.81\blender.exe"


다음은 큐브를 확대하는 스케일링을 확인하면,


Scale X의 값을 2로 하면 크기가 X축으로 크기가 2가 되는 2m*1m*1m의 크기가 되는 직사각형 cube가 되는 것을 확인할 수 있습니다.


bpy.context.object.scale[0] = 2


위와 같은 스크립트가 생성되고,

이를 각각 아래와 같은 스크립트를 추가 입력하면 큐브는 2m*2m*2m의 크기로 확대됩니다.


#bpy.context.object.scale[0] = 2

bpy.context.object.scale[1] = 2

bpy.context.object.scale[2] = 2


이상과 같이 좌표계를 이해하기 위한 기본 명령들을 살펴보았습니다.

이를 응용한 소스는 다음과 같이 입력합니다.


1 import bpy

2

3 number = 5

4 counter = 0

5

for a in range(0,number):

7      counter += 2

8      bpy.ops.mesh.primitive_cube_add(size=1, enter_editmode=Falselocation=(counter, 00))


위와 같이 입력하고 실행하면 다음과 같이 이미지가 생성되는 것을 알 수 있습니다.


그림1. 5개 큐브 출력


본 내용은 초보자를 위한 것이기에 파이썬 기본을 설명합니다.


우선 파이썬은 변수의 타입을 선언하지 않아도 값을 대입하면 자동으로 변수의 형이 결정되는 것이 다른 언어와 다릅니다. 따라서 counter과 number 변수는 자동으로 정수형 변수가  됩니다.


그리고 for 문도 시작문에서 문장끝에 :(콜론)으로 구분해주고 for문의 범위는 다음문장에서 인텐트(탭 여백)을 주면 for문내에 위치한 문장들로 위에서는 7,8번이 for문내에 있는 것입니다. 만약  인텐트가 없다면 for문이 자동 종료됩니다. 

다른 언어들은 보통 {}대괄호로 감싸거나 시작과 끝이라는 표시를 해서 for문의 범위를 잡지만 파이썬은 인텐트로써 구분합니다.


그리고 for문을 동작하는 방식은 6번 문장은 a값이 0부터 시작하여 number-1까지 변화됩니다. 따라서 5번의 루프를 도는 것입니다.


값의 변화를 counter 값과 비교하자면,


시작전, counter = 0

A = 0, counter = 2

A = 1, counter = 4

A = 2, counter = 6

A = 3, counter = 8

A = 4, counter = 10


이렇게 값이 변하게 됩니다.


마지막으로 몇가지 프로그램 과제를 제시하겠습니다.


문제1. 위의 그림1.에서 4각형이 가운데부터 시작하는 것이 아니라 (2,0,0)의 위치부터 생성됩니다. 이를 (0,0,0)을 기준으로 아래와 같이 생성되게 5개의 cube를 재배치해 보세요.


문제2. 한줄로 cube를 정렬했다면 이번에는 아래 이미지와 같이 cube가 생성되도록 만들어 보세요.

(힌트: for문을 두개 사용하세요)


문제3. 마지막으로 크기가 2m인 cube가 생성되어 사이 공간이 없이 합쳐진 거대한 cube조합을 아래와 같은 이미지로 만들어 보세요.


이상과 같이 본격적으로 블렌더 파이썬의 재미를 본격적으로 시작하게 된 듯합니다. 다음부터는 어려운 3D그래픽 용어를 정리해야 하므로 연재가 조금 지연될 수 있습니다. 


보다 재미있게 활용하고 즐길 수 있는 코딩을 위해 격려를 부탁드리며 글을 마칩니다.

감사합니다.


배로만쌤

“배푸와 로봇 만드는 선생님"

네이버 블로그: http://blog.naver.com/iyangim






작가의 이전글 2. 블렌더 파이썬 환경 익히기
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari