【问题标题】:Shading mask algorithm for radiation calculations辐射计算的遮罩算法
【发布时间】:2014-09-07 11:13:26
【问题描述】:

我正在开发一种软​​件 (Ruby - Sketchup),用于计算城市发展中行人层面的辐射(太阳、天空和周围建筑物)。最终目标是能够创建显示总辐射水平的等高线图。对于总辐射,我的意思是短波(光)和长波(热)。 (给你一个想法:http://www.iaacblog.com/maa2011-2012-digitaltools/files/2012/01/Insolation-Analysis-All-Year.jpg

我知道有几个现有的软件可以做到这一点,但我需要自己编写,因为这个计算只是更复杂的工作流程的一部分。

(明显的)伪代码如下:

Select and mesh surface for analysis
From each point of the mesh
  Cast n (see below) rays in the upper hemisphere (precalculated)
    For each ray check whether it is in shade
      If in shade => Extract properties from intersected surface
      If not in shade => Flag it
    loop
  loop
loop   

上面的方法是蛮力的,但这是我唯一能想到的。计算时间随着精度的四次方(Dx,Dy,Dazimth, Dtilt)而增加。我知道像 radiance 这样的软件使用 Montecarlo 方法来减少光线的数量。

您可以想象,网格特定点的计算精度很大程度上取决于天穹细分的精度。同样,表面上的精度取决于网格的粗糙度。

我正在考虑使用基于计算结果的自适应细化的不同方法。改进可以用于分析的表面和天穹。如果两个相邻点之间的结果差异超过阈值,则将执行细化。这通常在流体模拟中完成,但我找不到任何关于光模拟的内容。

我还想知道是否有算法,例如计算机图形学,可以最大限度地减少计算次数。例如:检查周围环境的最大高度,以便排除某些点的天穹的某些部分。

我不需要极高的准确性,因为我不进行渲染。目前我的首要任务是速度。

对方法有什么建议吗?

谢谢

n 条射线 此刻,我以恒定的方位角和倾斜步长细分天空;这会导致不规则的立体角。还有其他细分(例如 Tregenza)保持恒定的立体角。

编辑:回答 Spektre 提出的重要问题

  1. 时间范围。我每年每小时运行一次模拟。天气数据是从 epw 天气文件中提取的。它包含每小时的太阳高度和方位角、直接辐射、漫射辐射、云量(对于大气长波漫射)。我的算法分别计算阴影掩模,然后它使用这个阴影掩模来计算一年中每个小时在表面(和典型行人身上)的辐射。在第二步中,我添加了实际的辐射。在第一步中,我只是收集有关各种表面的几何形状和属性的信息。

  2. 太阳路径。不,我没有。见第 1 点

  3. 包括来自建筑物的反射?目前还没有,但我计划将其作为基于天空视角因素的整体漫反射短波反射。我现在只考虑来自地面的短波反射。

  4. 包括建筑物的散热?绝对没错。这就是我自己编写这段代码的原因。在迪拜,这是关键,因为建筑表面变得非常非常热。

  5. 表面反照率?是的,我愿意。在 Skethcup 中,我为每个表面关联了一个字典,在这本字典中,我包含了所有表面属性:温度、发射率等。目前温度是固定的(如果未指定环境温度),但我计划在未来,将其与已计算所有表面温度的建筑动态热模拟的结果相结合。

  6. 地图分辨率。分辨率由用户选择,网格由算法生成。在规模方面,我将其用于总体规划。规模从 100mx100m 到 2000mx2000m。我通常倾向于使用 2m 的最小分辨率。限制是内存和模拟时间。我还可以选择使用更精细的网格细化特定区域:例如有餐厅或其他便利设施的区域。

  7. 帧率。我不需要制作动画。结果以 VTK 文件导出,并在 Paraview 中可视化并在其中设置动画,以便在演示过程中炫耀 :-)

  8. 热和光。是的。短波和长波分开处理。见第 4 点。地理定位仅用于选择正确的天气文件。我不计算所有的辐射分量。我需要的天气文件有测量数据。他们不是很好,但现在已经足够好了。 https://www.lucidchart.com/documents/view/5ca88b92-9a21-40a8-aa3a-0ff7a5968142/0

