如何在vispy的3D网格场景中添加2D ImageVisual以提升渲染效率
可以直接使用Vispy的ImageVisual模块将2D图像嵌入3D场景,替代原有的平面硬纸板区域mesh,实现渲染效率提升。ImageVisual本质是带纹理的轻量化平面网格,仅需修改变换属性即可匹配3D空间内任意平面的位姿。
具体实现步骤
- 步骤1:初始化ImageVisual对象,传入硬纸板的图像数据
# image_data为numpy数组,格式要求为(H, W, 3)或(H, W, 4)的RGB/RGBA数据 cardboard_img = visuals.ImageVisual(image_data, method='auto')
- 步骤2:配置3D空间变换,匹配原硬纸板平面的位姿
首先从原mesh的硬纸板区域提取三个参数:平面中心点3D坐标、平面法向量、平面的实际宽高尺寸,再根据平面朝向选择变换方式:
from vispy.visuals.transforms import STTransform, MatrixTransform # 方案A:硬纸板平面法向量沿Z轴,无额外旋转,用STTransform即可 # 假设原平面中心点为(10, 20, 5),实际宽8、高6,图像像素尺寸为(img_width, img_height) cardboard_img.transform = STTransform( scale=(8 / img_width, 6 / img_height, 1), # 把像素尺寸缩放到3D场景实际尺寸 translate=(10 - 4, 20 - 3, 5) # 平移到平面中心,减去半宽半高做中心对齐 ) # 方案B:硬纸板平面有任意朝向,用MatrixTransform构造旋转矩阵 transform = MatrixTransform() transform.rotate(45, (1, 0, 0)) # 绕X轴旋转45度,匹配你平面的实际朝向 transform.scale((8 / img_width, 6 / img_height, 1)) transform.translate((10 - 4, 20 - 3, 5)) cardboard_img.transform = transform
- 步骤3:将图像添加到3D视图,开启深度测试保证遮挡关系正确
view.add(cardboard_img) cardboard_img.set_gl_state(depth_test=True)
- 步骤4:删除原mesh中硬纸板区域的顶点和面,避免重复渲染浪费性能
替代方案
如果不想使用ImageVisual,也可以直接给原平面mesh加纹理,性能提升效果基本一致,操作更简单:
# tex_coords为平面四个顶点对应的纹理坐标,取值范围0-1 mesh.set_data( vertices=verts, faces=faces, vertex_colors=colors, texture=cardboard_image_data, texcoords=tex_coords )
内容的提问来源于stack exchange,提问作者Isam Abdullah
相关产品推荐
相关产品推荐

