【发布时间】:2012-10-09 07:28:16
【问题描述】:
对于我的个人项目,我需要:
生成从 3D 对象到 2D 平面的透视投影(在空间中定义的点上,这将是相机)。
获取透视投影的准确区域/点坐标
生成多个 3D 对象的透视投影,其中一些对象可能位于其他对象之后。
渲染场景(只有一张图像,不会有任何动画,所以不需要实时渲染)。
对于第 1,2 和 4 点,我想我已经找到了一种使用 PyGame 的方法,如下所述: http://codentronix.com/2011/04/21/rotating-3d-wireframe-cube-with-python/
但是对于第 3 点,我有点卡住了,因为即使我可以获得每个对象的透视投影,我怎么知道哪个对象是真正可见的,哪个(完整对象或部分对象)不可见?
我确实需要准确地知道对象的哪些部分可见,哪些部分不可见,因此我的最终目标是拥有一个我的屏幕图像矩阵,其中每个对象的投影区域都清晰定义。
例如,如果矩阵包含我的屏幕图像的所有像素,并且我们有 10 个对象,我们将在没有对象时得到 0,在我们可以看到对象 n1 时得到 1,在对象 n2 可见时得到 2,等等。 .
我必须补充一点,我是一名在 Python 和许多其他语言方面有成就的开发人员,但我之前从未做过任何与游戏相关的开发或渲染开发。
有人可以帮我走上正确的道路吗?
PS:附带问题:如果您还可以指出比 PyGame 更好的透视投影和渲染优化实现,我会非常感兴趣!
【问题讨论】:
-
我在想也许我应该使用一种算法来处理 2D 空间中的碰撞?但这里的问题是我需要 Z 坐标,它似乎也与 2D 投影点一起返回,但这真的是一个可行的解决方案吗(我对这种游戏的东西真的很陌生)。
-
你试过 OpenGL 吗?它有一个 Python 包装器 (PyOpenGL),我在许多项目中都使用它取得了巨大的成功。
-
如果您有每个对象的透视投影,则进行隐藏表面消除的一种简单方法是将它们拉回前面。如果它们由 3d 多边形组成,您必须以这种方式收集、排序和绘制所有这些。另一种相对简单的方法是使用 Z 缓冲区,它基本上跟踪图像阵列中每个像素位置处显示的表面的 z 值。当然,如果允许您使用 OpenGL 或 Direct3D 之类的东西(并为它们提供包装器),所有这些都可以为您完成,可能在硬件中完成。
-
感谢您的想法。事实上,我认为我会通过从后向前绘制来消除隐藏表面。我可以使用任何我想要的东西,但我以前从未使用过 OpenGL,因为它是一个低级 API,我认为我很难操作它。当你说我可以在硬件中做到这一点时,你是什么意思? OpenGL 是否已经具有用于消除隐藏表面的现有功能?
-
最后我选择了 Panda3D,因为它现在的原型制作速度更快,如果需要性能,我可以稍后切换到直接 OpenGL 交互。其他替代品是 Soya3D、PySoy 或 cgkit,它们都可以使用 Python,但 Panda3D 无疑是其中最先进的引擎。
标签: python 3d rendering projection perspective