【问题讨论】:

  • 好吧,你问的不是很清楚。但是,你有一个投射阴影的半球,你想知道它们是否在阴影内?
  • 我想做的远不止这些。我正在计算地面上的总辐射。像这样link
  • 我想说一种更有效的方法是将圆顶的边界投射到 ground/objects 上。 (通过投射我的意思是投影。)地面/物体上的圆顶边界也将是连续的 - 并且其中的所有点都在阴影中......
  • 嗯...我不确定我是否理解。我不需要方向来进行投影吗?我需要从各个方向计算整个圆顶产生的辐射。其中一些方向可能处于阴影中,在这种情况下,我会计算来自表面的热辐射。
  • 好吧,不管怎样,你还是从每个点投射 n 射线,我假设要创建所有方向的效果......所以你可以选择你的源的 n 个方向,比如太阳的位置等。计算 n 个投射边界,然后进行计算。优化将来自这样一个事实,即您只处理圆顶的边界。而不是像之前那样为每个射线投射处理圆顶上的每个点。

标签: ruby computational-geometry shadow light sketchup


【解决方案1】:

可见光

对于相对平坦的全局基础地面光照贴图我会使用投影阴影纹理技术而不是光线追踪角度积分。它的速度更快,结果几乎相同。这在非平坦地面上不起作用(许多更大的凸起会投射更大的阴影并且还会将有效光吸收区域更改为各向异性)。城市地区通常足够平坦(倾斜无关紧要),因此技术如下:

  1. 相机和视口

    地面地图是一个目标屏幕,因此将视点设置为地下,朝向太阳方向向上。分辨率至少是你的地图分辨率,没有透视投影。

  2. 第一次渲染光照贴图

    首先使用全辐射(直接+漫射)(浅蓝色)清除地图,然后渲染建筑物/对象,但仅使用漫射辐射(阴影)。这将使底图在洋红色渲染目标中没有反射和/或软阴影

  3. 第二次渲染光照贴图

    现在您需要添加建筑物面(墙壁)反射,因为我会将建筑物的每个室外面都面向太阳或加热到足够的温度,然后将反射点计算到光照贴图上并将反射直接渲染到贴图上

    在这些部分中,您可以为顶点添加光线追踪,以使其更精确,也可以包括多次反射(在这种情况下不要忘记添加散射)

  4. 将目标屏幕投影到目标辐射图

    只需将洋红色渲染目标图像投影到地平面(绿色)。它只是简单的线性仿射变换......

  5. 后期处理

    您可以通过模糊/平滑光照贴图来添加柔和阴影。为了使其更精确,您可以将信息添加到每个像素(如果它是阴影或墙壁)。实际墙壁只是距地面 0m 高度的像素,因此您可以直接为此使用 Z 缓冲区值。模糊程度取决于空气的散射特性,0m 地高处的粗像素点完全不模糊

红外

这可以用类似的方式完成,但温度的表现会有所不同,所以我会在地面以上几个高度制作几层场景,形成体积渲染,然后对像素和层之间的能量传输进行后期处理。也不要忘记添加绿色植物和水汽化的冷却效果。

我在该领域没有足够的经验提出更多建议

PS。我忘记了红外反射率,可见光对于许多材料,尤其是铝和一些壁画有很大不同

【讨论】:

  • 非常感谢您抽出宝贵时间来做这件事。在第一次阅读之后,它似乎没有考虑来自不在视野中的部分天空的辐射。它们是否集中在漫射辐射中? IR 非常关键,因为我也在晚上计算辐射。向天空的辐射有利于冷却。我正在使用辐射图作为“舒适图”的组成部分之一。在另一个软件中,我运行 CFD 模拟来计算当地空气速度。然后,我将两张地图结合起来,生成一个非常详细的舒适指数,该指数考虑了该地区的形态。
  • 我不认为我可以避免考虑整个天穹。例如,Radiance 首先使用粗略的天穹细分,然后在那些显示出很大变化的区域中对其进行细化。
  • @Rojj 是的,漫射辐射应该包括整个天穹灯光。它应该在同一时间在地面上相同的高度上几乎是恒定的。差异仅存在于较大建筑物附近的部分。如果你做了适当的软阴影(如第 5 条),那么结果应该非常相似。如果您需要更精确,那么您还需要对大气散射进行体积渲染(光线投射对于 IR 来说是不够的,但在这种情况下,您还需要包括当地天气,如风尘等,否则没有精度提升)
猜你喜欢
  • 2020-08-21
  • 2017-10-06
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2015-03-23
  • 1970-01-01
  • 2012-11-06
  • 2020-06-30
相关资源
最近更新 更多