我最近开始在Kivy工作,并且正在尝试熟悉它的功能。我一直在查看Kivy的API参考,但发现它没那么有用。
我找到的唯一有用的3D渲染示例是Kivy已经提供的那个,而我对它的理解不足使它只对.obj文件有用。我想要完成的是一个3D对象,其顶点是动态生成的,并存储在self.field.vertices
数组中。
我试图修改代码,但我不知道该怎么做。 main.py
中的代码几乎与安装时提供的示例相同,因此这只是相关部分 - 我遇到问题的部分。
def setup_scene(self):
Color(1, 1, 1, 1)
PushMatrix()
Translate(0, 0, -3)
self.rot = Rotate(1, 0, 1, 0)
UpdateNormalMatrix()
self.mesh = Mesh(
vertices = self.field.vertices,
indices = range(len(self.field.vertices)//8), #no idea why this is so
fmt = [(b"v_pos", 3, "float"), (b"v_normal", 3, "float"), (b"v_tc0", 2, "float")],
#fmt value was copy-pasted from example's value. No idea what this is.
mode = "triangles",
)
PopMatrix()
有人可以解释fmt
应该有什么价值,以及这里发生了什么?非常感谢你。
答案 0 :(得分:1)
我发现3D渲染的唯一有用的例子就是Kivy已经提供的那个,而且我对它的理解不足使它只适用于.obj文件。
请注意,缺乏文档的原因是kivy现在根本没有关注它。后端支持一些相当令人印象深刻和通用的东西,有些人正在使用它(其中一些可能找到通往kivy master的方式),但是如果你想做的话,你可能需要一些常识和理解它正在做什么kivy认真的3D东西。
无论如何,真正发生的是这段代码将顶点传递给opengl顶点着色器,各种参数对应于该着色器中的内容。这种设置发生在代码的其他地方 - 如果你看,你会注意到使用RenderContext而不是像Widget一样的普通Canvas,还有一个特殊的opengl命令来启用深度缓冲。
fmt是直接的顶点格式 - 每个顶点在opengl术语中具有的属性。您可以在示例中的simple.glsl
文件中看到每个参数对应着色器中的attribute
,并在数学中用于操纵顶点将出现在屏幕上的位置。实际上,v_tc0
没有出现......我想这实际上并不是必需的。
有人可以解释fmt中应该有什么价值
我不知道,这取决于您传入的数据的性质以及您获得的确切错误。如果你的意思是一般意义上说,重要的是它适用于上面的顶点着色器。
无论哪种方式,真正重要的是你需要对opengl有所了解,以及kivy的api如何包装它。 http://www.arcsynthesis.org/gltut/是一个很好的教程,涵盖了一般的想法,它也有助于一般地使用kivy,并查看使用着色器的高级示例。
还有一些其他的东西在3D上与kivy,但请记住我上面所说的。 nskrypnik一直在研究一个完整的三维框架github here,虽然我不知道他的发展状况,你仍然需要一些知识才能深入。他还有其他一些使用3d的例子,还有其他的例如tito的3d inspector demo(和video)。