私はちょうど Matplotlib を学んでいるので、ステレオ ビジュアライゼーションに直行します。画面を表示するためのミラーを既に作成しており、左右の図が適切な距離だけ離れてインタラクティブに更新されています。
私が今しなければならないことは、1 つの軸の向きを調べて、もう 1 つの軸の向きを設定することです。私は RFTM を作成し、ヘルプ (Axes3D.function) を実行しましたが、残念ながら、ドキュメントは少し薄く、一貫性がないようです。
これまでに見つけた、表示方向を設定/取得する Axes3D 呼び出しは、view_init(azim=, elev=) と、4x4 変換行列を返す get_proj() だけです。
今 get_proj は言う - docstring と同じテキストである pdf からの引用
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.
... 4x4 マトリックスを記述していません。
行列の値をリバース エンジニアリングして、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は視距離のようなものだと思います。むしろ、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 のものをインポートすることを期待していました。すべてが機能する場合は問題ないと思いますが、方法がわかりません。