blender를 실행시키면 가장 먼저 나오는 화면인 viewport에서의 시점을 변경하는 법(pan, oribit 기능)을 python script로 어떻게 구현할 수 있을지 알아보자.
1) target 지점 변경: pan
현재 viewport view location이 (0, 0, 0)으로 세팅되어있다. 이 경우에는 viewport가 원점을 바라보게 된다.
이 값(viewport에서 바라보는 지점)을 변경하기 위해선 다음과 같은 코드를 사용하면 된다.
# 현재 활성화된 3d viewport를 찾기
for area in bpy.context.screen.areas:
if area.type == 'VIEW_3D':
break
# 3d viewport의 정보 가져오기
space_data = area.spaces.active
rv3d = space_data.region_3d
이렇게 3d viewport의 정보까지 가져왔으면 rv3d에 접근해서 target location을 수정할 수 있다.
위의 그림에서의 상태에서 rv3d의 view location을 출력해보면,
>>> rv3d.view_location
Vector((0.0, 0.0, 0.0))
예상대로 Vector((0., 0., 0.))이 출력된다. 만약 여기서 내가 아래와 같은 코드를 실행시켰다고 하자.
>>> rv3d.view_location = (2., 0., 0.)
이렇게 되면 viewport에서 바라보는 지점이 (0., 0., 0.)에서 (2., 0., 0.)으로 이동하게 되며 화면은 다음과 같이 변경된다.
이와 같이 rv3d를 세팅한 다음 view_location 값에 접근하여 값을 수정하는 방식으로 viewport의 target location을 변경할 수 있다.
2) target 지점 기준으로 회전: oribit
세팅된 target 지점을 기준으로 회전을 하는 oribit 기능도 python 코드를 통해 구현할 수 있다. 이 기능 역시 1)에서 세팅한 rv3d의 view_rotation에 접근하여 값을 수정하는 방식으로 사용하면 된다.
rv3d.view_rotation = Quaternion((1, 0, 0, 0))
위와 같이 세팅하였을 때 화면의 모습은 다음과 같다. 회전을 0으로 주면 바로 위에서 바라보는 모습으로 화면이 변경된다.
물체가 잘 보이지 않으므로 x축을 기준으로 45도 회전시켜 바라보자. 이는 아래와 같은 코드로 구현 가능하다.
rv3d.view_rotation = Euler((math.radians(45), 0.0, 0.0)).to_quaternion()
주의 해야할 부분은 회전 단위가 radian으로 들어가므로 degree 값인 경우 radian으로 변환해서 넣어줘야한다는 점과, rv3d의 view_rotation은 quaternion 값을 저장하므로, 다른 format의 회전인 경우 위와 같이 quaternion으로 변환을 시켜서 넣어줘야한다는 점이다.
위의 코드를 돌리게 되면 화면이 다음과 같은 모습으로 변경된다.
만약 물체를 정면에서 바라보고 싶다면 어떻게 하면 될까? 회전이 0인 상태에서 x축을 기준으로 90도 만큼 회전하면 된다. 즉, 아래의 코드를 돌리면 된다.
rv3d.view_rotation = Euler((math.radians(90), 0.0, 0.0)).to_quaternion()
위의 코드를 돌리게 되면 화면이 아래와 같은 모습으로 변하게 된다.
이와 같이 rv3d를 세팅한 다음 view_rotation 값에 접근하여 알맞은 quaternion 회전값을 세팅하는 방식으로, target location을 바라보는 방향을 수정할 수 있다.
'연구 > Blender' 카테고리의 다른 글
[Blender] blender에서 skeleton joint orientation 구하기 (0) | 2024.02.16 |
---|---|
[Blender] blender에서 skeleton bone position 구하기 (0) | 2024.01.29 |
[Blender] Python script로 음악 재생 및 현재 재생 시점 알아내기 (0) | 2023.10.04 |
blender에서 keyframe들 scaling 시키기 (Timeline 창, 코드 이용) (0) | 2023.07.18 |
blender bvh load 관련 알아낸 사실 정리 (2) (0) | 2023.04.18 |