从顶点数组生成3D对象
我最近开始学习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
里应该放什么值吗?还有这里到底发生了什么?非常感谢。
1 个回答
我找到的唯一有用的3D渲染示例就是Kivy自带的那个,但我对它的理解不够,只能用来处理.obj文件。
要知道,Kivy目前没有很多文档的原因是它并不专注于这个方向。它的后台支持一些相当不错和通用的功能,有些人正在使用这些功能(其中一些可能会被加入到Kivy的主版本中),但如果你想用Kivy做一些真正的3D工作,你可能需要对这些功能有一些基本的了解。
实际上,代码是在把顶点(也就是3D模型的点)传递给OpenGL的顶点着色器,而各种参数对应着着色器中的内容。这个设置在代码的其他地方进行——如果你仔细看,会发现使用了RenderContext,而不是普通的Canvas,像小部件通常使用的那样,还有一个特殊的OpenGL命令来启用深度缓冲区。
fmt是顶点格式,直接定义了每个顶点在OpenGL中的属性。你可以在示例中的simple.glsl
文件里看到,每个参数对应着着色器中的一个attribute
,并用于计算顶点在屏幕上的位置。实际上,v_tc0
并没有出现……我想这并不是必需的。
有人能解释一下fmt应该是什么值吗?
我不知道,这取决于你传入的数据类型和你遇到的具体错误。如果你是从一般意义上问,重要的是它能与上面的顶点着色器配合使用。
无论如何,真正重要的是你需要对OpenGL有一些了解,以及Kivy的API是如何封装它的。http://www.arcsynthesis.org/gltut/是一个不错的教程,涵盖了一些基本概念,也会帮助你更好地使用Kivy,并查看一些高级示例,比如那些使用着色器的例子。
关于Kivy的3D内容还有其他一些资料,不过要记住我上面说的。nskrypnik正在开发一个完整的3D框架,这里是他的GitHub,不过我不知道他的开发进度,你仍然需要一些知识才能深入了解。他还有其他一些使用3D的示例,还有其他一些例子,比如tito的3D检查器演示(和视频)。