三维可视化实践:用立方体同时展示等高线与方向标记

做三维可视化时,我经常碰到一个很现实的问题:数据本身是三维的,但传统平面图只能表达二维关系。前阵子做一个地形相关的模拟项目,需要同时展示高度变化和方向趋势,一开始画了好几版平面等高线图,怎么看都别扭——要么丢失了空间感,要么方向信息挤成一片。后来我干脆把整个数据场“贴”到一个立方体上,做了个带颜色和标注的立方体展示方案,把等高线和方向标记直接画在立方体表面,效果立刻就不一样了。

这个方案我管它叫 ColoredAnnotatedCube,核心思路很简单:用立方体展开的多个视图来承载等高线,用颜色属性表达数值高低,再用箭头和文字标注方向信息。它不是什么高深算法,胜在直观、好实现、可复现性强。适合做地形分析、气象场展示、结构仿真结果的同事参考,也适合刚接触三维可视化的学生练手。

下面我从设计思路、数据准备、核心实现到踩坑实录,完整拆一遍这个方案,希望能帮正要走这条路的人省点时间。

1. 项目整体设计与方案拆解

1.1 为什么用立方体而不是曲面

一开始我尝试过直接把等高线画在地形曲面上,效果其实也不错,但有两个致命问题:

第一,曲面视角一旦旋转,部分等高线会被遮挡,想看某个方向的完整梯度轮廓,得反复调整相机角度。第二,曲面上不容易同时标注多个方向的箭头,标注文字会跟着曲面扭曲,可读性很差。

换成立方体之后,每个面都是平面,等高线可以平铺在面上,视觉上非常干净。观测者只要把立方体转一圈,就能看到六个方向的完整数据分布,完全不存在遮挡问题。更重要的是,立方体天然自带方向语义——上、下、左、右、前、后,对应到真实世界的方向标记时,不需要额外的坐标解释。

实际做下来,立方体的另一个好处是你可以在相邻面的公共边上做连续性校验。比如前面和右面共享一条棱,两条等高线在公共棱上如果数值对不上,一眼就能看出来,这在曲面模型上很难快速检查。

1.2 等高线与方向标记的组合逻辑

项目标题里写的是“等高线与方向标记”,这两个元素放在一起,并不是简单的叠加。我的理解是:

等高线解决的是“数值在哪里变化”的问题,方向标记解决的是“变化往哪个方向走”的问题。一个描述静态分布,一个描述动态趋势,二者互补。比如等值线在某个区域密集,说明梯度大,但到底是从左往右增大,还是从中心向四周扩散,这就要靠方向箭头来指明。

所以整个展示逻辑分两层:

  • 底层是颜色映射,把数值映射成颜色渐变,作为背景参考。
  • 中层是等高线,把同数值的点连起来,形成明确的量化参考。
  • 顶层是方向箭头和文字标注,表达趋势意图。

三层叠加在立方体上,信息层次非常清楚。用我实际项目的例子来说,模拟的是某区域的高程分布,颜色从深蓝到深红表示海拔从低到高,等高线每隔一定数值画一条,方向箭头直接标注“此面朝向正北”“气流方向由西向东”这类关键结论。

1.3 配色与标注的取舍原则

这个方案最容易翻车的地方是配色。我第一版用了彩虹色渐变,红橙黄绿青蓝紫全上,结果渲染出来像儿童玩具,等高线完全淹没在颜色里。

后来我总结了一条原则:等高线是结构化信息,颜色是背景信息,两者必须拉开对比度。背景用低饱和度的渐变色,等高线用高对比的深色线条,方向标记再用另一种互补色。我实际采用的是背景用白到蓝的渐变表示高程,等高线用深灰色实线,方向箭头用橙红色,文字标注用黑色带白色描边。这样无论截图还是打印,信息都不会糊成一片。

标注的数量也要克制。每个面我只标两到三个关键方向,而不是把所有方向全标上去。标注太多,视觉密度过高,反而失去了“一眼看懂”的效果。

2. 核心细节解析与实操要点

2.1 坐标系定义是最容易出错的第一步

做这个项目,第一步不是写画图代码,而是把坐标系定清楚。很多人的程序跑出来方向不对,问题不在算法,而在坐标系定义前后不一致。

