【问题标题】:Perspective projection with multiple 3D objects on different depths in PythonPython中不同深度的多个3D对象的透视投影
【发布时间】:2012-10-09 07:28:16
【问题描述】:

对于我的个人项目,我需要:

  1. 生成从 3D 对象到 2D 平面的透视投影(在空间中定义的点上,这将是相机)。

  2. 获取透视投影的准确区域/点坐标

  3. 生成多个 3D 对象的透视投影,其中一些对象可能位于其他对象之后。

  4. 渲染场景(只有一张图像,不会有任何动画,所以不需要实时渲染)。

对于第 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


【解决方案1】:

我建议将 OpenGL 用于此类任务。学习基本的 OpenGL(这看起来很基础)并不费力。看看here(众所周知的教程)和here(使用 Python、Qt 和 OpenGL 的基本示例)。我认为通过一些努力,这可能需要你一天的时间才能开始。

【讨论】:

  • 感谢您的链接,不认识他们,欢迎他们。但是,这并不能回答真正的问题,所以我只是对你投了赞成票。
  • 仍然很高兴能在链接方面为您提供帮助——值得一读。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
  • 1970-01-01
  • 2018-05-03
  • 1970-01-01
  • 2012-08-19
  • 2018-07-15
  • 1970-01-01
相关资源
最近更新 更多