如何实现Vispy中按Z键多次旋转网格立方体?
问题原因
你每次按下Z键时,都会创建一个新的MatrixTransform实例并赋值给cube2.transform,这个新变换只会将立方体从初始状态旋转90度。第二次按下时,你又重新创建了一个同样的变换,立方体的最终状态还是旋转90度,所以看起来没有变化。
解决方案
需要复用立方体已有的变换对象,在现有变换的基础上叠加旋转操作。具体步骤:
- 初始化
cube2时,给它分配一个初始的MatrixTransform - 按下Z键时,直接对
cube2.transform执行旋转操作,而不是重新创建变换
修改后的完整代码
from vispy import app, scene, geometry import numpy as np class MonCanvas(scene.SceneCanvas): def on_key_press(self,event): global cube1, cube2, c1data, c2data if event.text == 'a': 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]]) cube1.mesh_data_changed() if event.text == 'z': # 直接在现有变换上叠加旋转 cube2.transform.rotate(90,(0,0,1)) 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) # 初始化时给cube2分配一个MatrixTransform实例 cube2.transform = scene.transforms.MatrixTransform() view.add(cube2) fenetre.show() app.run()
关键修改点
- 初始化
cube2时,添加了cube2.transform = scene.transforms.MatrixTransform(),确保立方体有一个可复用的变换对象 - Z键处理逻辑从创建新变换并赋值,改为直接调用
cube2.transform.rotate(90,(0,0,1)),在现有变换基础上叠加旋转
内容的提问来源于stack exchange,提问作者Emilie Lemaire
相关产品推荐
相关产品推荐