我采用的约定如下:

  • X 轴:东西方向,东为正。
  • Y 轴:南北方向,北为正。
  • Z 轴:高度方向,垂直向上为正。

立方体的六个面对应关系为:顶面是 Z 方向的俯视图,底面是反过来看的仰视图,前后面是 YZ 平面,左右面是 XZ 平面。这里有个容易绕晕的点:底面(-Z面)从下方仰视时,X 轴方向和顶面正好相反,如果你在顶面标注“东在右”,底面看到“东在左”才是正确的。做标注逻辑之前,把每个面的基向量算一遍,写进代码注释里,能省掉后面一大半调试时间。

还有一个细节是三维坐标系的手性。我用的工具是右手坐标系,但在某些图形库或三维引擎里默认是左手坐标系,直接拿现成算好的三角形面片去渲染,立方体朝向会整体翻转。解决的笨办法是渲染之前放一个已知方向数据的测试对象,把输出截图和真实方向对照一下,确认一致再继续。

2.2 数据采样与高度场构建

这个方案本质上处理的是一个三维数据场,但在立方体表面绘制,实际需要的是每个面上的二维数据切片。我处理的是一组规则网格采样数据,每个采样点包含 X、Y、Z 坐标和数值属性。

构建数据时需要注意边界处理。立方体有十二条棱和八个顶点,棱上的数据会被两个面共用,顶点数据会被三个面共用。我第一版没有存公共数据,导致相邻面上等高线在棱边位置差出半个格距,视觉上出现明显的错位。正确的做法是建立一套“共享顶点索引”,棱上和顶点上的数据在计算时只取一次,面绘制时引用同一份数值。

数据量的控制也值得提一句。网格分辨率太粗,等高线会呈锯齿状;太细,计算量和存储空间成倍增长。我经过几次尝试,发现常规项目用 100x100 的网格密度就够用,细节要求高的可以用到 200x200,再往上收益就不明显了。

2.3 连续性与方向标记的退化场景

方向标记需要特别注意退化场景。所谓退化,就是某个区域数值没有变化,方向矢量的模长接近零。这时候箭头指向完全随机,画出来会给人一种“数据错了”的错觉。

我的处理策略是设置一个阈值,比如矢量模长小于最大模长的 5% 时,不绘制方向箭头,而是用一个点标记表示“此处为极值区或平坦区”。这个细节很小,但做出来效果非常专业,能避免低级误导。

另外,等高线在每条棱上的连续性也要单独校验。投影到平面上的等高线如果跨面衔接,相邻面上的线必须有相同的起点和终点。我写了一个校验脚本,遍历棱上全部等高线交点,自动检查数值是否一致,误差超标的直接标红报错。虽然项目不大,但这个自动校验脚本帮我发现了三次低级错误,很有必要做。

3. 核心实现:从数据到成图的完整流程

3.1 工具链选型与理由

这个方案本身对工具没有强依赖,我用的是基于 Python 的三维可视化库,配合数值计算库完成全部流程。选择它们的理由很简单:生态成熟、文档齐全、容易与数据处理流程接上。

如果你有自己的偏好工具,比如专业三维软件或者 Web 端可视化库,思路完全一样,只是接口和数据结构需要微调。核心逻辑始终是三步:构建立方体表面网格、把数据贴到面上、叠加等高线和方向标注。

3.2 步骤一:生成立方体表面网格

第一步是把立方体拆成六个面,每个面变成一个二维网格。

立方体边长设置为 10 个长度单位,中心在原点。六个面分别是 X=5、X=-5、Y=5、Y=-5、Z=5、Z=-5。每个面用 100x100 的网格细分,生成顶点坐标和三角面片索引。

这个步骤看起来简单,但有一个坑:六个面的顶点索引必须要能共享,否则同一个空间位置会被重复计算多次。对于数据量小的场景看不出问题,一旦数据量上来或需要做动态更新,性能就会明显下降。我更推荐先建立顶点数组,再按顶点索引绘制三角面片的方式组织数据。

3.3 步骤二:将数据映射到立方体表面

每个面的顶点都有一组三维坐标,而数据场是三维的,所以下一步就是把数据场里对应位置的值“取”出来贴到面上。

