How to compute shadow casting of simple polygon geometry objects in 3D using python

问题描述 投票:0回答:1

我正在构建一个 python 库来计算(卫星的)太阳能发电。为了解释卫星部分投射到太阳能电池板上的阴影,我需要计算阴影。

卫星将由非常简单的几何形状组成,通常是一个立方体(即 6 个多边形)和一些面板(一个矩形多边形)从它的某一侧伸出。太阳会投射阴影,可以将其视为 (x,y,z) 位置的点光源。

我想避免编写自己的几何库,并认为这肯定是一个已解决的问题。我一直在研究无数现有的图书馆,例如PyVista、PyOpenGL、Panda3D、Pygame、SymPy)。但是,我发现了以下限制

  1. 它们是为可视化而不是分析而构建的。换句话说,它们允许我在屏幕上渲染阴影,但无法让我分析投射在特定多边形上的实际阴影。
  2. 他们不处理 3D 中的多边形。

如果没有可以原生提供阴影投射的库,那么如果有一个好的 3D 库,那么我可以执行以下操作:

  1. 将卫星的所有面(包括面板)定义为多边形。
  2. 在 (x,y,z) 位置创建一个“光”
  3. 每张脸:
    1. 创建一个与面部重合的平面

    2. 从光源位置投射光线穿过彼此面部的每个点

    3. 计算射线与平面的交点

    4. 连接交点以在平面上创建阴影多边形

    5. 计算阴影多边形与被分析面的重叠度

我尝试过使用 PyVista、trimesh、pyrender,但找不到合适的解决方案。

python geometry computational-geometry shadow
1个回答
0
投票

请记住,一个面上的特定点可能会被多个其他面遮挡;为了使用多边形裁剪计算精确的阴影区域,您需要对阴影多边形执行额外的布尔运算。你无法在精度上击败这种方法,但它可能非常慢。

所以这通常不会通过多边形裁剪来完成,而是通过光线跟踪/采样/光栅化来完成。只需向几何体发射一束与太阳平行的光线并寻找第一个交叉点;击中面部的光线数量除以其面积,与该面部的平均辐照度成正比(受遮挡和面部法线的影响)。任何基本的物理引擎或几何处理系统都应该支持必要的光线投射原语。

© www.soinside.com 2019 - 2024. All rights reserved.