我正在构建一个 python 库来计算(卫星的)太阳能发电。为了解释卫星部分投射到太阳能电池板上的阴影,我需要计算阴影。
卫星将由非常简单的几何形状组成,通常是一个立方体(即 6 个多边形)和一些面板(一个矩形多边形)从它的某一侧伸出。太阳会投射阴影,可以将其视为 (x,y,z) 位置的点光源。
我想避免编写自己的几何库,并认为这肯定是一个已解决的问题。我一直在研究无数现有的图书馆,例如PyVista、PyOpenGL、Panda3D、Pygame、SymPy)。但是,我发现了以下限制
如果没有可以原生提供阴影投射的库,那么如果有一个好的 3D 库,那么我可以执行以下操作:
创建一个与面部重合的平面
从光源位置投射光线穿过彼此面部的每个点
计算射线与平面的交点
连接交点以在平面上创建阴影多边形
计算阴影多边形与被分析面的重叠度
我尝试过使用 PyVista、trimesh、pyrender,但找不到合适的解决方案。
请记住,一个面上的特定点可能会被多个其他面遮挡;为了使用多边形裁剪计算精确的阴影区域,您需要对阴影多边形执行额外的布尔运算。你无法在精度上击败这种方法,但它可能非常慢。
所以这通常不会通过多边形裁剪来完成,而是通过光线跟踪/采样/光栅化来完成。只需向几何体发射一束与太阳平行的光线并寻找第一个交叉点;击中面部的光线数量除以其面积,与该面部的平均辐照度成正比(受遮挡和面部法线的影响)。任何基本的物理引擎或几何处理系统都应该支持必要的光线投射原语。