这一步的难点不在取值,而在插值。我的数据场是规则网格存储的,立方体表面的顶点不一定正好落在网格点上。最稳妥的做法是用最近邻插值,计算量小,结果稳定。如果后面需要做动画或参数扫描,可以考虑带权重的插值,效果会更顺滑,注意别过度平滑掉真实细节。

数据贴到面之后,需要归一化到 [0,1] 区间,再做颜色映射。我用的是一套连续渐变色标,从低值到高值依次为深蓝、浅蓝、白、浅橙、深红。这个序列对绝大多数数据类型都适用,避开彩虹色那种“每段都鲜艳、信息等权”的问题。

3.4 步骤三:等高线生成与叠加

等高线生成我采用的是一种经典的网格追踪算法,思路可以通俗理解成“找零点的过程”:

  • 遍历每个网格单元,判断相邻格点的数值是否跨越了目标等值线的数值。
  • 如果跨过,就在这条边上用线性插值求出精确交点。
  • 把同一等值线的交点按顺序连接,连成一条线。

关键参数是等值线的数值列表。我用的是最小值到最大值之间取 8 到 12 条等值线,间隔均匀。间隔太多会显得杂乱,太少丢失细节。实际项目里需要根据数据分布灵活调整,如果变化集中在某一个较窄的数值区间,就需要在那个区间加密等值线。

要注意的是,等高线绘制在面上之后,属于“叠加层”。渲染顺序上一定要保证等高线在所有面片之后绘制,否则会被面片遮挡。我踩过这个坑,第一次做的时候有一部分线条被后面的面挡住,当时还以为是算法算错了,排查了很久才意识到是图层顺序问题。

3.5 步骤四:方向标记与标注文字

方向标记分成两类:一类是全局方向,另一类是局部梯度方向。

全局方向标记直接画在立方体的某个角上,用三个箭头和字母 X、Y、Z 标注出坐标轴方向。这类标记是静态的,不随面的切换而变化。局部梯度方向则是画在每个面的等高线密集区域,表示数值增加最快的方向。我用的做法是计算每个面的中心区域梯度方向,取模长最大的几个点画箭头,避免全部点上画箭头导致画面过密。

文字标注方面,我用的是矢量字体,配合白边描边,避免文字和背景颜色融合看不清。文字大小不要使用固定屏幕像素,而是绑定到世界坐标的尺寸,这样旋转视角时文字和立方体一起缩放,不会出现文字比立方体还大的尴尬情况。

4. 实操记录:一个具体案例的全过程

4.1 模拟数据描述

我在自己的实践项目里用的是一组模拟高程数据,区域范围设置成 100x100 的规则网格,数值分布模拟了一个“中部隆起、四周缓降”的地形。数据里特意加入了两个局部凹陷,用来检验等高线在极端区域的表达效果。模拟数据的数值范围在 0 到 100 之间,单位设为米。

方向信息上,我预先定义了一个“主导方向”场,模拟从西南向东北递增的趋势,这可以通过在原有地形数值上叠加一个线性梯度实现。做完这一步后,每个位置上同时有高程值和方向矢量值,正好对应项目标题里的“等高线与方向标记”两个需求。

4.2 分步产出与实时检查

整个流程做下来,我习惯每完成一步就渲染一张静态图检查,而不是所有步骤做完再一次看效果。

检查项包括:六个面的颜色分布是否符合预期数据趋势、等高线是否在棱边位置对齐、方向箭头是否落在数值变化剧烈的位置而不是均匀散布。

第一次做的时候,发现顶面和前面对不上,前面的高程数据明显比顶面高出不小。排查后发现是数据采样时把 X 和 Y 坐标搞反了,顶面取的是 [X,Y],前面取的是 [X,Z],但我的数据场存储顺序是 [X,Y,Z],导致前面读到的是错误的平面切片。把索引顺序修正之后,六个面数据对齐,问题就消失了。

4.3 渲染输出与参数整理

渲染输出时,我设置了固定的视角序列,分别是正视、俯视、45度角斜视,以及绕立方体旋转一周的视频输出。这样既能看到整体,也能看清每个面的细节。

导出图片时有一个参数组合供参考:分辨率为 1920x1920,抗锯齿开启,颜色管理使用标准线性空间,输出的 PNG 图片在屏幕上还原度很高。导出视频时,我设置的帧率是 30,共旋转 360 度,用时约 10 秒,画面非常流畅。

