03 - 坐标系与场景几何¶
在开始模拟之前,理解 LESS 的坐标系和角度约定至关重要。本章将介绍这些基础概念。
坐标系¶
LESS 使用右手坐标系,原点位于场景地面的 西北角:
| 轴 | 方向 | 单位 |
|---|---|---|
| X | 东 (East) | 米 |
| Y | 南 (South) | 米 |
| Z | 上 (Up) | 米 |
原点
(0, 0, 0)位于场景地面的西北角(左上角),z = 0 为地面。
场景尺寸¶
scene.size 定义了场景地面的覆盖范围:
import less
scene = less.Scene()
# 正方形场景:50m × 50m
scene.size = 50.0
# 矩形场景:100m (东西) × 50m (南北)
scene.size = (100, 50)
场景地面在 XY 平面上从 (0, 0) 延伸到 (size_x, size_y)。
物体放置¶
物体的位置坐标 (x, y, z) 遵循相同的坐标系:
# 在场景中心放置一棵树(z=0 表示地面)
positions = [[25.0, 25.0, 0.0]]
scene.add(tree, positions=positions)
# 在东南角放置
positions = [[45.0, 45.0, 0.0]]
scene.add(tree, positions=positions)
角度约定¶
天顶角 (Zenith Angle)¶
天顶角从正上方(天顶)开始度量:
| 天顶角 | 含义 |
|---|---|
| 0° | 正上方(天顶/星下点) |
| 30° | 太阳高度角 60° |
| 60° | 太阳高度角 30° |
| 90° | 水平方向 |
# 太阳在正上方
scene.illumination = less.Illumination(source=less.Sun(zenith=0, azimuth=180.0), atmosphere=less.NoAtmosphere())
# 太阳高度角约60°(上午或下午)
scene.illumination = less.Illumination(source=less.Sun(zenith=30, azimuth=180.0), atmosphere=less.NoAtmosphere())
方位角 (Azimuth Angle)¶
方位角从 正北方向 开始,顺时针 度量:
| 方位角 | 方向 |
|---|---|
| 0° | 北 (-Y) |
| 90° | 东 (+X) |
| 180° | 南 (+Y) |
| 270° | 西 (-X) |
# 太阳在东南方向
scene.illumination = less.Illumination(source=less.Sun(zenith=30, azimuth=135), atmosphere=less.NoAtmosphere())
# 传感器从西边观测
sensor = less.Orthographic(
view_zenith=30,
view_azimuth=270, # 西
)
这与遥感领域的标准约定一致。
计算太阳位置¶
LESS 提供了根据经纬度和时间计算太阳天顶角/方位角的工具:
from datetime import datetime
import less
# 北京,2024年6月21日 10:00 (UTC+8)
sun = less.compute_sun_position(
latitude=39.9,
longitude=116.4,
date_time=datetime(2024, 6, 21, 10, 0),
)
print(f"太阳天顶角: {sun.sun_zenith:.1f}°")
print(f"太阳方位角: {sun.sun_azimuth:.1f}°")
单位总结¶
| 物理量 | 单位 |
|---|---|
| 位置、距离 | 米 (m) |
| 角度(天顶角、方位角) | 度 (°) |
| 反射率/透射率 | 无量纲 [0, 1] |
| 波长 | 纳米 (nm) |
| 温度 | 开尔文 (K) |
| 辐照度 | W/m²/nm |
| 辐亮度 | W/m²/sr/nm |
下一步¶
相关 API¶
less.Scene、less.Object、less.Scene.add()less.Illumination、less.Sun、less.NoAtmosphere、less.Orthographicless.compute_sun_position()