2012-01-27 7 views
6

Sto cercando di scoprire se c'è un modo per cambiare l'angolo della vista in blender usando Python. Vorrei un risultato come si otterrebbe premendo 1, 3 o 7 sul num. pad.Cambia l'angolo della vista in blender usando Python

Grazie per tutto l'aiuto

+0

Quale versione di Blender? – Blender

+0

Che dire di ['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

vedere anche http://blender.stackexchange.com/a/678/2762 –

risposta

6

Prima di tutto, si noti che è possibile avere più viste 3D aperte contemporaneamente, e ciascuno può avere il proprio angolo viewport, la prospettiva/impostazioni orto, ecc Quindi, lo script dovrà cercare tutte le viste 3D che potrebbero essere presenti (che potrebbero essere assenti) e decidere quale (i) interesserà.

Inizia con l'oggetto bpy.data, che ha un attributo window_managers. Questa collezione sembra avere sempre un solo elemento. Tuttavia, potrebbero esserci uno o più codici windows aperti. Ogni finestra ha un screen, che è diviso in uno o più areas. Quindi è necessario cercare attraverso tutte le aree per uno con uno spazio type di "VIEW_3D". E poi cacciare attraverso lo spaces di questa area per uno (i) con tipo "VIEW_3D". Tale spazio sarà della sottoclasse SpaceView3D. Questo avrà un attributo region_3d di tipo RegionView3D. Infine, questo oggetto ha a sua volta un attributo chiamato view_matrix, che accetta un valore di tipo Matrix che è possibile ottenere o impostare.

Hai ottenuto tutto questo? :)

4

Una volta individuato il giusto 'view', è possibile modificare:

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

Nota che il region_3d.view_location è il bersaglio 'look_at', non la posizione della telecamera; devi modificare view_matrix direttamente se vuoi spostare la posizione della camera (per quanto ne so), ma puoi facilmente regolare la rotazione usando view_rotation abbastanza facilmente. Avrete probabilmente bisogno di leggere questo per generare un quaternione valida però: http://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation

Forse qualcosa di simile può essere 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 
Problemi correlati