我正在尝试使用Python和Mayavi创建可视化 可视化的目的是在路径的不同阶段显示轨迹和摄像机截头锥。
我愿意暂时考虑性能因素,并希望找到一种方法,用numpy提供的图像来纹理mayavi创建的表面。
找到了最有希望的建议there,但在实施时我无法构建表面。
def render_image(self, frustum, timestamp):
surf = mayavi.mlab.surf(frustum[0, :-1],
frustum[1, :-1],
frustum[2, :-1],
color = (1.0, 1.0, 1.0))
这是表面创建的代码,其中numpy数组平截头体的行分别是x,y,z坐标,最后的第五个点是金字塔的尖端,因此不需要网格。
x [-8.717184671492793, -8.623419637172622, -8.363581977642212, -8.269816943322041]
y [-4.563044562134721, -4.941612408713827, -4.37100415350352, -4.749572000082626]
z [13.614485323873417, 13.703336344550703, 14.059553426925493, 14.148404447602779]
这是函数输入的一个示例 - 四个3D点表示所需多边形的顶点。
然而,冲浪功能在输入上失败了:
File "/usr/local/lib/python2.7/dist-packages/mayavi/tools/helper_functions.py", line 679, in __call_internal__
aspect_ratios = [(zf - zi) / (xf - xi), (zf - zi) / (yf - yi)]
ZeroDivisionError: float division by zero
注意:我能够使用mayavi.mlab.imshow渲染图像,但我发现根据轴角度和比例向量指定图像姿势和大小容易出错并且繁琐,所以我不愿意接受指向这个方向的答案。
非常感谢您的帮助。
答案 0 :(得分:1)
我必须用mayavi绘制纹理相机! 见:
虽然我这样做的方式是使用mlab.imshow,所以这可能是你不想要的答案类型。看到这段代码:
obj=mlab.imshow(image.T)
obj.actor.orientation = np.rad2deg(camera.w_Rt_c.euler)
pp = np.array([0, 0, camera.f])[:,None]
w_pp = camera.w_Rt_c.forward(pp)
obj.actor.position = w_pp.ravel()
obj.actor.scale = [0.8, 0.8, 0.8]
图像是一个(n,m)numpy数组,由于某种原因imshow会显示图像旋转90度,这就是我转置它的原因。
obj.actor.orientation期望偏航,俯仰,滚转角度是度数。图像的旋转是各个旋转矩阵Rx(偏航)* Ry(俯仰)* Rz(滚动)的乘积。在代码中我使用相机到我的相机类的世界欧拉角(目前不能共享该代码)。
图像的位置设置为3d位置,我的相机的主点将转换为世界坐标。
为什么比例因子是0.8是一个谜,如果我把它留到1,图像平面看起来比平截头体大?
我将上述内容封装在一个需要相机和图像的类中,并在给定相机的位置和方向上绘制平截头体和图像。