顶点数组中的3D对象

时间:2014-06-25 18:20:53

标签: 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应该有什么价值,以及这里发生了什么?非常感谢你。

1 个答案:

答案 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)。