9

我只是在学习 Matplotlib,所以我直接进行立体可视化。我已经构建了镜子来查看屏幕,并且已经让左右数字以交互方式更新了正确的距离。

我现在需要做的是询问一个轴的方向,设置另一个轴的方向。我有 RFTM,并完成了帮助(Axes3D.function),不幸的是文档似乎有点薄,而且不一致。

到目前为止,我发现的唯一设置/获取查看方向的 Axes3D 调用是 view_init(azim=, elev=) 和 get_proj(),它返回一个 4x4 变换矩阵。

现在 get_proj 说 - 引用与文档字符串相同的文本的 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 的函数。我已经根据其中一个示例编写了一个简短的脚本来设置和询问查看位置。

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() 左右眼轴。但我更喜欢首先从其中一个轴获取方向。

还有一个问题,怎么

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

工作?我只是慢慢地掌握了 OO 方法,这似乎很神奇。Axes3D 的导入是否在幕后改变了 pyplot 的导入?如果它是压倒一切的方法,我会天真地期望在 2D 东西之后导入 3D 东西。我想如果一切正常,它一定没问题,但我不明白怎么做。

4

1 回答 1

14

Doh,我没有做的是查看Axes3D 类实例的 dir() 。它们就是 .azim、.elev 和 .dist 属性。

于 2013-06-11T14:33:15.560 回答