【问题标题】:Panda3D and Python, render only one frame and other questionsPanda3D和Python,只渲染一帧等问题
【发布时间】:2012-10-10 12:03:24
【问题描述】:

我想在我的个人项目中使用 Panda3D,但是在阅读了文档和一些示例源代码之后,我仍然有几个问题:

  • 如何只渲染一帧并将其保存在文件中? 事实上,我需要渲染 2 个不同的图像:一个对象,以及一个包含多个对象的场景,包括前一个对象,但每个对象只有一个帧,并且它们都需要保存为图像文件。

  • 应用程序将使用 Python 编码,并且需要非常可扩展(可供数千名用户使用)。 Panda3D 适合这里吗? (关于我的 Python 程序,它几乎是一个恒定的复杂性,所以这里没有问题,3D 模型将是低多边形的,每个场景大约 5 到 20 个)。

  • 我需要计算每个对象到相机的透视投影。是否可以直接访问顶点和面(位置、参数等)?

  • 我可以重新着色我的 3D 对象吗?我需要为整个对象设置一个简单的颜色,但每个对象设置不同的颜色。可能吗?

还请注意,我是图形和游戏开发领域的新手,但我了解一些 3D 建模和 3D 理论,以及计算机成像理论。

感谢您阅读我。

PS:我目前的主要替代方案是使用 Soya3D 或 PySoy,但它们似乎并没有得到非常积极的开发和优化,所以虽然它们的内存占用都较小,但我不知道它们是否真的会性能比 Panda3D 更快,因为它们不是很优化...

【问题讨论】:

    标签: python 3d rendering panda3d


    【解决方案1】:
    • 您可以使用self.win.saveScreenshot(Filename) 对您的场景进行截图。示例:

      from panda3d.core import Filename
      
      file_name = Filename('whatever.png')) 
      self.win.saveScreenshot(file_name) 
      
    • 我自己从未使用过 Panda3D Networking API,但它应该在客户端做得很好。拥有数千名用户的服务器端的性能可能没有那么好,但您可以使用其他更适合重型网络的技术(如 C 或 NodeJS)对服务器软件进行编码。

    • 是的,您可以访问和修改顶点并将它们分组为面。默认顶点数据允许您设置顶点位置、法线、颜色和纹理坐标,但如果需要,您可以设置自己的自定义顶点格式。看一下手册:Panda3D Manual: Creating and filling a GeomVertexData

    • 是的,可以使用 object.setColor(r,g,b,a) 设置对象颜色。更多信息:Panda3D Manual: Tinting and Recoloring

    希望对你有帮助!

    【讨论】:

    • 谢谢你,它有帮助,但我想我应该澄清一下我的应用程序是什么: - 不应该有渲染窗口,因为应用程序只是为了将场景直接渲染到图片。这是稍后将由另一个应用程序处理的图像,因此我们不需要任何 GUI 或窗口。 - 应用程序确实是服务器端的,所以不应该有任何窗口。 - 我只需要从 OBJ 文件中加载的对象中获取顶点和面,而不是设置它们。加载的对象是 GeomVertexData 的实例吗?
    • 是的,您可以在没有任何窗口的情况下在后台运行 Panda3D,读取 OBJ 文件(我相信您必须将它们转换为 EGG 格式)并读取其几何数据。
    • 好的,谢谢,我正在阅读越来越多的手册并在之后发布摘要,但我仍然找不到如何在后台渲染单个帧!你能给我最后的指导吗?
    • 恐怕我帮不了你,因为这是一个相当高级/罕见的话题。在 Panda3D 论坛或 IRC 频道中提问。里面的人非常支持。祝你好运!
    • 所以为了完成答案,我在 Panda3D 1.8.0 中找到了我所有问题的解决方案:隐藏窗口,使用 loadPrcFileData("", "window-type offscreen" ) 或 window - 如果不需要渲染,则键入 none,渲染一帧使用 base.graphicsEngine.renderFrame(),保存为图像文件使用 base.screenshot(),仅渲染一个对象,使用 nodePath.hide() 隐藏所有其他对象,可以使用nodePath.getGeom*()直接访问顶点和面,最后设置颜色nodePath.setColor()或nodePath.setColorScale()为just tint。更多信息:panda3d.org/forums/viewtopic.php?p=88668
    【解决方案2】:
    • 您可以使用启用了 setOneShot 的缓冲区,使其仅呈现单个帧。您可以通过将“window-type”PRC 变量设置为“none”来启动不带窗口的 Panda3D,然后自己打开一个屏幕外缓冲区。 (注意:没有主机窗口的屏幕外缓冲区可能不被普遍支持。) 如果您将“window-type”设置为“offscreen”,base.win 实际上将是一个缓冲区(这可能比您自己设置要容易一些),之后您可以调用base.graphicsEngine.render_frame() 来渲染单个帧同时避免了任务管理器的开销。由于双缓冲,您必须调用它两次。
    • 是的。迪士尼将 Panda3D 用于他们的一些 MMORPG。我必须补充一点,Panda 的高级网络接口的文档记录很差。
    • 您可以使用nodepath.get_transform(base.cam) 计算从对象到相机的转换,这是一个TransformState 对象,您可以选择使用ts.get_mat() 将其转换为矩阵。这出奇的快,因为 Panda 为转换维护了一个组合缓存,这样就不必多次发生这种情况。您可以使用lens.get_projection_mat() 或使用lens.get_projection_mat_inv() 获得投影矩阵(从视图空间到剪辑空间)。 您还可以使用 Geom 接口访问单个顶点数据,这在 Panda3D 手册中有详细描述。
    • 您可以使用set_color 更改对象的基本颜色(替换任何顶点颜色),或者您可以使用set_color_scale 为对象着色,即。应用与现有颜色相乘的颜色。如果您使用灯光并希望为漫反射、镜面反射和环境光组件使用不同的颜色,也可以应用 Material 对象。

    【讨论】:

      猜你喜欢
      • 2014-09-26
      • 1970-01-01
      • 2019-10-21
      • 1970-01-01
      • 1970-01-01
      • 2022-08-02
      • 1970-01-01
      • 2014-01-27
      • 1970-01-01
      相关资源
      最近更新 更多