为了账号安全,请及时绑定邮箱和手机立即绑定

如何生成抛物面并使其响应事件

如何生成抛物面并使其响应事件

一只斗牛犬 2022-10-06 19:22:19
我是 vispy 和计算机图形学的新手。我必须根据某个方程生成抛物面,该方程的中心和参数根据用户输入而变化。我浏览了 vispy 文档和示例,并对软件包有所了解。我需要生成的抛物面应该具有旋转对称性,如下图所示:而我得到的是这里我的代码如下。我已经修改isosurface.py了 vispy 示例中的示例。import sysimport numpy as npfrom vispy import app, scenefrom matplotlib import pyplot as plt# Create a canvas with a 3D viewportcanvas = scene.SceneCanvas(keys='interactive')view = canvas.central_widget.add_view()## Define a scalar field from which we will generate an isosurfacedef psi3(i, j, k, offset=(25, 25, 25)):    x = i-offset[0]    y = j-offset[1]    z = k-offset[2]    r = (0.2*x**2 + 0.2*y**2 - 4*z)    return r# Create isosurface visualdata = np.fromfunction(psi3, (50, 50, 50))surface = scene.visuals.Isosurface(data, level=data.max() / 4., color=(0.5, 0.6, 1, 1), shading='smooth', parent=view.scene)surface.transform = scene.transforms.STTransform(translate=(-25, -25, -25))# Add a 3D axis to keep us orientedaxis = scene.visuals.XYZAxis(parent=view.scene)# Use a 3D camera# Manual bounds; Mesh visual does not provide bounds yet# Note how you can set bounds before assigning the camera to the viewboxcam = scene.TurntableCamera(elevation=30, azimuth=30)cam.set_range((-10, 10), (-10, 10), (-10, 10))view.camera = camif __name__ == '__main__':    canvas.show()    if sys.flags.interactive == 0:        app.run()我的查询如下:如何使抛物面看起来像第一张图像(没有边缘被剪掉)除了使用等值面之外,有没有更好的方法来绘制抛物面。抛物面的系数应该由用户改变。如何使抛物面响应鼠标事件:悬停、拖放等。我从文档中了解到我必须将它耦合到 Node 类。由于我是新手,因此我无法弄清楚执行此操作的确切方法。
查看完整描述

2 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

我是 vispy 的维护者,但对等值面的经验很少。让我们看看我能回答什么:

  1. 我看到的最简单的方法是让它levels变得更小(我将其设为零以进行测试)。我不确定这会如何影响性能或输出,但该isosurface函数提到了它所基于的论文。也许这可以告诉你更多。

    See Paul Bourke, "Polygonising a Scalar Field"  
    (http://paulbourke.net/geometry/polygonise/)
  1. 为了使参数可由用户控制,您可以对现有的 Isosurface 类进行子类化并添加属性来控制这些。但是,如果您想要立即获得反馈,这可能会表现不佳,因为您必须重新生成 numpy 数组并在 CPU 上重新运行所有其他计算。IsosurfaceVisual 类需要体积数据,然后将其转换为等值面。它生成 MeshVisual 可以理解的网格(IsosurfaceVisual 是 MeshVisual 的子类)。如果你想要更好的东西,你可能不得不编写自己的着色器代码来做到这一点。取决于您的确切要求是什么(您是否必须接受任何具有可控系数的公式?)。

  2. scene.visualsVisual 类已经是该类的子类,因此Node您不必在那里做任何额外的事情。其他基于 SceneCanvas 的示例应该让您了解如何处理鼠标事件。就是说,您提到了“拖放”,我不确定您是否会在 VisPy 领域处理,但更有可能在 PyQt5 领域(如果这是您使用的后端)。


查看完整回答
反对 回复 2022-10-06
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

通过拉取请求添加了该功能:https ://github.com/vispy/vispy/pull/1863#event-3344873987

对代码进行了小幅修改并解决了问题。

相应的示例可以在这里找到: https ://github.com/vispy/vispy/blob/master/examples/basics/visuals/axisly_symmetric_surfaces.py


查看完整回答
反对 回复 2022-10-06
  • 2 回答
  • 0 关注
  • 77 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信