使用Python在Blender中改变视口角度

8 投票
2 回答
7498 浏览
提问于 2025-04-17 11:12

我想知道有没有办法用Python在Blender中改变视角。我希望能得到的效果就像在数字键盘上按1、3或7那样。

谢谢大家的帮助!

2 个回答

8

一旦你找到了正确的“视图”,你可以进行一些修改:

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

需要注意的是,region_3d.view_location 是“注视点”,而不是相机的位置;如果你想移动相机的位置,必须直接修改视图矩阵(据我所知),但你可以很简单地通过 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
9

首先要知道,你可以同时打开多个3D视图,每个视图可以有自己的视角、透视或正交设置等等。所以你的脚本需要检查所有可能存在的3D视图(可能一个都没有),然后决定要影响哪个视图。

bpy.data对象开始,这个对象有一个叫window_managers的属性。这个集合通常只有一个元素。不过,可能会有一个或多个打开的windows。每个窗口都有一个screen,这个屏幕又被分成一个或多个areas。所以你需要在所有的区域中寻找一个类型为“VIEW_3D”的区域。然后再在这个区域的spaces中寻找类型为“VIEW_3D”的空间。这样的空间会是SpaceView3D的子类。这个空间有一个叫region_3d的属性,类型是RegionView3D。最后,这个对象还有一个叫view_matrix的属性,它的值是一个Matrix类型,你可以获取或设置这个值。

明白了吗? :)

撰写回答