2013-06-11 5 views
7

Sto solo imparando Matplotlib, quindi sto andando dritto per la visualizzazione stereo. Ho già costruito gli specchi per visualizzare lo schermo e ho ottenuto le cifre di destra e di sinistra che aggiornano interattivamente alla giusta distanza.Imposta/ottieni la direzione di visualizzazione 3D per gli assi Matplotlib3D

Quello che devo fare ora è interrogare l'orientamento di un asse, per impostare l'orientamento dell'altro. Ho RFTM'd, e fatto aiuto (Axes3D.function), e purtroppo la documentazione sembra un po 'sottile, e incoerente.

Le uniche chiamate Axes3D che ho trovato finora che impostano/ottengono l'orientamento di visualizzazione sono view_init (azim =, elev =) e get_proj() che restituisce una matrice di trasformazione 4x4.

Ora get_proj dice - citando il pdf che è lo stesso testo della docstring

get_proj() 
Create the projection matrix from the current viewing position. 
elev stores the elevation angle in the z plane 
azim stores the azimuth angle in the x,y plane 
dist is the distance of the eye viewing point from the object point. 

... che non sta descrivendo una matrice 4x4.

Potrei provare a decodificare i valori nella matrice per darmi azim e elev, ma il reverse engineering si sente sempre sbagliato, soprattutto per una libreria ampiamente utilizzata. Non ho trovato alcuna funzione per impostare il dist. Ho scritto un breve script basato su uno degli esempi per impostare e interrogare le posizioni di visualizzazione.

from mpl_toolkits.mplot3d import Axes3D 
import numpy as np 
import matplotlib.pyplot as plt 

plt.ion() 
fig = plt.figure() 
ax = fig.gca(projection='3d') 
theta = np.linspace(-4 * np.pi, 4 * np.pi, 100) 
z = np.linspace(-2, 2, 100) 
r = z**2 + 1 
x = r * np.sin(theta) 
y = r * np.cos(theta) 
ax.plot(x, y, z, label='parametric curve') 
fig.canvas.draw() 

with open('dump_proj.txt','wt') as fout: 
    for e in range(0, 61, 30): 
     for a in range(0, 61, 30): 
      fout.write('setting azimuth to {0}, elevation to {1}\n'.format(a, e))   
      ax.view_init(azim=a, elev=e) 
      fig.canvas.draw() 
      d=ax.get_proj() 
      for row in d: 
       fout.write('{0:8.4f} {1:8.4f} {2:8.4f} {3:8.4f} \n'.format(*row)) 
      fout.write('\n') 

Una parte esempio del file salvato è mostrato qui

impostazione azimut 60, elevazione a 30

-0,1060 0,0604 0,0000 -0,0519
-0,0306 -0,0523 0,2165 0,0450
0,0000 0.0000 0.0000 -10.0000
-0.0530 -0.0906 -0.1250 10.0779

Direi che il 10 è som come la distanza di osservazione. Speravo piuttosto che fossero disponibili 0,5 o 0,866 voci con angoli di 30 e 60 gradi, ma non sembra così semplice.

Ci sono alcune funzioni che mi mancano, per impostare la distanza, o per ottenere l'elevazione e l'azimut? O pezzi di documentazione che mi mancano, che mi dicono come viene costruita la matrice proj 4x4?

Ho una soluzione alternativa, che alla fine potrebbe darmi un tempismo migliore, ed è quello di usare un altro controllo per impostare azimuth e elevazione, e quindi usarlo per view_init() entrambi gli assi dell'occhio sinistro e destro. Ma preferirei in primo luogo ottenere l'orientamento da uno degli assi.

Un'altra domanda, come fa il lavoro

from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 

? Sto solo lentamente prendendo confidenza con i metodi OO, e questo sembra funzionare per magia. L'importazione di Axes3D fa qualcosa dietro le quinte per alterare l'importazione di pyplot? Mi sarei aspettato di importare le cose 3D dopo la roba 2D, se si trattava di metodi sovrascrivibili. Suppongo che se tutto funziona, deve essere OK, ma non capisco come.

+0

Se si desidera effettuare la visualizzazione stereo, è molto meglio andare con 'mayavi'.Dai un'occhiata alla sua interfaccia 'mlab' per semplici comandi di tracciamento. Ho usato 'mayavi' con" shutter shutter "e polarizzatori stereo 3D. Non penso che siano mai riusciti ad aggiungere il supporto per i sistemi stereo "side-by-side" di base, come si sta lavorando, ma dovrebbe essere più facile da implementare rispetto a matplotlib. –

risposta

11

Doh, ciò che non avevo fatto era guardare la dir() di un'istanza della classe Axes3D. Ed eccoli, proprietà .azim, .elev e .dist.

+1

Devi accettare la tua risposta, quindi la domanda è contrassegnata come _solved_! – hooy