You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 17:59:53