Как повернуть камеру вокруг содержимого файла obj wavefront? - PullRequest
0 голосов
/ 23 мая 2018

У меня есть файл .obj.Я не знаю, это содержимое ограничивающее поле перед рукой.Я хочу загрузить его в блендер и повернуть камеру вокруг него в «K» -ые кадры (например, 15 кадров).Как это сделать в блендере с помощью Python API?

1 Ответ

0 голосов
/ 24 мая 2018

Обычный способ сделать объектный оборот - добавить пустое и сделать его родителем камеры, анимируя Z-вращение пустого, затем поверните камеру вокруг объекта, вы можете дать камере ограничение tracktoтак что камера всегда указывает на целевой объект.

Вы можете использовать объекты bound_box, чтобы найти его внешние пределы, затем добавить еще немного, чтобы объект оставался внутри вида ипоместите камеру с этим.Создание дополнительного расстояния, пропорционального размеру объекта, должно работать для большинства объектов.

Аддон, который я сделал для этот ответ показывает, как создать ограничивающий прямоугольник вокруг нескольких объектов, что может быть полезно, еслиу вас есть несколько объектов одновременно.

Для этого в Python -

import bpy
scn = bpy.context.scene

bpy.ops.import_scene.obj(filepath='obj1.obj')
target = bpy.context.selected_objects[0]
scn.objects.active = target
# centring the origin gives a better bounding box and rotation point
bpy.ops.object.origin_set(type='ORIGIN_GEOMETRY')

cam_x_pos = max([v[0] for v in target.bound_box]) * 2.5
cam_y_pos = max([v[1] for v in target.bound_box]) * 2.5
cam_z_pos = max([v[2] for v in target.bound_box]) * 2.5

rot_centre = bpy.data.objects.new('rot_centre', None)
scn.objects.link(rot_centre)
rot_centre.location = target.location

camera = bpy.data.objects.new('camera', bpy.data.cameras.new('camera'))
scn.objects.link(camera)
camera.location = (cam_x_pos, cam_y_pos, cam_z_pos)
camera.parent = rot_centre
m = camera.constraints.new('TRACK_TO')
m.target = target
m.track_axis = 'TRACK_NEGATIVE_Z'
m.up_axis = 'UP_Y'

rot_centre.rotation_euler.z = 0.0
rot_centre.keyframe_insert('rotation_euler', index=2, frame=1)
rot_centre.rotation_euler.z = radians(360.0)
rot_centre.keyframe_insert('rotation_euler', index=2, frame=101)
# set linear interpolation for constant rotation speed
for c in rot_centre.animation_data.action.fcurves:
    for k in c.keyframe_points:
        k.interpolation = 'LINEAR'
scn.frame_end = 100
...