2013-06-11 16 views
7

Po prostu uczę się Matplotlib, więc idę prosto do wizualizacji stereo. Zbudowałem już lustra, aby wyświetlić ekran, i mam lewą i prawą figurkę aktualizującą się interaktywnie w odpowiedniej odległości.Ustaw/otrzymaj kierunek oglądania 3D dla Matplotlib Axes3D

To, co muszę teraz zrobić, to przeskanować orientację jednej osi, aby ustawić orientację drugiej. Mam RFTM'd i zrobiłem pomoc (Axes3D.function), a niestety dokumentacja wydaje się nieco cienka i niekonsekwentna.

Jedyne wywołania Axes3D, które znalazłem do tej pory, że ustawiają/otrzymują orientację widoku są view_init (azim =, elev =) i get_proj(), który zwraca macierz transformacji 4x4.

Teraz get_proj mówi - cytuje pdf który jest taki sam tekst jak 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. 

... który nie opisuje macierz 4x4.

Mogłabym spróbować odwrócić inżynierskie wartości w macierzy, aby uzyskać azim i wznios, ale inżynieria wsteczna zawsze wydaje się błędna, szczególnie w przypadku powszechnie używanej biblioteki. Nie znalazłem też żadnej funkcji do ustawienia dist. Napisałem krótki scenariusz na podstawie jednego z przykładów ustawiania i sprawdzania pozycji oglądania.

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') 

Przykład część zapisanego pliku jest pokazany tutaj

ustawienie azymutu do 60, wysokość 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

Zgaduję, że 10 to som takie jak odległość oglądania. Miałem raczej nadzieję na jakieś 0,5 lub 0,866 wpisów z kątami 30 i 60 stopni, ale nie wygląda to tak prosto.

Czy brakuje niektórych funkcji, aby ustawić odległość lub uzyskać elewację i azymut? Czy brakuje fragmentów dokumentacji, które mówią mi, w jaki sposób konstruowana jest macierz projk 4x4?

Mam obejście, które w końcu może dać mi lepsze wyczucie czasu, i to jest użycie innej kontroli do ustawienia azymutu i elewacji, a następnie użyć tego do view_init() lewej i prawej osi oczu. Ale wolałbym w pierwszej kolejności uzyskać orientację z jednej z osi.

Kolejne pytanie, w jaki sposób działa

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

? Wolno mi tylko opanować metody OO i wydaje się, że działa to za pomocą magii. Czy import Axes3D robi coś za kulisami, aby zmienić import pyplota? Z całą pewnością spodziewałem się zaimportować rzeczy 3D po materiałach 2D, gdyby to było nadrzędne metody. Zgaduję, że jeśli wszystko działa, to musi być OK, ale nie rozumiem.

+0

Jeśli chcesz zrobić wizualizację stereo, lepiej jest użyć 'mayavi'.Spójrz na jego interfejs 'mlab' dla prostych poleceń drukowania. Użyłem 'mayavi' z" szklaną przesłoną "i polaryzującymi systemami stereo 3D. Nie sądzę, aby kiedykolwiek dodali obsługę podstawowych systemów stereo "side-by-side", z którymi pracujesz, ale powinno to być łatwiejsze do wdrożenia niż z matplotlib. –

Odpowiedz

11

Doh, czego nie zrobiłem, to spójrz na katalog instancji klasy Axes3D. I tam są własności .azim, .elew i .dist.

+1

Powinieneś zaakceptować własną odpowiedź, więc pytanie jest oznaczone jako _solved_! – hooy

Powiązane problemy