2012-01-27 2 views
6

J'essaie de savoir s'il existe un moyen de modifier l'angle de la fenêtre dans Blender en utilisant Python. Je voudrais un résultat comme vous obtiendriez d'appuyer sur 1, 3 ou 7 sur le num. tampon.Modifier l'angle de la fenêtre d'affichage dans Blender en utilisant Python

Merci pour toute aide

+0

Quelle version de Blender? – Blender

+0

Qu'en est-il de ['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

voir aussi http://blender.stackexchange.com/a/678/2762 –

Répondre

6

D'abord, notez que vous pouvez avoir plusieurs vues 3D ouvert à la fois, et chacun peut avoir son propre angle de la fenêtre, perspective/paramètres ortho etc. Donc, votre script devra Recherchez toutes les vues 3D qui pourraient être présentes (ce qui pourrait ne pas être le cas) et décidez lesquelles seront affectées.

Commencez par l'objet bpy.data, qui a un attribut window_managers. Cette collection semble toujours avoir un seul élément. Cependant, il peut y avoir un ou plusieurs ouverts windows. Chaque fenêtre a un screen, qui est divisé en un ou plusieurs areas. Donc, vous devez rechercher à travers toutes les zones pour un avec un espace type de "VIEW_3D". Et puis traquez le spaces de cette zone pour celui (s) avec le type "VIEW_3D". Un tel espace sera de la sous-classe SpaceView3D. Cela aura un attribut region_3d de type RegionView3D. Et enfin, cet objet a à son tour un attribut appelé view_matrix, qui prend une valeur de type Matrix que vous pouvez obtenir ou définir.

Vous avez tout cela? :)

4

Une fois que vous avez trouvé la bonne « vue », vous pouvez modifier:

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

Notez que la region_3d.view_location est la cible « look_at », pas l'emplacement de la caméra; vous devez modifier la view_matrix directement si vous voulez déplacer la position de la caméra (pour autant que je sache), mais vous pouvez ajuster subtilement la rotation en utilisant view_rotation assez facilement. Vous aurez probablement besoin de lire pour générer un quaternion valide si: http://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation

Peut-être quelque chose comme cela peut être utile:

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 
Questions connexes