提问人:Sonarjit 提问时间:8/18/2023 最后编辑:Rabbid76Sonarjit 更新时间:8/21/2023 访问量:70
尝试交互 Ursina 和 PyVista 时出现 OpenGL 错误 [重复]
OpenGL error while trying to interact Ursina and PyVista [duplicate]
问:
好吧,我对 OpenGL 知之甚少。请帮助我了解为什么会出现错误以及解决错误的可能方法。
这是我的代码:
from ursina import *
import pyvista as pv
from pyvista import examples
# Starting an ursina app
app = Ursina()
# Define a parent entity of ursina
prnt = Entity()
# Defne a button entity which calls the method pyvista_display on click
Button("click", parent=prnt, scale=1, on_click=lambda: pyvista_display())
def pyvista_display(): # Method to display a simple pyvista mesh
# Load an interesting example of geometry
mesh = examples.load_random_hills()
# Establish geometry within a pv.Plotter()
p = pv.Plotter()
# Add mesh to the plotter
p.add_mesh(mesh, color=True)
# Show the plotter
p.show()
p.close()
# Run ursina app
app.run()
模块说明:
- 模块导入 ursina、pyvista 和 pyvista 示例包
- 我运行一个 ursina 应用程序。在应用程序中,只有一个带有标签“click”的功能按钮
- 当我单击按钮时,调用函数 pyvista_display()。
- 函数 pyvista_display() simple 打开一个 pyvista 窗口并显示来自内置 pyvista 示例包(我在上面导入)的网格
显示力矩时出错:到目前为止,代码运行良好。我单击“单击”按钮,pyvista窗口将显示并显示简单的示例网格。 当我关闭pyvista窗口时出现问题。当我关闭pyvista窗口时,我的终端上显示以下错误消息。消息在无限循环中显示,就像我们在无限制的循环中打印一些东西一样。
错误
:d isplay:gsg:glgsg(error):GL 错误 0x502:无效操作
来自 ChatGPT 的错误消息含义
错误消息 :d isplay:gsg:glgsg(error): GL error 0x502 : invalid operation 是一个 OpenGL 错误消息,指示在 OpenGL 上下文中尝试了无效操作。错误代码0x502对应于 OpenGL 常量GL_INVALID_OPERATION。
期望:
- 预计会正确关闭 pyvista 窗口并继续运行应用程序而不会出现任何错误。
- 就像我关闭pyvista窗口后一样,带有“单击”按钮的ursina窗口仍然继续运行。当我再次单击“单击”窗口时,pyvista窗口再次出现
请求:正如我上面已经提到的,我对OpenGL知之甚少,如果你发现错误并解决了我的问题,那将是我的福气。或者,如果您为我提供另一种方式来达到期望,我愿意听取您的建议。
答:
具有多线程的替代解决方案
我期待在 ursina 窗口本身中显示 pyvista 网格。我无法实现确切的期望,但我提出了一个替代解决方案。
替代解决方案通过pyvista窗口的创造性单独线程执行。当我单击ursina窗口中的“单击”按钮时,它会触发start_pyvista_thread()方法。此方法在启动时创建针对 pyvista_display() 方法的 pyvista 线程。pyvista_display() 包含显示 pyvista 网格的必要代码。因此,该代码创建了单独的 pyvista 窗口并显示 pyvista 网格。
就是这样!使用线程概念的简单执行。
from ursina import *
import threading
import pyvista as pv
from pyvista import examples
# Define the Ursina app
app = Ursina()
# Define a parent entity for Ursina
prnt = Entity()
# Method to display a simple PyVista mesh
def pyvista_display():
# Load an interesting example of geometry
mesh = examples.load_random_hills()
# Establish geometry within a pv.Plotter()
p = pv.Plotter()
# Add mesh to the plotter
p.add_mesh(mesh, color=True)
# Show the plotter
p.show()
# Method to start a new PyVista thread
def start_pyvista_thread():
# Create a thread for PyVista rendering
pyvista_thread = threading.Thread(target=pyvista_display)
pyvista_thread.start()
# Define a button entity that starts a new PyVista thread on click
Button("click", parent=prnt, scale=1, on_click=start_pyvista_thread)
# Run the Ursina app
app.run()
评论