参数整理阶段,我把所有可调参数集中到一个配置区,包括立方体边长、网格细化程度、等值线数量、颜色映射区间、箭头长度、文字大小。后续换数据集时只需要改配置,不用改核心逻辑,方便很多。

5. 常见问题与排查技巧实录

5.1 问题速查表

下面这个表格是本项目中最常遇到的问题和对应的解决思路,按排查顺序排列:

现象可能原因解决方式
相邻面等高线在棱边明显错位共享顶点数据未统一存储建立共享顶点索引,棱上数据只取一次
方向箭头指向杂乱无规律矢量模长接近零的退化区域未处理设置模长阈值,小于阈值的区域只画圆点
等高线被面片遮挡看不清渲染顺序错误调整绘制顺序,等高线最后绘制
颜色分布与预期趋势相反数据归一化时使用错误的上下界检查数值范围,用全局上下界而非局部
文字标注旋转后模糊文字用固定像素尺寸改为世界坐标尺寸,跟随立方体缩放
顶面和前面数据数值对不上采样时坐标索引顺序错误检查 XYZ 的索引映射关系

5.2 排查手段:分面渲染与数据校验

遇到问题,我建议先做一个“分面渲染”——把六个面分别渲染成单独的图片,每个面单独检查。这个方法看起来笨,但能最快定位问题出在数据层还是渲染层。

我实际遇到过一次等高线整体漂移,分面渲染时发现只有前面和后面漂移,左右面正常。顺着这个线索查下去,结果是前后面的法向量方向相反,造成等高线插值顺序被翻转。这个问题的排查效率,直接看整体图很难看出来,分面图一目了然。

另外一个有效的排查手段是数据校验脚本。我在项目里写了一个函数,专门检查每条棱上的数据连续性和等高线交点匹配性。多跑几次脚本,把报错信息当做 debug 线索,比自己盯着屏幕猜要快得多。

5.3 优化建议:性能与美观兼顾

性能优化上,网格细分是个双刃剑。细分高则视觉效果细腻,但渲染压力大;细分低则速度快,但线条锯齿明显。我一般建议先做低分辨率版本确认逻辑没问题,再调高细分做最终渲染,能省不少时间。

美化方面有三个小建议:

  • 立方体面片之间加一圈浅灰色描边,让六个面的边界更清晰。
  • 等高线用不同透明度区分密集程度,密集区域透明度降低。
  • 背景用浅灰色,不要用纯白,纯白背景下浅色渐变色块边缘会有眩光感。

这三个改动成本很低,但整个图的质感和专业度会明显提升。

6. 这个方案还能怎么用

做完这个项目之后,我明显感觉到 ColoredAnnotatedCube 这类方案的应用面比想象中宽。

如果要我做个简单的路线图,这个方案可以往三个方向延伸:一是时间维度,把不同时间帧的数据场做成动画序列,在立方体表面连续播放,可以清晰看到等高线运动过程;二是多维属性,把数值属性从单一场景扩展成多属性场景,比如同时展示温度和流向,可以用不同颜色映射层叠加;三是直接做成交互式可视化,让用户可以手动旋转立方体,点击某个面查看局部数值详情。

这三个方向都不需要改动核心架构,只需要在外围加功能,扩展性很好。就我个人经验来看,三维数据展示难的不是算法,而是如何在“准确表达信息”和“让人看得懂”之间找到平衡。这个方案就是在找这个平衡,而且效果挺实用。

最后分享一个小技巧:不管你要展示什么样的三维数据,在做任何复杂操作之前,先拿一个最简单的已知数据测试一遍全流程。比如拿一个“数值沿 X 轴线性递增”的数据场跑通整个管线,确认方向、颜色、等高线全部正确,再换上真实数据。实测下来,这个习惯至少帮我避免了好几次“做完才发现方向反了”的返工。

踩过几次坑之后,我的体会是:可视化方案的价值不在于技术多花哨,而在于能不能一眼把数据里的关键信息讲清楚。ColoredAnnotatedCube 这个思路,恰好就是这个目标的一个很稳的落地方案。

相关新闻

