Vispy中set_face_colors修改网格面颜色无效的问题解决
Vispy中调用set_face_colors修改立方体面颜色无效的解决方案
你的代码存在两个关键问题导致颜色修改不生效:
- 错误覆盖Mesh对象:你在按键响应中将
cube1.mesh_data.set_face_colors()的返回值赋值给了cube1,但set_face_colors方法无有效返回值(实际返回None),这会导致原有的Mesh视觉对象被覆盖,自然无法更新显示。 - 未触发视觉对象更新:修改MeshData的数据后,需要主动调用Mesh对象的
update()方法,通知Vispy重绘该视觉元素。
以下是修正后的完整代码:
from vispy import app, scene, geometry import numpy as np class MonCanvas(scene.SceneCanvas): def on_key_press(self,event): global cube1, c1data print("You pressed '{}'".format(event.text)) if event.text == 'a': # 直接修改已有的MeshData,无需重新赋值cube1 c1data.set_face_colors([[0,0,1,1],[0,0,1,1],[0,1,0,1],[0,1,0,1],[1,1,1,1],[1,1,1,1],[1,1,0,1],[1,1,0,1],[1,0,0,1],[1,0,0,1],[1,0.5,0,1],[1,0.5,0,1]]) # 触发Mesh对象重绘 cube1.update() fenetre = MonCanvas(title="Fenêtre principale", size=(2000,1000), keys="interactive") view = fenetre.central_widget.add_view() view.camera = 'turntable' view.camera.distance = 10 c1data = geometry.MeshData(vertices = np.array([[0.5,0.5,-0.5],[0.5,-0.5,-0.5],[-0.5,0.5,-0.5],[-0.5,-0.5,-0.5],[0.5,0.5,0.5],[0.5,-0.5,0.5],[-0.5,0.5,0.5],[-0.5,-0.5,0.5]]), edges = np.array([[0,1],[0,2],[0,4],[3,1],[3,2],[3,7],[5,1],[5,4],[5,7],[6,2],[6,4],[6,7]]), faces = np.array([[1,2,3],[0,1,2],[5,6,7],[4,5,6],[0,1,5],[0,5,4],[2,3,7],[2,7,6],[1,3,7],[1,7,5],[0,2,6],[0,6,4]])) c1data.set_face_colors([[0,0,1,1],[0,0,1,1],[0,0,1,1],[0,0,1,1],[0,0,1,1],[0,0,1,1],[0,0,1,1],[0,0,1,1],[0,0,1,1],[0,0,1,1],[0,0,1,1],[0,0,1,1]]) cube1 = scene.visuals.Mesh(meshdata = c1data) view.add(cube1) c2data = geometry.MeshData(vertices = np.array([[0.5,0.5,0.5],[0.5,-0.5,0.5],[-0.5,0.5,0.5],[-0.5,-0.5,0.5],[0.5,0.5,1.5],[0.5,-0.5,1.5],[-0.5,0.5,1.5],[-0.5,-0.5,1.5]]), edges = np.array([[0,1],[0,2],[0,4],[3,1],[3,2],[3,7],[5,1],[5,4],[5,7],[6,2],[6,4],[6,7]]), faces = np.array([[1,2,3],[0,1,2],[5,6,7],[4,5,6],[0,1,5],[0,5,4],[2,3,7],[2,7,6],[1,3,7],[1,7,5],[0,2,6],[0,6,4]])) c2data.set_face_colors([[0,0,1,1],[0,0,1,1],[0,1,0,1],[0,1,0,1],[1,1,1,1],[1,1,1,1],[1,1,0,1],[1,1,0,1],[1,0,0,1],[1,0,0,1],[1,0.5,0,1],[1,0.5,0,1]]) cube2 = scene.visuals.Mesh(meshdata = c2data) view.add(cube2) fenetre.show() app.run()
关键修改说明:
- 删除错误的
cube1 = cube1.mesh_data.set_face_colors(...)语句,改为直接调用c1data.set_face_colors()修改颜色数据 - 添加
cube1.update()触发视觉对象重绘,确保颜色修改实时显示 - 简化按键判断逻辑(直接用
event.text == 'a'即可,无需额外格式化)
内容的提问来源于stack exchange,提问作者Emilie Lemaire
相关产品推荐
相关产品推荐

