Python 如何获取opengl三维模型剖面图?

Python 如何获取opengl三维模型剖面图?,python,opengl,pyopengl,Python,Opengl,Pyopengl,我已经加载了一个obj文件来使用pyopengl和pygame渲染我的opengl模型。三维模型显示成功 下面是我用obj文件渲染的3D模型,现在我通过y轴将模型切割成十块,我的问题是如何在每一块中获得剖面图 我对openGL真的很陌生,有什么方法可以做到这一点吗 您需要分割对象,然后旋转碎片,以便从侧面看到它们。(或者移动相机。这两个想法是等价的。但是如果你是从头开始编写的,你就没有真正的“相机”的抽象)。在这一点上,你可以渲染所有的切片 这在原始OpenGL和python中很复杂,本质上是因

我已经加载了一个obj文件来使用pyopengl和pygame渲染我的opengl模型。三维模型显示成功

下面是我用obj文件渲染的3D模型,现在我通过y轴将模型切割成十块,我的问题是如何在每一块中获得剖面图

我对openGL真的很陌生,有什么方法可以做到这一点吗


您需要分割对象,然后旋转碎片,以便从侧面看到它们。(或者移动相机。这两个想法是等价的。但是如果你是从头开始编写的,你就没有真正的“相机”的抽象)。在这一点上,你可以渲染所有的切片

这在原始OpenGL和python中很复杂,本质上是因为OpenGL中的对象不是实体。我强烈建议您在建模程序中提前将对象切片。如果您需要通过脚本驱动这些操作,可以查看Blender的python脚本系统。

现在,解释一下原因:

当你切一个真实的桔子时,你希望得到横截面。你希望能看到里面的果肉,还有那些三角形的碎片

标准多边形三维模型中没有任何内容

此外,由于真正的橘子皮有厚度,因此可以从侧面观察橘子皮。相比之下,三维模型的一个面是无限薄的,因此当您从侧面查看它时,您将什么也看不到。因此,如果要渲染这个简单模型的切片,从侧面看,每个渲染都将是完全空白的

(好的,末端的部分会有“盖子”,就像面包的末端一样,但中间部分会完全看不见。)

如果没有一个编程库,它有一个切割是什么的概念,这将变得非常复杂,非常快。仅仅削减开支是不够的。如果要查看横截面,则必须密封通过切片到原始形状创建的孔。然而,填充横截面必须是明智的,否则你会得到各种奇怪的着色效果(仅供参考:这是由n-gons引起的,如果你想进一步了解这些问题的话)

要返回到原始语句,请执行以下操作:

建模程序旨在解决此类问题,因此我建议您尽可能利用它们的功能。或者至少,您可以检查Blender是如何实现此功能的,因为它是开源的

在Blender中,您可以使用刀具*进行这些切割,然后使用“生成面”命令填充孔(只需点击F)。非常简单,即使对那些不擅长艺术的人来说也是如此。我鼓励你在做太多3D编程之前先学习一点3D建模。这对我个人帮助很大


*(循环切割工具也可以完成这项工作,但如果不了解模型的拓扑结构,就很难判断。您可能现在不想了解拓扑结构,所以只需使用刀子即可)

有两种方法可以做到这一点,都使用剪裁来“切割”对象

  • 在早期版本的OpenGL中,可以使用用户剪辑平面“隔离”所需的切片。您可能希望在剪裁对象之前旋转它,但您的问题并不清楚。您需要调用
    glClipPlane()
    ,并且需要使用
    glEnable
    和参数
    GL\u CLIP\u PLANE0
    GL\u CLIP\u PLANE1
  • 如果你不明白什么是平面方程,你就必须仔细阅读

    理论上,您应该通过使用参数
    GL\u MAX\u clip\u planes
    调用
    glGetIntegerv
    来检查GPU上存在多少个用户剪辑平面,但所有GPU至少支持6个

  • 由于现代核心OpenGL中不推荐使用用户剪辑平面,因此需要使用着色器来获得相同的效果。请参见
    gl\u ClipDistance[]
  • 在谷歌上搜索,你会得到很多关于这两个方面的例子

    很抱歉没有提供源代码,但我不想发布代码,除非我100%确定它能工作,而且我现在没有时间检查它。然而,我100%相信你可以很容易地在互联网上找到一些伟大的例子

    最后,如果您无法使用剪裁平面和一些技巧使横截面可见,那么这可能确实很复杂,因为从现有模型创建闭合横截面是一个困难的问题。

    请澄清:“切成十块”是什么意思?如何定义碎片或切割?