2013-06-11 14 views
7

私はMatplotlibを学んでいるだけなので、私はステレオ視覚化のためにまっすぐに行っています。私はすでに画面を見るためにミラーを構築しており、左右の数字は適切な距離だけインタラクティブに更新しています。Matplotlib Axes3Dの3D視線方向を設定/取得する

私が今必要とするのは、一方の軸の向きを調べて、もう一方の向きを設定することです。私はRFTMを持っていて、助けを借りました(Axes3D.function)、そして残念なことにドキュメンテーションは少し薄く矛盾しているようです。

これまでに見つけたAxes3Dコールは、view_init(azim =、elev =)と4x4変換マトリックスを返すget_proj()です。

は今get_proj言う - 4x4の行列を記述されていないの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. 

...と同じテキストであるPDFファイルから引用します。

私はazimとelevを与えるために行列の値をリバースエンジニアリングしようとする可能性がありますが、リバースエンジニアリングは常に間違っていると感じています。私はdistを設定する関数も見つかりませんでした。私は、表示位置を設定して調べるための例の1つに基づいて短いスクリプトを書いた。

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

保存されたファイルの例部分は

設定方位角60に、仰角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

私は10がsom見る距離のようなもの。私はむしろ30度と60度の角度を使用して0.5または0.866のエントリを期待していましたが、そう簡単ではありません。

私は行方不明、距離の設定、または仰角と方位角の取得にいくつかの機能がありますか?あるいは、私が紛失しているドキュメンテーションのビットは、4x4 proj行列がどのように構築されるかを教えてくれるでしょうか?

私は左と右の両方最終的には私より良いタイミングを与え、そしてそれは、方位角と仰角を設定するには、別のコントロールを使用していて、その後、view_initすることを使用するかもしれない問題を回避するには、()目の軸を持っています。しかし、私は最初の例では、軸の1つから方向を取得することをお勧めします。

もう一つの問題、

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

作業を行いますか?私はゆっくりとオブジェクト指向の方法を理解していますが、これは魔法のように動作するようです。 Axes3Dのインポートは、pyplotのインポートを変更するために何かをしますか?私は2Dメソッドの後に3Dメソッドをインポートすることを辛抱強く思っていました。私はそれがすべて正常に動作しなければならないかと思いますが、どうしたらいいか分かりません。

+0

ステレオ視覚化をしたい場合は、 'mayavi'を使う方がはるかに良いでしょう。単純なプロットコマンドのための 'mlab'インタフェースを見てください。私は 'mayavi'を"シャッターグラス "と偏光ステレオ3Dシステムで使用しました。私は、あなたが作業しているような基本的な "サイドバイサイド"ステレオシステムのサポートを追加することに慣れてきたとは思えませんが、matplotlibより実装する方が簡単です。 –

答えて

11

Dohは、Axes3Dクラスのインスタンスのdir()を見ていませんでした。そこには、.azim、.lelev、.distのプロパティがあります。

+1

あなた自身の回答を受け入れる必要があるので、質問は_solved_とマークされています! – hooy

関連する問題