深度拆解 Hy Memory 2.0:chat / working / coding 三类记忆如何在一套框架里共存

深度拆解 Hy Memory 2.0:chat / working / coding 三类记忆如何在一套框架里共存

深度拆解 Hy Memory 2.0:chat / working / coding 三类记忆如何在一套框架里共存 【免费下载链接】Hy-Memory 项目地址: https://gitcode.com/gh_mirrors/hy/Hy-Memory 2026 年 10 月,腾讯混元把 Hy Memory 2.0 整体开源:hy-memory2.…

2026/10/20 2:39:36 阅读更多 →
把DeepSeek装进PentAGI当大脑:国产模型跑AI渗透的省钱配置指南

把DeepSeek装进PentAGI当大脑:国产模型跑AI渗透的省钱配置指南

把DeepSeek装进PentAGI当大脑:国产模型跑AI渗透的省钱配置指南 【免费下载链接】pentagi Fully autonomous AI Agents system capable of performing complex penetration testing tasks 项目地址: https://gitcode.com/GitHub_Trending/pe/pentagi 这两天&a…

2026/10/20 2:39:36 阅读更多 →
刚刚!Home Assistant 2026.10 正式发布:全新卡片 + MCP 加持,AI 要接管你的家了

刚刚!Home Assistant 2026.10 正式发布:全新卡片 + MCP 加持,AI 要接管你的家了

刚刚!Home Assistant 2026.10 正式发布:全新卡片 MCP 加持,AI 要接管你的家了 【免费下载链接】core :house_with_garden: Open source home automation that puts local control and privacy first. 项目地址: https://gitcode.com/GitHu…

2026/10/20 2:39:36 阅读更多 →

最新新闻

SQL布尔盲注实战:从sqli-labs第十五、十六关拆解无回显渗透

SQL布尔盲注实战:从sqli-labs第十五、十六关拆解无回显渗透

1. 项目概述:从“看不见的输入框”开始理解布尔盲注的真实战场你有没有遇到过这样的页面:一个登录框,输入错误的账号密码,它不告诉你“用户名不存在”或“密码错误”,只冷冷地回一句“登录失败”;再试一次&…

2026/10/20 3:28:05 阅读更多 →
免费高精度IP定位查询入口:数据源拆解、实测对比与评估指南

免费高精度IP定位查询入口:数据源拆解、实测对比与评估指南

这些年我见过太多人带着“免费高精度IP地址定位查询入口”这个想法找上门,搜了一圈之后拿回来的要么是某个商业平台体验版,要么是挂着“全球精准定位”横幅、实际只能定位到城市甚至省份的普通接口。今天不绕弯子,直接把这几个问题拆开聊&…

2026/10/20 3:28:05 阅读更多 →
推理引擎原理与优化:从计算图到性能调优的完整指南

推理引擎原理与优化:从计算图到性能调优的完整指南

做推理引擎这几年,我最大的感受是:很多人手上的模型跑得起来,但跑不快、跑不稳,出了问题也不知道该从哪一层开始查。根本原因是把“AI 模型”和“推理引擎”当成两个隔离的黑盒——模型文件一丢,引擎一跑,结…

2026/10/20 3:28:05 阅读更多 →
模型压缩 - 量化剪枝边缘部署实战

模型压缩 - 量化剪枝边缘部署实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 3:28:05 阅读更多 →
SpringBoot+Vue全栈实战:服装销售平台管理系统设计

SpringBoot+Vue全栈实战:服装销售平台管理系统设计

不是毕业设计模板,也不是网上那些CtrlC就能跑的教学项目。我最近刚把一个服装销售平台管理系统从零搭完,项目代号就叫“衣依”,技术栈是SpringBoot Vue MyBatis MySQL。从需求梳理到数据库设计,再到前后端联调、部署上线&#…

2026/10/20 3:28:05 阅读更多 →
调教Stable Diffusion注意力机制,让出图更清晰

调教Stable Diffusion注意力机制,让出图更清晰

1. 先别急着加高清修复,问题多半出在注意力分配上先说个不少人踩过的坑:用Stable Diffusion出图,总感觉边缘发虚、细节糊成一团,第一反应往往是把分辨率从512拉高到1024,或者直接开Hires. fix,结果要么显存…

2026/10/20 3:27:05 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →