2012-01-27 48 views
6

我想知道是否有方法在使用Python的搅拌机中更改视口角度。 我想要得到一个结果,就像你在num上按1,3或7所得到的那样。垫。使用Python更改搅拌机中的视口角度

感谢您的帮助

+0

搅拌机的哪个版本? – Blender 2012-01-27 03:12:41

+0

['bpy.ops.view3d.viewnumpad'](http://www.blender.org/documentation/blender_python_api_2_69_0/bpy.ops.view3d.html?highlight=numpad#bpy.ops.view3d.viewnumpad)? – gandalf3 2013-10-21 01:50:58

+0

另请参阅http://blender.stackexchange.com/a/678/2762 – 2014-03-12 13:48:33

回答

6

首先,请注意,您可以打开多个3D视图一次,每个人都可以有自己的视的角度,透视/邻设置等,所以你的脚本将有寻找所有可能存在的3D视图(可能不存在)并决定它将影响哪一个视图。

bpy.data对象开始,该对象具有window_managers属性。这个集合似乎总是只有一个元素。但是,可能会有一个或多个开放的windows。每个窗口有一个screen,分为一个或多个areas。因此,您需要搜索“VIEW_3D”空间为type的所有区域。然后通过该区域的spaces寻找类型为“VIEW_3D”的那一个。这样的空间将是子类SpaceView3D。这将有一个region_3d属性类型RegionView3D。最后,这个对象又具有一个名为view_matrix的属性,它取值为您可以获取或设置的类型Matrix

明白了吗? :)

4

一旦你找到正确的“视图”,您可以修改:

view.spaces[0].region_3d.view_matrix 
view.spaces[0].region_3d.view_rotation 

注意,region_3d.view_location是“look_at”目标,相机的不是位置;你必须直接修改view_matrix,如果你想移动摄像头的位置(据我所知),但你可以很容易地使用view_rotation巧妙地调整旋转角度。你可能需要阅读这虽然产生一个有效的四元数:http://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation

也许这样的事情可能是有用的:

class Utils(object): 

    def __init__(self, context): 
    self.context = context 

    @property 
    def views(self): 
    """ Returns the set of 3D views. 
    """ 
    rtn = [] 
    for a in self.context.window.screen.areas: 
     if a.type == 'VIEW_3D': 
     rtn.append(a) 
    return rtn 

    def camera(self, view): 
    """ Return position, rotation data about a given view for the first space attached to it """ 
    look_at = view.spaces[0].region_3d.view_location 
    matrix = view.spaces[0].region_3d.view_matrix 
    camera_pos = self.camera_position(matrix) 
    rotation = view.spaces[0].region_3d.view_rotation 
    return look_at, camera_pos, rotation 

    def camera_position(self, matrix): 
    """ From 4x4 matrix, calculate camera location """ 
    t = (matrix[0][3], matrix[1][3], matrix[2][3]) 
    r = (
     (matrix[0][0], matrix[0][1], matrix[0][2]), 
     (matrix[1][0], matrix[1][1], matrix[1][2]), 
     (matrix[2][0], matrix[2][1], matrix[2][2]) 
    ) 
    rp = (
     (-r[0][0], -r[1][0], -r[2][0]), 
     (-r[0][1], -r[1][1], -r[2][1]), 
     (-r[0][2], -r[1][2], -r[2][2]) 
    ) 
    output = (
     rp[0][0] * t[0] + rp[0][1] * t[1] + rp[0][2] * t[2], 
     rp[1][0] * t[0] + rp[1][1] * t[1] + rp[1][2] * t[2], 
     rp[2][0] * t[0] + rp[2][1] * t[1] + rp[2][2] * t[2], 
    ) 
    return output