0

我正在尝试创建一个渲染对象 360 度旋转的脚本。我对搅拌机一点也不熟悉,但我一直在努力做到这一点。

我正在使用 Python 编写一个脚本,该脚本导入一个 STL 文件并创建它的 360 度渲染。我的问题是,移动相机时,相机不会在正确的平面上移动。

这是一张图片专辑,描述了我的意思:

http://imgur.com/a/FkVLp

我用来执行此操作的功能是:

def rotateCameraAroundOrigin(rx=0):
    cam = bpy.data.objects['Camera']
    old_x = cam.location.x
    old_y = cam.location.y
    old_z = cam.location.z
    radius = math.sqrt((math.pow(old_x,2) + math.pow(old_y,2)))
    current_angle = math.degrees(math.atan2( old_y, old_x))
    print("CUR:\t%+04d degrees" % (current_angle))
    new_angle = current_angle + rx
    print("FROM:\t%+04d, %+04d, %+04d" % (old_x,old_y,old_z))
    new_x = radius * math.cos(math.radians(new_angle))
    new_y = radius * math.sin(math.radians(new_angle))
    moveCamTo(new_x,new_y,old_z)
    print("TO:\t%+04d, %+04d, %+04d\n" % (new_x,new_y,old_z))

接着:

for i in range(1, 10):
    print("Rotation %01d" % (i))
    image = 'images/' + sys.argv[-1] + str(i) + '.' + filetype
    rotateCameraAroundOrigin(36)
    render_thumb(image,gl=False)

这会产生 imgur 专辑中显示的输出:

Rotation 1
CUR:    +000 degrees
FROM:   +302, +000, +000
TO:     +244, +177, +000

Rotation 2
CUR:    +035 degrees
FROM:   +244, +177, +000
TO:     +093, +287, +000

Rotation 3
CUR:    +071 degrees
FROM:   +093, +287, +000
TO:     -093, +287, +000

Rotation 4
CUR:    +107 degrees
FROM:   -093, +287, +000
TO:     -244, +177, +000

Rotation 5
CUR:    +143 degrees
FROM:   -244, +177, +000
TO:     -302, +000, +000

Rotation 6
CUR:    +179 degrees
FROM:   -302, +000, +000
TO:     -244, -177, +000

Rotation 7
CUR:    -144 degrees
FROM:   -244, -177, +000
TO:     -093, -287, +000

Rotation 8
CUR:    -108 degrees
FROM:   -093, -287, +000
TO:     +093, -287, +000

Rotation 9
CUR:    -072 degrees
FROM:   +093, -287, +000
TO:     +244, -177, +000

我不知所措。我的飞机倾斜了,但我不知道为什么。我想围绕物体平滑旋转。

谢谢你的帮助,

H

4

2 回答 2

2

为什么不在对象位置创建一个空对象。将相机作为父项。然后将旋转矩阵应用于空。养育将导致相机旋转通过所需的旋转弧。

这种方法要简单得多,主要用于速度建模,您希望相机查看整个对象的进度。

def parent_obj_to_camera(b_obj, b_camera):
    origin = (0,0,0) #can be replaced with b_obj.location
    b_empty = bpy.data.objects.new("Empty", None)
    b_empty.location = origin
    b_camera.parent = b_empty #setup parenting

    scn = bpy.context.scene
    scn.objects.link(b_empty)
    scn.objects.active = b_empty 
    b_empty.select = True

然后在那个 for 循环中,您将创建一个 Matrix 来旋转空

import mathutils
from math import radians


b_empty = bpy.context.scene.active_object
num_steps = 9
stepsize = 360/num_steps
for i in range(0, num_steps):
    mat_rot = mathutils.Matrix.Rotation(radians(step), 4, 'X')
    b_empty.matrix_local *= mat_rot 

    print("Rotation %01d" % (radians(stepsize)))
    image = 'images/' + sys.argv[-1] + str(i) + '.' + filetype
    render_thumb(image,gl=False)
于 2013-04-26T14:22:53.613 回答
0

我在@neomonkeus 的回答中遇到了一些问题。我对他的代码进行了以下更改,它对我有用。

mat_rot=mathutils.Matrix.Rotation(radians(stepsize*(i+1)), 4, 'X')
b_empty.matrix_world = mat_rot
bpy.context.scene.update() # VERY IMPORTANT

不要忘记更新场景。

于 2017-05-23T08:13:50.453 回答