python - 来自顶点数组的 3D 对象

标签 python 3d kivy

我最近开始在 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 中应该有什么值,以及这里发生了什么吗?非常感谢。

最佳答案

The only useful example of 3D rendering I found is the one that already comes with Kivy and my lack of understanding it makes it good only for .obj files.

请注意,缺少文档的原因是 kivy 现在根本不关注它。后端支持一些相当令人印象深刻和通用的东西,有些人正在使用它(其中一些可能会找到 kivy master 的方法),但如果你想做的话,你可能需要一些常识和了解它在做什么带有 kivy 的严肃 3D 内容。

无论如何,真正发生的是这段代码将顶点传递给 opengl 顶点着色器,并且各种参数对应于该着色器中的内容。此设置发生在代码的其他地方 - 如果您仔细观察,您会注意到使用了 RenderContext 而不是小部件通常使用的普通 Canvas,还有一个特殊的 opengl 命令来启用深度缓冲区。

fmt 直接是顶点格式 - 每个顶点在 opengl 术语中将具有的属性。您可以在示例中的 simple.glsl 文件中看到,每个参数对应于着色器中的一个 attribute,并在数学中用于操作顶点的位置将出现在您的屏幕上。实际上,v_tc0 并没有出现......我想这实际上不是必需的。

Can somebody please explain what value should be in fmt

我不知道,这取决于你传入的数据的性质和你得到的确切错误。如果你的意思是一般意义上的,重要的是它与上面的顶点着色器一起工作。

无论哪种方式,真正重要的是您需要对 opengl 以及 kivy 的 api 如何包装它有所了解。 http://www.arcsynthesis.org/gltut/是一个很好的教程,涵盖了一般的想法,它也有助于在一般情况下使用 kivy 并查看高级示例,例如那些使用着色器的示例。

还有一些关于 3d 和 kivy 的其他内容,但请记住我上面所说的内容。 nskrypnik 一直致力于完整的 3d 框架,github here ,虽然我不知道他的开发状态,但您仍然需要一些知识才能深入了解。他还有一些其他使用 3d 的示例,还有其他示例,例如 tito 的 3d inspector demo。 (和 video )。

关于python - 来自顶点数组的 3D 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24415805/

相关文章:

Python 3.6.4 Arcade 模块窗口错误? {pyglet.gl.lib.GLException : b'invalid enumerant'}

python - urlparse() 查询字符串丢失

python - 如何使用KV语言在Kivy中制作自定义按钮?

java - 3D 阵列如何工作?

python - 在 wxPython 应用程序中嵌入 3D 编辑器(例如 Blender)

python-3.x - 是否可以在不显示控制台窗口的情况下运行 Kivy 应用程序?

python - 如何在 Kivy ScrollView 中自动向下滚动?

python - while 循环中列表的 NoneType 错误?

python - 如何存储 value_counts() 函数返回的信息

math - 我可以从偏航/俯仰/侧倾创建的两个四元数中插值旋转吗?