• StarSky: Gaia DR3 ICRS Starfield Rendering in Unity 6

    本文档为项目使用手册,也是对当前代码实现的算法、坐标变换、图形学原理、工程架构与项目约定的完整说明。

    摘要

    StarSky 是一个面向 Unity 6 的 Gaia DR3 恒星可视化项目。它从 Gaia DR3 的 CSV 子集导入恒星天体测量与光度数据,将其转换为紧凑的二进制运行时目录,并在 Unity 中以 ICRS 天球坐标系渲染一个可交互的沉浸式星空。当前项目的目标不是完整天体物理模拟,而是以可解释、可调试、可扩展的方式把 Gaia 星表中的赤经、赤纬、视差、自行和光度字段转换为实时可渲染的屏幕空间恒星 billboard。

    项目核心流程如下:

    1. 在编辑器阶段读取项目根目录的 gaiadr3.csv

    2. 验证并提取 Gaia 字段:source_idradecparallaxpmrapmdecphot_g_mean_magphot_bp_mean_magphot_rp_mean_mag

    3. 写入 Assets/StreamingAssets/StarSky/gaiadr3_icrs_j2016.bin

    4. 运行时加载二进制星表。

    5. 将 Gaia J2016.0 ICRS 星表位置传播到指定 TT 时刻。

    6. 在有正视差时,将恒星视为有限距离 BCRS/ICRS 位置,并减去观察者位置得到观测方向。

    7. 按 G 星等过滤并转换为可视星点的大小、透明度和颜色。

    8. 生成由四边形 billboard 构成的 Mesh chunk。

    9. 由 Shader 在裁剪空间中按像素半径展开四边形,实现相机旋转时仍保持圆形、稳定的星点。

    关键词

    Gaia DR3;ICRS;BCRS;赤经赤纬;自行;视差;儒略日;TT;天球渲染;Unity Mesh;屏幕空间 billboard;additive blending;恒星色温;星等可视化;clip space expansion。

    目录

    1. 项目定位

    1.1 研究问题

    StarSky 关注的问题可以表述为:

    给定 Gaia DR3 的一个恒星样本,如何在 Unity 运行时中以稳定、可交互、可解释的方式将其显示为真实天球方向上的星空?

    该问题跨越三个层面:

    1.2 非目标

    当前代码有意保持范围收敛。它不是完整天文软件,目前仅实现Gaia 星表到实时天球渲染的链路。

    暂不覆盖:

    1.3 当前视觉范围

    默认 Demo 使用:

    2. 运行环境与依赖

    2.1 Unity 版本

    本项目使用 Unity6 版本,项目版本记录在 ProjectSettings/ProjectVersion.txt

    2.2 Unity 包依赖

    Packages/manifest.json 当前只启用了很少的 Unity 模块:

    这些依赖分别对应:

    项目未引入 URP、HDRP、Entities、Burst、Jobs 或第三方包。渲染实现基于内置 Mesh、Material 和 Shader。

    2.3 目录输入要求

    导入器默认寻找:

    该文件需要放在 Unity 项目根目录,即与 Assets/Packages/ProjectSettings/ 同级。运行时默认读取:

    StreamingAssets 被用于使二进制星表在运行时可通过Application.streamingAssetsPath 定位。

    3. 快速开始

    3.1 打开项目

    1. 使用 Unity 6 打开本目录。

    2. 确认 gaiadr3.csv 位于项目根目录。

    3. 等待 Unity 完成脚本编译和资源导入。

    3.2 导入 Gaia CSV

    在 Unity 菜单中执行:

    或者打开可配置导入窗口:

    导入成功后应生成:

    3.3 创建 Demo 场景

    在 Unity 菜单中执行:

    随后打开:

    进入 Play Mode 后:

    3.4 验证 Demo

    可在菜单中执行:

    该操作会打开 Demo 场景,调用 GaiaSkySphereRenderer.Rebuild(),并检查是否生成至少一个可渲染 chunk。

    3.5 导出预览 PNG

    可在菜单中执行:

    该操作会渲染一张 1280 x 720 的 PNG 到:

    4. 仓库结构

    4.1 Assembly 划分

    项目使用两个 asmdef:

    这种划分避免运行时构建引用 UnityEditor 命名空间,也使导入和验证工具不污染最终播放器代码。

    4.2 模块依赖图

    gaiadr3.csv

    GaiaDr3CsvImporterWindow

    gaiadr3_icrs_j2016.bin

    GaiaCatalogBinary

    GaiaCatalog

    GaiaSkySphereRenderer

    JulianDateTT

    GaiaStarPropagator

    DVector3

    Generated star Mesh chunks

    GaiaStarVisualMaterial

    StarSkyAdditiveStarBillboard.shader

    Unity Camera

    StarVisualSettingsPanel

    StarRenderCameraController

    StarSkyDemoSceneBuilder

    5. 数据集与二进制格式

    5.1 Gaia DR3 数据集获取

    检索数据:

    访问官方入口:ESA Gaia Archive (https://gea.esac.esa.int/archive/),进入ESA Gaia 检索后台,在顶部导航栏中,点击 Search 标签页,进入检索界面。在检索界面的左上角,从默认的 "Simple"(简单检索)切换到 Advanced (ADQL) 标签页。这里允许我们编写自定义的数据库查询脚本。

    在高级检索的文本框中,输入本项目使用的 ADQL 语句:

    字段与筛选逻辑:

    gaiadr3.gaia_source:明确指定从 Gaia 官方第三版(DR3)的核心源表中提取数据。其参考历元天然就是 J2016.0 (TT),参考系为 ICRS。

    ra, dec:双精度(double)的赤经和赤纬,单位是度(degrees)。

    parallax:视差,单位是毫弧秒(mas)。星敏感器仿真中,虽然恒星距离极远,但高精度仿真仍会用它来修正地球/卫星绕日运动产生的周年视差。

    pmra, pmdec:自行参数,单位是毫弧秒/年(mas/yr)。注意:pmra 已经是包含了 cos(dec) 修正后的净自行( μα=μαcosδ),在 Unity 中进行时间演化推导时可以直接使用。

    多波段星等 (phot_g_..., phot_bp_..., phot_rp_...):除了主 G 星等(400-1000 nm),同时导出了蓝端 GBP(330-680 nm)和红端 GRP(640-1050 nm)星等。这是因为不同厂商的星敏感器 CMOS 芯片光谱响应不同,利用这三个波段的色指数(如 GBPGRP),可以在 Unity 中拟合出该芯片对应的仪器星等,从而准确仿真其灰度输出。

    IS NOT NULL:强制剔除任何缺失天体解的暗星或异常星,确保导入 Unity 的每一条数据都能在空间中被唯一、连续地传播。

    数据集下载:

    执行查询:在代码框下方,点击 Submit Query(提交查询)按钮。

    注:由于 G9.5 的恒星大约有 40 万到 50 万颗,这个数量对于 Gaia 数据库来说属于“超小型”任务,服务器通常会在 5-10 秒内完成检索。

    查询完成后,在结果面板的工具栏中,找到 Download results 区域。将 Format(格式)下拉菜单修改为 CSV。将压缩方式设为 Gzip 格式可以大幅减少下载时间。点击下载图标,将文件保存到本地,重新命名为 gaiadr3.csv后放置到本仓库的根目录中。

    5.2 CSV 输入字段

    导入器要求 CSV 表头包含以下字段:

    字段类型单位语义
    source_idulongGaia 源标识符
    radoubledegreeICRS 赤经
    decdoubledegreeICRS 赤纬
    parallaxdoublemilliarcsecond视差
    pmradoublemilliarcsecond/year赤经方向自行,Gaia 定义为 mu_alpha_star
    pmdecdoublemilliarcsecond/year赤纬方向自行
    phot_g_mean_magfloatmagnitudeGaia G 平均星等
    phot_bp_mean_magfloatmagnitudeGaia BP 平均星等
    phot_rp_mean_magfloatmagnitudeGaia RP 平均星等

    phot_g_mean_mag 是必需光度字段。BP/RP 若解析失败,则以 NaN 保存,后续颜色映射会回退到默认颜色指数。

    5.3 CSV 解析约定

    导入器实现位于:

    解析策略:

    注意:当前 CSV 解析器假定字段中不包含带引号的逗号。Gaia 数值型导出通常满足这一条件。

    5.4 运行时记录结构

    运行时每条恒星记录由 GaiaStarRecord 表示:

    该结构还提供两个派生属性:

    5.5 二进制格式

    二进制读写由 GaiaCatalogBinary 负责。

    文件头:

    顺序写入方法字段当前值
    1BinaryWriter.Write(string)magicSSKYGAIA
    2Write(int)version1
    3Write(double)reference epoch TT JD2457389.0
    4Write(int)record count当前为 291270

    随后逐条写入记录:

    顺序类型字段
    1UInt64sourceId
    2DoubleraDeg
    3DoubledecDeg
    4DoubleparallaxMas
    5DoublepmraMasPerYear
    6DoublepmdecMasPerYear
    7SinglephotGMeanMag
    8SinglephotBpMeanMag
    9SinglephotRpMeanMag

    每条记录的定长载荷为:

    这里 BinaryWriter.Write(string) 是 .NET 的长度前缀字符串写法,而不是固定 8 字节裸 magic。因此跨语言读取时要按 .NET BinaryWriter 字符串格式处理,或在未来格式版本中显式改为固定字节 magic。

    5.6 版本检查

    读取时执行以下保护:

    这些检查保证运行时不会悄悄读取错误年代、错误版本或损坏的星表。

    6. 坐标系、时间尺度与物理约定

    6.1 ICRS

    ICRS,即 International Celestial Reference System,是 Gaia 星表坐标的基础参考系。StarSky 将 Gaia 的 radec 直接解释为 ICRS 中的球面角。

    代码中的三维方向向量定义为:

    其中 radec 先从角度转换为弧度。

    这意味着 StarSky 的 Unity 世界坐标被当作 ICRS 直角坐标使用:

    这不是常见游戏场景中的“Y 轴向上”地面坐标,而是天球坐标直接嵌入 Unity 世界空间。Demo 相机的初始 up 方向由 ICRS 北向量构造,因此视觉上仍有可理解的天球北方向。

    6.2 BCRS/ICRS 观察者位置

    代码字段名使用:

    其语义是观察者在 BCRS/ICRS 直角坐标中的位置,单位为 AU。当前实现没有引入完整 BCRS 相对论框架,而是采用与 ICRS 轴对齐的欧氏位置向量:

    当恒星有可用正视差时,渲染方向为:

    当恒星没有可用正视差时,系统把它视为无限远,只传播角方向。

    6.3 时间尺度

    项目使用 JulianDateTT 作为传播时间输入。

    核心常量:

    常量含义
    J2000JulianDate2451545.0J2000 儒略日
    GaiaReferenceEpochJulianYear2016.0Gaia 参考儒略年
    GaiaReferenceEpochJd2457389.0Gaia J2016.0 的 TT JD
    DaysPerJulianYear365.25儒略年天数
    TtMinusTaiSeconds32.184TT 与 TAI 的固定差

    6.4 UTC 到 TT 的转换

    当用户输入 UTC ISO-8601 时,代码执行:

    默认:

    因此默认:

    需要注意,闰秒表未来可能变化。当前实现通过 inspector 字段 visualizationTaiMinusUtcSeconds 暴露该值,而不是自动查询外部闰秒数据。

    6.5 与 Gaia J2016.0 的时间差

    传播算法使用:

    这个差值直接乘以自行切向速度,得到相对于 Gaia 参考历元的角位移近似。

    7. 天体测量算法

    天体测量核心实现位于:

    7.1 角度单位转换

    其中:

    7.2 参考方向

    给定赤经 alpha 和赤纬 delta,ICRS 单位方向为:

    代码:

    7.3 天球局部基:east 与 north

    自行是定义在天球切平面上的角速度。StarSky 构造两个局部正交方向:

    它们分别对应:

    二者均与单位视线方向 u 正交。对于单位球面,east 可理解为沿纬圈切向,north 可理解为沿经圈向北的切向。

    7.4 Gaia pmra 的解释

    Gaia 的 pmra 不是简单的 d(alpha)/dt,而是:

    这点非常重要。若直接把 pmra 当作 d(alpha)/dt,在高赤纬区域会出现错误的角速度放大。

    StarSky 采用 Gaia 的定义,将 pmra 直接作为 east 方向的切向角速度:

    再乘以 MasToRadians 转为弧度每年:

    7.5 线性自行传播

    对于无限远或只关心方向的恒星,传播公式为:

    代码:

    这是一个一阶切平面近似。对当前 Demo 的视觉用途来说,它具有以下优点:

    其代价是没有建模高阶球面测地传播、径向速度导致的透视效应和真实空间速度的完整传播。

    7.6 视差到距离

    parallaxMas > 0 时,距离估计为:

    这里使用了经典小角度关系:

    由于 Gaia 输入单位为 milliarcsecond:

    所以:

    7.7 有限距离位置传播

    当星体有可用正视差时,StarSky 可以构造其在 ICRS/BCRS 轴上的有限距离位置:

    自行切向角速度可转为切向线速度:

    传播后位置:

    代码:

    这仍然不包含径向速度,因此距离随时间的变化只来自切向位移形成的几何位置变化,而不是星体沿视线方向远离或靠近观察者。

    7.8 观察方向

    观察者位置为 observerBcrsAu。对于有限距离恒星:

    对于无可用正视差恒星:

    这使得相机或观察者在 AU 量级移动时,近距离恒星会出现视差方向变化,而无限远恒星保持方向稳定。

    8. 可视化建模与图形学原理

    渲染核心实现位于:

    8.1 为什么使用 sky sphere 思想

    真实恒星距离极远。在常规实时渲染中,若按真实 AU 或 parsec 比例放置 Mesh,会遇到:

    StarSky 采用“方向决定位置”的 sky sphere 思想:

    即所有星点都被投放到以相机附近为中心、半径固定的可视球面上。真实的天体测量位置只用来决定方向,不直接作为 Unity 世界坐标中的真实距离。

    8.2 跟随相机位置但不跟随旋转

    GaiaSkySphereRendererLateUpdate() 中调用 FollowTarget()

    这带来两个效果:

    在纯星空场景中,相机平移不会产生明显运动视差,除非运行时同步观察者 AU 并重建星表方向。

    8.3 从恒星记录到 VisualStar

    BuildVisualStars() 执行以下步骤:

    1. 遍历星表。

    2. photGMeanMag > visualMagnitudeLimit,跳过。

    3. 根据 propagateToVisualizationTime 决定使用参考方向或传播后的观察方向。

    4. DVector3 转为 Unity Vector3 并归一化。

    5. 记录 G 星等和 BP - RP 颜色指数。

    6. 按星等升序排序,即亮星在前。

    7. maxVisualStars > 0,截断为前 N 个最亮目标。

    星等越小越亮,因此排序比较为:

    8.4 星等到大小

    星点屏幕半径由 AnimationCurve sizeByMagnitude 决定:

    最终大小:

    这里故意采用艺术化曲线,而不是严格物理星等亮度公式。原因是屏幕上的星点不仅表示光通量,也承担可读性、抗闪烁和视觉密度控制的功能。

    8.5 星等到 alpha

    透明度使用:

    magnitude 接近 visualMagnitudeLimit 时,alpha 接近 minimumAlpha。当 magnitude 接近或亮于 -1.5 时,alpha 接近 1.0

    这种映射具有视觉目的:

    8.6 BP-RP 到色温

    颜色映射先计算:

    若 BP/RP 缺失,则回退为:

    随后 clamp 到:

    色温近似公式:

    该形式常用于从 B-V 类颜色指数估算黑体温度。这里将 Gaia BP-RP 作为视觉近似输入,并不等价于严格的 Gaia passband 光谱反演。

    8.7 色温到 RGB

    ColorFromTemperature() 将 Kelvin 映射到 RGB:

    这是一种常见的可视近似,可产生:

    8.8 Mesh billboard 表示

    每颗星生成 4 个顶点,顶点位置相同,均为:

    差异保存在 UV 中:

    每个顶点还写入:

    三角形索引:

    换言之,CPU 端 Mesh 并没有在世界空间中构造真实四边形面积。它只提供 billboard 中心、角标识、像素大小和颜色。真正的四边形展开在 Shader 顶点阶段完成。

    8.9 为什么在 Shader 中展开

    如果 CPU 端预先根据相机 right/up 生成四边形,则每次相机旋转都需要重建或更新顶点。StarSky 改为在顶点着色器中进行屏幕空间展开:

    核心是 clip space 与 NDC 的关系:

    屏幕中 1 像素对应的 NDC 距离约为:

    若希望在投影除法后移动 p 像素,则 clip space 中应移动:

    因此 Shader 里乘以 centerClip.w,使星点半径以屏幕像素为单位稳定,而不是随深度或 FOV 产生不期望的世界空间缩放。

    8.10 Additive blending

    Shader 设置:

    含义:

    输出颜色为:

    在 additive blending 下,alpha 主要作为 profile 权重的一部分参与颜色强度控制,而不是传统透明混合中的覆盖权重。

    8.11 星点 profile

    Fragment shader 提供两种 profile。

    Core/glow 模式:

    Gaussian / PSF 模式:

    其中 edgeFade 用于让单位圆边缘平滑衰减,避免正方形 billboard 的边界被看见。

    9. 程序工作流程

    9.1 离线导入流程

    AssetDatabaseGaiaCatalogBinarygaiadr3.csvGaiaDr3CsvImporterWindowUnity StarSky MenuUserAssetDatabaseGaiaCatalogBinarygaiadr3.csvGaiaDr3CsvImporterWindowUnity StarSky MenuUserloop[each row]StarSky > Import gaiadr3.csv From Project RootImportDefault()Open StreamReaderParse header and required columnsTryParseRecord()Filter invalid rowsOptionally keep non-positive parallaxWrite output .binRefresh()

    9.2 Demo 场景构建流程

    StarVisualSettingsPanelGaia Visual SkyStarSky Render CameraUnity SceneStarSkyDemoSceneBuilderUserStarVisualSettingsPanelGaia Visual SkyStarSky Render CameraUnity SceneStarSkyDemoSceneBuilderUserStarSky > Create Demo SceneNew empty sceneCreate Camera + AudioListenerSet initial ICRS rotationCreate GaiaSkySphereRendererAssign material and defaultsAdd StarRenderCameraControllerAdd StarVisualSettingsPanelSave Assets/StarSky/Scenes/StarSkyDemo.unityAdd to EditorBuildSettings

    9.3 Play Mode 运行流程

    yes

    yes

    no

    Play Mode Start

    GaiaSkySphereRenderer.Start

    rebuildOnStart?

    Clear generated children

    Load GaiaCatalog from StreamingAssets

    Resolve visualization TT

    Resolve observer AU

    BuildVisualStars

    useCubeSplitting?

    Split by dominant cube face

    Build mesh chunks

    MeshRenderer + additive billboard shader

    StarVisualSettingsPanel.Awake

    Clone runtime material

    Apply material sliders each frame

    StarRenderCameraController.Update

    Mouse look and movement

    Sync transform position to observer AU

    9.4 运行时重建触发

    星空 Mesh 不是每帧重建。它在以下情况下重建:

    材质参数,例如 _PixelScale_MinPixelRadius_Intensity_CoreSize_Profile_GaussianSigma,可每帧更新,不需要重建 Mesh。

    10. 运行时组件详解

    10.1 GaiaSkySphereRenderer

    路径:

    职责:

    关键字段:

    字段默认值含义
    catalogStreamingAssetsPathStarSky/gaiadr3_icrs_j2016.binStreamingAssets 下的星表路径
    rebuildOnStarttruePlay Mode 开始时是否自动重建
    propagateToVisualizationTimetrue是否传播到可视化时间
    visualizationTimeSourceIsoUtc使用 UTC 字符串或 TT JD
    visualizationUtcIso86012026-01-01T00:00:00Z默认 UTC 时间
    visualizationTtJulianDate2457389.0默认 TT JD
    visualizationTaiMinusUtcSeconds37.0UTC 到 TT 转换参数
    observerBcrsAuX/Y/Z0观察者位置,单位 AU
    centerTargetnull星空跟随的目标 Transform
    visualizationRadius100.0可视化天球半径
    visualMagnitudeLimit8.0G 星等过滤上限
    maxVisualStars00 表示不过滤数量
    useCubeSplittingtrue是否按立方体主轴拆分
    starMaterialnull星点材质
    sizeByMagnitude曲线星等到屏幕尺寸
    sizeScale1.0星点大小倍率
    minimumAlpha0.08最暗星点 alpha 下限

    10.1.1 Mesh chunk 大小

    每颗星 4 个顶点,所以单个 Mesh 最多:

    这低于 16-bit index buffer 的常见上限 65535,避免必须切换到 32-bit index format。同时每颗星 2 个三角形,单 chunk 最多:

    10.1.2 Cube splitting

    CubeSplit() 根据方向向量绝对值最大的轴将恒星分到 6 个列表:

    判定:

    意义:

    10.2 StarRenderCameraController

    路径:

    职责:

    10.2.1 鼠标视角

    按住右键时:

    这里 yaw 采用 Unity Vector3.up,pitch 采用相机自身 right。由于 ICRS 世界使用 +Z 表示天球北极,而 Demo 控制器仍采用常规 Unity +Y yaw 轴,这是一种用于交互便利的相机控制约定,不应被误解为天文学坐标变换。

    10.2.2 移动

    局部输入方向:

    位移:

    10.2.3 Unity 位置到 AU

    syncTransformPositionToObserverAu = true

    默认:

    也就是相机移动 1 Unity unit,对应观察者位置改变 0.01 AU。注意,改变观察者字段本身不会自动重建星表;需要通过面板或代码调用 Rebuild() 才会把新观察者位置应用到恒星方向。

    10.3 StarVisualSettingsPanel

    路径:

    职责:

    运行时默认参数:

    控件默认值作用
    Pixel Scale1.0星点半径全局倍率
    Min Pixel Radius1.15最小屏幕像素半径
    Intensity2.6additive 输出强度
    Gaussian / PSF Profiletrue是否使用 Gaussian 模型
    Gaussian Sigma0.42Gaussian 宽度
    Core Size0.18Core/glow 模式核心大小
    Magnitude Limit8.0可视 G 星等上限

    10.4 GaiaCatalog

    路径:

    职责:

    10.5 GaiaCatalogBinary

    路径:

    职责:

    10.6 GaiaStarRecord

    路径:

    职责:

    10.7 GaiaStarPropagator

    路径:

    职责:

    10.8 JulianDateTT

    路径:

    职责:

    10.9 DVector3

    路径:

    职责:

    使用 double 的原因是天体测量计算涉及极小角度、AU、parsec 等尺度,若过早使用 float 容易积累精度误差。最终进入 Unity Mesh 前再转为 float。

    11. 编辑器工具详解

    11.1 GaiaDr3CsvImporterWindow

    路径:

    菜单:

    窗口功能:

    默认导入函数:

    默认路径:

    11.2 ImportStats

    导入统计结构:

    字段含义
    readRows已读取的数据行数,不包含表头
    importedRows成功写入记录数
    invalidRows空行、字段不足或解析失败行数
    nonPositiveParallaxRows非正视差行数

    11.3 StarSkyDemoSceneBuilder

    路径:

    菜单:

    11.3.1 创建场景

    CreateDemoScene() 会:

    11.3.2 ICRS 初始相机旋转

    Demo 初始朝向由:

    构造。其 forward 为:

    其 up 使用局部 north 向量:

    最终:

    这样相机初始画面不仅看向指定天球方向,还尽量让画面竖直方向对应天球北。

    11.3.3 验证场景

    ValidateDemoScene() 执行:

    11.3.4 导出预览

    ExportDemoPreviewPng() 执行:

    12. Shader 详解

    Shader 路径:

    Shader 名称:

    12.1 Properties

    Property默认值范围作用
    _Intensity2.5[0.1, 8]additive 亮度倍率
    _CoreSize0.18[0.01, 0.8]Core/glow 模式核心半径
    _Profile1float<0.5 为 core/glow,否则 Gaussian
    _GaussianSigma0.42[0.12, 0.85]Gaussian 标准差
    _PixelScale1.0[0.1, 8]星点像素半径倍率
    _MinPixelRadius1.15[0, 4]最小像素半径

    默认材质:

    材质当前保存值:

    12.2 Vertex input

    语义:

    12.3 Vertex output

    输出中不需要传递世界坐标或法线,因为星点不参与光照。

    12.4 Clip-space expansion 推导

    Unity 将 object space 顶点变换到 clip space:

    透视除法后:

    屏幕宽度为 W,高度为 H。若希望 NDC 中移动半径 r 像素:

    对应 clip space:

    这就是 Shader 中:

    的来源。

    12.5 Fragment profile

    片元阶段将 uv 映射到以中心为原点的单位方形:

    d > 1 附近,edge fade 让 Gaussian profile 平滑消失。由于四边形本身仍覆盖一个正方形,profile 的圆形衰减负责让星点视觉上成为圆形。

    12.6 渲染队列与深度

    这意味着:

    13. 项目约定

    13.1 命名空间

    13.2 目录约定

    13.3 数据约定

    13.4 时间约定

    13.5 精度约定

    13.6 资源生命周期约定

    GaiaSkySphereRenderer 生成的星点子对象:

    这样避免运行时重建生成的临时 Mesh 污染场景文件。

    13.7 材质修改约定

    StarVisualSettingsPanel 在运行时克隆材质:

    随后将 skyRenderer.starMaterial 指向克隆材质。这样滑块调整不会直接覆盖项目里的 GaiaStarVisualMaterial.mat

    13.8 视觉参数约定

    14. 复杂度与性能设计

    14.1 导入复杂度

    CSV 导入:

    其中 N 为 CSV 数据行数量。导入器会将有效记录累积到 List<GaiaStarRecord> 后一次性写入二进制文件。

    14.2 加载复杂度

    二进制加载:

    读取时创建 GaiaStarRecord[],每条记录约 60 字节载荷,不含数组对象开销。

    14.3 运行时重建复杂度

    GaiaSkySphereRenderer.Rebuild()

    其中:

    当前实现会对可视星排序,以便 maxVisualStars 截断时保留最亮星。若未来星表更大,且只需要 top K,可以改为 partial selection 或 heap。

    14.4 Mesh 内存估算

    每颗星 4 个顶点。每顶点至少包含:

    仅这些数组近似:

    再加 triangle index:

    Unity 内部 Mesh 上传和托管数组还有额外开销。因此 magnitude limit 和 maxVisualStars 是实际项目中控制内存与渲染成本的关键参数。

    14.5 为什么不直接用 Point Primitive

    Unity 常规 Mesh 点图元和不同图形 API 对 point size 的支持并不稳定,而且很难实现跨平台一致的柔和星点 profile。使用四边形 billboard 的优势是:

    14.6 为什么不每帧传播

    每帧对几十万颗星执行时间传播、视差观测和 Mesh 更新成本很高,且星空变化在短时间交互中通常不可见。StarSky 选择:

    这符合“交互调参”和“天文时间切换”两个使用场景。

    15. 验证与复现实验

    15.1 编辑器内验证

    推荐最小验证:

    1. 执行 StarSky > Import gaiadr3.csv From Project Root

    2. 确认 console 输出 imported star 数量。

    3. 执行 StarSky > Create Demo Scene

    4. 执行 StarSky > Validate Demo Scene

    5. 打开 Demo 场景进入 Play Mode。

    6. 使用 F1 调节 Magnitude LimitPixel Scale,检查星点密度和大小变化。

    15.2 命令行批处理示例

    在 Windows 上,可使用 Unity batchmode 调用静态编辑器方法。根据本仓库的 Unity 版本,示例为:

    创建 Demo 场景:

    验证 Demo 场景:

    导出预览:

    15.3 数据完整性检查

    当前二进制星表头应满足:

    若运行时报错:

    说明运行时文件不是当前格式,或被旧版本/其他工具覆盖。

    15.4 视觉正确性检查

    可以用以下经验检查结果是否合理:

    16. 已知边界与近似

    16.1 天体测量近似

    当前实现:

    因此它适合星空背景、视觉演示和交互探索,不适合作为高精度天文测量工具(需要额外根据星图数据进行实现,可视化渲染层与天文导航测量层应进行分离设计)。

    16.2 光度近似

    当前实现:

    这意味着星点视觉效果是“科学数据驱动的艺术化可视化”,不是严格的辐射传输结果。

    16.3 渲染近似

    当前实现:

    对于沉浸式星空显示,这些选择可获得更好的稳定性和实时性。

    16.4 工程边界

    当前实现:

    17. 一些扩展路线

    暂时不做计划。

    17.1 更精确的天体测量

    可扩展项:

    17.2 更真实的光度与颜色

    可扩展项:

    17.3 更大规模的渲染

    可扩展项:

    17.4 更好的工具链

    可扩展项:

    18. 故障排查

    18.1 Play 后没有星星

    检查:

    18.2 星点太小或闪烁

    调整:

    18.3 画面过亮

    调整:

    18.4 修改时间或观察者后没有变化

    原因:

    18.5 导入 CSV 失败

    检查:

    附录 A. 关键公式汇总

    A.1 RA/Dec 到 ICRS 单位向量

    A.2 天球 east/north 基

    A.3 自行切向导数

    A.4 TT 年差

    A.5 无限远方向传播

    A.6 视差到距离

    A.7 有限距离位置传播

    A.8 观察方向

    A.9 UTC 到 TT

    A.10 BP-RP 到色温

    其中:

    A.11 Clip-space 像素展开

    附录 B. 文件到职责索引

    文件职责
    Assets/StarSky/Runtime/Catalog/GaiaStarRecord.cs单颗恒星数据结构
    Assets/StarSky/Runtime/Catalog/GaiaCatalogBinary.cs二进制星表读写
    Assets/StarSky/Runtime/Catalog/GaiaCatalog.cs星表数组封装和加载入口
    Assets/StarSky/Runtime/Catalog/GaiaStarPropagator.csICRS 方向、自行、视差、观察方向传播
    Assets/StarSky/Runtime/JulianDateTT.csTT 儒略日、UTC 转 TT、J2016 年差
    Assets/StarSky/Runtime/Math/DVector3.csdouble 精度三维向量
    Assets/StarSky/Runtime/Visualization/GaiaSkySphereRenderer.cs星表加载、过滤、可视星生成、Mesh chunk 构建
    Assets/StarSky/Runtime/Visualization/StarRenderCameraController.csDemo 相机控制和观察者 AU 同步
    Assets/StarSky/Runtime/Visualization/StarVisualSettingsPanel.cs运行时 IMGUI 参数面板
    Assets/StarSky/Runtime/Visualization/Shaders/StarSkyAdditiveStarBillboard.shader屏幕空间 billboard 展开和 additive 星点着色
    Assets/StarSky/Runtime/Visualization/Materials/GaiaStarVisualMaterial.mat默认星点材质
    Assets/StarSky/Editor/GaiaDr3CsvImporterWindow.csCSV 导入窗口与默认导入菜单
    Assets/StarSky/Editor/Demo/StarSkyDemoSceneBuilder.csDemo 场景创建、验证和 PNG 导出
    Assets/StarSky/Runtime/StarSky.Runtime.asmdefRuntime assembly 定义
    Assets/StarSky/Editor/StarSky.Editor.asmdefEditor assembly 定义

    附录 C. 术语表

    术语说明
    Gaia DR3Gaia mission 的第三次数据发布
    ICRSInternational Celestial Reference System,国际天球参考系
    BCRSBarycentric Celestial Reference System,太阳系质心天球参考系
    RA / alphaRight Ascension,赤经
    Dec / deltaDeclination,赤纬
    Parallax视差,用于估计距离
    Proper motion自行,恒星在天球上的角速度
    pmraGaia 中的 mu_alpha_star,即 d(alpha)/dt * cos(delta)
    pmdec赤纬方向自行
    TTTerrestrial Time,地球时
    TAIInternational Atomic Time,国际原子时
    JDJulian Date,儒略日
    AUAstronomical Unit,天文单位
    parsec秒差距,约等于 206264.806 AU
    BP-RPGaia 蓝光度与红光度星等差,用作颜色指数
    Billboard始终面向屏幕或相机的二维图元
    Clip space顶点经 MVP 矩阵变换后的裁剪空间
    NDCNormalized Device Coordinates,透视除法后的规范化设备坐标
    Additive blending加法混合,常用于光源、辉光和星点叠加