1

我知道 Kivy 公开了它的 OpenGL 上下文和它的一些原始接口。如果你直接篡改OpenGL,或者使用像kivy.graphics.trasformation这样的低级模块,这会对更高级别的小部件产生什么影响(通常)?是否一切都无缝协作,或者低级别的 openGL 函数是否有破坏布局或使小部件出现错误的习惯?

小部件在实现中是完全 3D 的吗?虽然他们的界面是针对 2D 的?我是否应该使用 python 扁平化我的 3D 模拟,并远离低级 api?

我还不足以从网格构建完整的 3D 对象,但如果有一些简单的硬件加速转换和纹理操作/混合/投影,那就太好了。


  • 我可以使用这个Renderer模板扩展大多数内置小部件吗?GitHub
  • 渲染器的多个实例会并行工作吗?(假设内置插件可以正常工作)
    • 嵌套?(可能不是,如果是,则有限)

我希望在混合高级和低级 api 时给出一系列警告的答案,或者在设计时考虑到 2.5D 的现有项目框架(我见过的大多数项目都非常重视 3D 对象生成)。


项目说明

我想设置一个显示为多个分层 2D 平面(使用 sprites/drawingAPI/Widgets)的场景,但在技术上是在 3D 场景之后建模的。场景深度不需要完整的 3D 支持,但可以受益于 3D 相机平移/旋转。

我想为小部件和绘图 API 使用高级 Kivy。现在绘制顺序和缩放应该给我的场景我想要的深度。但我不确定如何获得某些缩放/平移效果。

我希望使用garden.particlesystem(据我了解,设计为平面 2D 小部件)。我计划堆叠 3 个实例,最终创建一个流体管道模拟。在第一个版本中,我不需要先进行繁重的 3D->2D 投影,但最终我可以看到它成为一个问题。

4

2 回答 2

3

是否一切都无缝协作,或者低级别的 openGL 函数是否有破坏布局或使小部件出现错误的习惯?

小部件实际上并不知道或关心图形在做什么 - 如果您自己的操作意味着图形与小部件位于不同的位置,那么用户不会在小部件中单击正确的位置,这会破坏它们条款。

通常,您可以通过跟踪您的转换矩阵并将其应用于触摸以查看它是否真的碰撞来避免这种情况。这就是 Scatter 小部件的作用,允许任意平面内旋转和缩放,而不会破坏它包含的小部件。更普遍地这样做的难度取决于你在做什么。

要直接回答您的问题,使用低级指令和小部件之间没有内在冲突。

小部件在实现中是完全 3D 的吗?虽然他们的界面是针对 2D 的?

Kivy 的主要上下文没有启用 gl 深度测试,因此没有任何 3d 剪辑或任何东西,但它仍然是 opengl,您可以根据需要传递和操作 3d 顶点坐标。

您发布的示例使用了通常有用的技术,即用 RenderContext 替换小部件画布(插入父上下文的指令列表)(这使您可以在本地启用深度测试,除此之外,例如为此上下文设置着色器) .

我可以使用这个 Renderer 模板扩展大多数内置小部件吗?

原则上我猜是这样,但我认为让一切以一种有用的方式实际工作会比你想象的更复杂,这取决于你到底在做什么。这包括一个问题,如果你开始弄乱上下文的投影、平移或旋转,那么如果你想让小部件继续工作,你必须适当地翻译触摸,这听起来很烦人。

渲染器的多个实例会并行工作吗?

是的。

嵌套?

我认为是的,尽管您可能必须更加小心地从父级继承投影矩阵等。

我希望在混合高级和低级 api 时得到一系列警告的答案,

除了上述内容之外,我真的没有什么要说的,这部分是有根据的猜想——以前没有人做过很多这种性质的工作。

您可能对 nskrypnik 的 github 存储库感兴趣,其中有一些不错的 3d 示例(不完全是您尝试的,但 api 使用的一般原则是相同的),或者 tshirtman 最近在kivy garden中发布的 ddd (3d) 模块再次证明了同样的事情。我猜他太谦虚了,不能在自己的回复中发布这个!

编辑:

场景深度不需要完整的 3D 支持,但可以受益于 3D 相机平移/旋转。

我不确定您在这里的想法是什么,但是当使用几个平面时,生活在真正的分层 2d 中并分别对每个平面应用适当的矩阵可能相对容易。这可能是可以跟踪的,并且可以让您轻松地适当地转换触摸,以便小部件可以正常工作(就像 Scatter 所做的那样......您甚至可以直接使用它,如果它不太重的话)。

于 2014-08-24T12:03:26.860 回答
1

你可能感兴趣

Kivy - 探索未来 3d 检查器:http: //youtu.be/2p-2jq5tXIw

代码在描述中共享。

于 2014-08-24T09:09:32.443 回答