【问题标题】:Change viewport angle in blender using Python使用 Python 在搅拌机中更改视口角度
【发布时间】:2012-02-20 03:40:38
【问题描述】:

我正在尝试找出是否有一种方法可以使用 Python 更改搅拌机中的视口角度。 我想要一个结果,就像你在数字上按 1、3 或 7 一样。垫。

感谢您的帮助

【问题讨论】:

标签: python blender


【解决方案1】:

首先,请注意您可以同时打开多个 3D 视图,并且每个视图都可以有自己的视口角度、透视/正交设置等。因此您的脚本必须查找所有可能存在的 3D 视图(可能没有)并决定它会影响哪些。

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

明白了吗? :)

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2020-01-06
      • 2011-08-11
      • 2012-08-07
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      • 2020-10-15
      • 2017-12-06
      • 2018-08-06
      相关资源
      最近更新 更多