我知道Kivy公开了它的OpenGL上下文和一些原始接口。如果你直接用OpenGL修改,或者使用较低级别的模块,如kiv .graphics。转换,这对更高级的小部件有什么影响(通常)?是否所有的东西都配合得很好,或者底层的openGL函数是否有破坏布局或使小部件出错的习惯?
部件的实现是完全3D的;尽管他们的界面是针对2D的?我应该扁平化我的3D模拟,使用python,只是远离低级api吗?
我还不足以从网格中构建完整的3D对象,但是如果有一些简单的硬件加速转换和纹理操作/混合/投影,那就太好了。
- 我可以用这个Renderer模板扩展大多数内置小部件吗?GitHub Renderer的多个实例会并排工作吗?(假设内置组件可以正常工作)
- 嵌套吗?(可能没有,如果有,限制)
我希望在混合高级和低级api时,或者考虑到2.5D设计的现有项目框架(我所见过的大多数项目都非常重视3D对象生成)的注意事项列表的答案。
项目笔记
我想设置一个场景,显示为几个分层的2D平面(使用sprites/drawingAPI/Widgets),但技术上是在3D场景之后建模的。场景的深度不需要完全的3D支持,但可以从3D摄像机的平移/旋转中受益。
我想使用高级Kivy的小部件和绘图API。现在,绘制顺序和比例应该给我的场景我想要的深度。但是我不确定如何获得某些缩放/平移效果。
我希望使用花园。particlessystem (在我的理解中被设计成一个平面的2D小部件)。我计划堆叠3个实例,最终创建一个流体管道模拟。在第一个版本中,我不需要做大量的3D->2D投影,但最终我发现这将成为一个问题。
是否一切都配合得很好,或者底层的openGL函数是否有破坏布局或使小部件出错的习惯?
小部件实际上并不知道或关心图形在做什么——如果你自己的操作意味着图形与小部件在不同的地方,那么用户就没有点击小部件的正确位置,这将破坏它们。
你通常可以通过跟踪你的变换矩阵来避免这种情况,并将它应用到触摸上,看看它是否真的发生碰撞。这就是Scatter小部件所做的,允许任意平面内旋转和缩放,而不会破坏它所包含的小部件。一般来说,这样做的难度取决于你在做什么。
直接回答你的问题,使用低级指令和小部件之间没有内在的冲突。
部件的实现是完全3D的;尽管他们的界面是针对2D的?
Kivy的主上下文没有启用gl深度测试,所以没有任何3d剪辑或任何东西,但它仍然是opengl,如果你愿意,你可以传递和操纵3d顶点坐标。
你发布的例子使用了通常有用的技术,用RenderContext(它允许你在本地启用深度测试,以及其他事情,比如为这个上下文设置着色器)替换一个小部件画布(一个插入父上下文的指令列表)。
我可以用这个Renderer模板扩展大多数内置小部件吗?
原则上我想是的,但我认为要让所有东西都以有用的方式工作,这比你想象的要复杂得多,这取决于你到底在做什么。这包括这样一个问题,如果你开始干扰上下文的投影、平移或旋转,那么如果你想让小部件继续工作,你就必须适当地翻译触摸,这听起来很烦人。
将多个实例的Renderer工作并排?
是的。
嵌套吗?
我想是的,虽然你可能要更小心继承投影矩阵等从父。
我希望在混合高级和低级api时给出一个警告列表的答案,
我真的没有什么要说的,除了以上这些,这是部分有根据的猜测——以前没有人做过这种性质的工作。
您可能对nskrypnik的github存储库感兴趣,其中有一些不错的3d示例(不完全是您正在尝试的,但api使用的一般原则是相同的),或者tshirtman最近在kivy garden中发布的ddd (3d)模块再次演示了相同的事情。我猜他太谦虚了,不会在自己的回复中发布这个!
编辑:场景的深度不需要完全的3D支持,但可以受益于3D摄像机的平移/旋转。
我不知道你在这里有什么想法,但是当使用几个平面时,它可能相对容易生活在真正的分层2d中,并对每个平面分别应用适当的矩阵。这可能是好的跟踪,并将让你轻松地转换触摸适当的小部件工作良好(就像散射…你甚至可以直接使用它,如果它不是太重的话)。
您可能对
感兴趣Kivy -探索未来的3d检查器:http://youtu.be/2p-2jq5tXIw
代码在描述中共享