2012-01-27 3 views
6

Я пытаюсь выяснить, есть ли способ изменить угол обзора в блендере с помощью Python. Мне хотелось бы получить результат от нажатия 1, 3 или 7 на num. подушечка.Изменить угол обзора в блендере с помощью Python

Спасибо за любую помощь

+0

Какую версию Blender? – Blender

+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

+0

см. Также http://blender.stackexchange.com/a/678/2762 –

ответ

6

Прежде всего, обратите внимание, что вы можете иметь несколько 3D просмотра открытых одновременно, и каждый из них может иметь свой собственный угол видового экрана, перспективы/настройки орто и т.д. Таким образом, ваш скрипт должен будет найдите все 3D-представления, которые могут присутствовать (что может быть не так), и решите, какие из них повлияют.

Начинается с объекта bpy.data, который имеет атрибут window_managers. У этой коллекции всегда есть только один элемент. Однако может быть один или несколько открытых windows. Каждое окно имеет screen, который разделен на один или несколько areas. Поэтому вам нужно выполнить поиск по всем областям для одного с пробелом type из «VIEW_3D». А затем пройдите через 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 
Смежные вопросы