亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何生成拋物面并使其響應事件

如何生成拋物面并使其響應事件

一只斗牛犬 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 關注
  • 108 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號