我已经加载了一个obj文件来使用pyopengl和pygame渲染我的opengl模型。 3D模型成功展示。
下面是我使用obj文件渲染的3D模型,现在我通过y轴将我的模型切割成十个部分,我的问题是如何获得每个部分的剖面图?
我对openGL真的很新,有什么方法可以做到吗?
答案 0 :(得分:1)
有两种方法可以做到这一点,并且都使用限制来剪切"切片"对象。
glClipPlane()
,然后您需要使用glEnable
GL_CLIP_PLANE0
,GL_CLIP_PLANE1
,... 如果你不了解飞机方程式,你必须阅读它。
理论上,您应该通过使用参数glGetIntegerv
调用GL_MAX_CLIP_PLANES
来查看GPU上存在多少个用户剪裁平面,但所有GPU都支持至少6个。
gl_ClipDistance[]
在Google上搜索可以为您提供大量示例。
很抱歉不提供源代码,但我不想发布代码,除非我100%确定它有效并且我现在没时间检查它。但是我百分百肯定你可以在互联网上轻松找到一些很好的例子。
最后,如果你不能使用剪裁平面和一些黑客来使横截面可见,那么这可能确实很复杂,因为从现有模型创建封闭横截面是一个难题。
答案 1 :(得分:0)
您需要拆分对象,然后旋转这些碎片,以便从侧面看到它们。 (或者移动相机。这两个想法是等价的。但是如果你从头开始编码,你就不会真正拥有'相机'的抽象。)此时,你可以渲染所有切片。 / p>
在原始的OpenGL和python中这很复杂,主要是因为OpenGL中的对象不稳定。我强烈建议您在建模程序中提前将对象切片。如果你需要使用脚本来驱动这些操作,也许可以查看Blender的python脚本系统。
现在,解释原因:
当你切一个真实的橙色时,你希望得到横截面。你希望能够看到里面的水果的肉,所有这些三角形的碎片。
标准多边形3D模型中没有任何内容。
此外,由于真橙的外皮有厚度,因此可以从侧面观察外皮。相比之下,3D模型的一个面是无限薄的,所以当你从侧面看它时,你什么都看不到。因此,如果你要渲染这个简单模型的切片,从侧面看,每个渲染都将是完全空白的。
(嗯,最后的位将有'大写',就像一块面包的末端,但中间部分将是完全不可见的。)
如果没有一个具有切割概念的编程库,这将变得非常复杂,非常快。简单地削减是不够的。如果要查看横截面,必须将切割成的孔密封成原始形状。然而,填充横截面必须聪明地完成,否则你将结束各种奇怪的阴影工件(fyi:这是由n-gons引起的,如果你想发现更多关于这些问题的话)。 / p>
返回原始声明:
建模程序旨在解决这些问题,因此我建议您尽可能利用它们的功能。或者至少,您可以检查Blender如何实现此功能,因为它是开源的。
在Blender中,您可以使用刀具*进行这些切割,然后使用'make face'命令填充孔(只需按F)。很简单,即使是那些不擅长艺术的人。我鼓励您在进行太多3D编程之前先学习一下3D建模。它个人帮了我很多。
*(循环切割工具也可以完成这项工作,但是如果不了解模型的拓扑结构就很难分辨。你可能不想立即理解拓扑结构,所以只需使用刀具)< / p>