blender的自定义导出脚本

时间:2016-02-13 03:17:22

标签: python-3.x blender

我正在尝试编写一个自定义脚本来导出场景中的对象及其旋转中心。这是我的算法看起来像旋转中心的样子: 1-使用其名称选择对象然后调用 2-将光标捕捉到对象(中心) 3-获取鼠标坐标 4-写入鼠标坐标

import bpy

sce = bpy.context.scene
ob_list = sce.objects

path = 'C:\\Users\\bestc\\Dropbox\\NetBeansProjects\\MoonlightWanderer\\res\\Character\\player.dat'

# Now copy the coordinate of the mouse as center of rotation
try:
    outfile = open(path, 'w')
    for ob in ob_list:
        if ob.name != "Camera" and ob.name != "Lamp":
            ob.select = True
            bpy.ops.view3d.snap_cursor_to_selected()

            mouseX, mouseY, mouseZ = bpy.ops.view3d.cursor_location
            # write object name, coords, center of rotation and rotation followed by a newline
            outfile.write( "%s\n" % (ob.name))

            x, y, z = ob.location # unpack the ob.loc tuple for printing
            x2, y2, z2 = ob.rotation_euler # unpack the ob.rot tuple for printing
            outfile.write( "%f %f %f %f %f\n" % (y, z, mouseY, mouseZ, y2) )

    #outfile.close()

except Exception as e:
    print ("Oh no! something went wrong:", e)

else:
    if outfile: outfile.close()
    print("done writing")`enter code here`

显然问题是第2步和第3步,但我无法弄清楚如何将光标捕捉到对象并获得光标坐标。

1 个答案:

答案 0 :(得分:0)

当您从blenders文本编辑器运行脚本时,当您尝试运行大多数运算符时会出现上下文错误,但是可以在不使用运算符的情况下检索所需的信息。

如果您想要3DCursor位置,可以在scene.cursor_location

中找到它

如果您已将光标捕捉到该对象,则光标位置将等于对象位置,该位置位于object.location,因为捕捉光标将使光标给出您可以使用的相同值对象位置,而不必将光标捕捉到它。您正在编写的代码(如果它正在工作)是将光标捕捉到所选对象,将其定位在所有选定对象之间的中间点。当您遍历对象时,您正在选择每个对象,但是您不会取消选择它们,因此每次迭代都会在选择中添加另一个对象,每次将光标偏移到不同的位置,但仅限于第一个对象的位置,如果在开始时未选择所有对象。

对象旋转以弧度形式存储,因此您可能需要import math并使用math.degrees()

此外,由于对象可以有任何名称,因此您应该更准确地测试对象类型以选择要导出的内容。

for ob in ob_list:
    if ob.type != "CAMERA" and ob.type != "LAMP":

        mouseX, mouseY, mouseZ = sce.cursor_location
        # write object name, coords, center of rotation and rotation followed by a newline
        outfile.write( "%s\n" % (ob.name))

        x, y, z = ob.location # unpack the ob.loc tuple for printing
        x2, y2, z2 = ob.rotation_euler # unpack the ob.rot tuple for printing
        outfile.write( "%f %f %f %f %f\n" % (y, z, mouseY, mouseZ, y2) )