跳转至

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)

天顶角从正上方(天顶)开始度量:

天顶角 含义
正上方(天顶/星下点)
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)

方位角从 正北方向 开始,顺时针 度量:

方位角 方向
北 (-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.Sceneless.Objectless.Scene.add()
  • less.Illuminationless.Sunless.NoAtmosphereless.Orthographic
  • less.compute_sun_position()