最近一个做农业信息化的老朋友找我,说手上接了个智慧农场项目,设备采购、传感器布点都谈好了,结果客户验收第一句话是:“能不能先给我看一块3D大屏?”我当时就笑了,这太真实了。农业数字化项目做到最后,多半都要靠可视化大屏来承载汇报和展示,没有直观的3D场景,前面几十个传感器、十几台农机终端在客户眼里几乎没有感知度。
他那个项目正好覆盖“耕、种、管、收”全流程,地块分散在几百亩范围内,涉及土壤墒情、气象监测、虫情测报、水肥灌溉、农机调度一堆子系统。纯做2D图表当然也能把数据交代清楚,但地块之间谁先谁后、哪块地浇过水、哪台收割机还在哪个田块里跑,全都缺乏空间感。最后我们用基于HT引擎的零代码路线把3D场景搭了起来,从确认需求到能演示的DEMO,差不多两周时间,整套耕种管收链路在场景里跑通,客户当场拍板。这篇文章就围绕这个项目,把从需求拆解、架构选型、零代码搭建到几个核心场景的实现思路、踩坑记录都梳理一遍。
1. 项目背景与需求拆解:智慧农场的可视化到底要解决什么
1.1 耕种管收全链条的数字化痛点
先说业务本身。一个成规模的现代化农场,日常管理不是“种下去就等着收”,而是环环相扣的连续作业。
耕整地阶段要关注的是农机在哪个地块作业、深松深度够不够、作业面积和油耗是否合理;播种阶段要看播种机的行进路径、实际播量、种子和肥料的库存消耗;田间管理阶段更复杂,墒情传感器分布在各地块,小型气象站实时上报温湿度、风速、降雨,虫情测报灯定时拍回害虫照片,灌溉阀门和水肥一体机还要根据阈值自动打开;到了收获阶段,收割机的位置、已收面积、单产数据、粮仓库存全都需要汇总。
这些数据来自完全不同的系统,有走Modbus协议的传感器,有第三方农机平台通过API推过来的CAN总线数据,还有人工填报的农事记录。没有统一的可视化时,生产主管要么在多个系统之间来回切,要么靠微信群里的人工汇报。所以这个项目的核心目标不是“做一张好看的大屏”,而是把耕、种、管、收四个环节的空间位置和实时状态集中到一个可交互的3D场景里,做到“低头看数据、抬头看全局”。
1.2 为什么选3D可视化而非传统2D大屏
接触过数据大屏的朋友都知道,纯2D方案在展示KPI、趋势曲线、占比饼图这些统计型数据时效率很高,信息密度可以做得很大。但智慧农场本质上是一个空间管理问题。
举几个实际场景:某块地的墒情告警,2D大屏上只能看到“三号地块湿度偏低”的列表,但3D场景里你能直接看到这块地在整个农场的哪个方位、周围是哪个泵房、管路从哪里过来、距离最近的灌溉阀是不是已经打开;收割机调度也一样,2D图表只能显示“农机A正在工作”,但3D场景里农机的位置、行进方向、已经收割的田块边界都是一目了然的。农场管理者最关心的是“哪儿、什么事、有多严重、附近有什么可用资源”,这种空间关联性恰恰是2D大屏的短板。
3D可视化的另一个好处是汇报和演示价值。我们项目里很多驾驶舱、展厅大屏场景,客户领导不一定看表格,但会被一个能自由旋转、放大缩小的数字农场镇住。它解决的是“感知和信任”问题,这在农业信息化项目里往往是决定验收是否顺利的关键因素。
1.3 项目边界与用户画像
这个项目的用户大致分三类,每类的使用场景和关注点完全不一样:
- 园区管理层:在展厅大屏上看整体态势,关注总面积、总产量、告警数量、设备在线率这些宏观指标。
- 生产主管:在办公室PC上查看每日农事进度、农机作业轨迹、浇水施肥的统计报表,偶尔要回看历史数据。
- 现场值班人员:在平板或手机上实时接收告警、查看具体设备状态、执行远程开关阀门等操作。
所以我们的可视化方案不能只做一台大屏就完事。HT引擎的优势在这里体现得很明显:一套3D场景数据结构可以同时输出到大屏、PC浏览器和移动端,只需要做布局和交互层面的适配。项目边界也按这个思路划定:完成3D农场场景搭建、数据接入、核心告警联动、以及三种终端的基本交互,复杂农机自动驾驶、AI农事决策这类内容放到二期。
2. 基于HT引擎的整体设计思路与架构选型
2.1 HT引擎的定位与核心能力
这里说的HT引擎,指的是HT for Web这一类的Web端可视化引擎。它基于WebGL渲染3D场景,同时保留2D拓扑、图表、面板等组件能力,最大特点是场景结构可以用JSON描述,配套的可视化编辑器支持通过拖拽、配置的方式搭建场景,也就是我们常说的零代码建模。
我选这类引擎而不是从底层直接用Three.js,理由很实际。Three.js确实灵活,但智慧农场这样的项目,需要大量对象摆放、反复调整位置、持续绑定数据,如果每一步都靠手写代码,现场实施效率会非常低。HT引擎把场景中的节点、面板、动画、数据绑定都封装成可视化操作,实施人员经过短时间培训就能上手,开发人员只需要关注数据接口和复杂逻辑。这也是“零代码”在这个项目里的真正价值:不是不写代码,而是80%的重复性界面工作不再需要代码。
2.2 场景组织与数据分层
开始搭建之前,我们把整个3D场景分成四层,这个分层对后续长期维护很重要。
- 基础地理层:农场地块边界、地形起伏、道路、水渠、林带,这层是静态底座,一般用GIS数据和倾斜摄影模型生成。
- 设备对象层:气象站、土壤传感器、灌溉阀、泵房、虫情测报灯、摄像头、农机等所有可交互设备,每个对象有唯一ID,用于数据绑定。
- 业务数据层:设备上报的实时值、农事记录、告警事件,通过数据源接口和场景对象属性绑定。
- 交互表现层:弹窗面板、统计图表、告警闪烁、路径轨迹、镜头视角等,负责把数据以直观方式呈现。
这个分层对应到引擎里,就是节点树和数据模型分离。比如土壤传感器是一个Node3D对象,它的“土壤湿度”属性绑定到后端接口字段soil_moisture,渲染层用数字标签或颜色方块表现这个值。场景文件和业务逻辑解耦后,后续新增一个地块或者换一个传感器型号,只改场景配置,不动代码,这是零代码模式能落地的关键。
2.3 零代码设计路径:编辑器配置加少量脚本
零代码不是“无代码无限可能”。对于设备数量少、逻辑简单的场景,纯配置确实够用。但智慧农场涉及告警联动、阈值判断、镜头切换这些交互,完全零代码会很别扭。我们实际采用的设计路径是:
- 在HT可视化编辑器里完成场景搭建,包括地形、地块、建筑、设备和管线的布置。
- 通过界面配置属性绑定,把传感器数据、农机状态等字段关联到对应节点。
- 对于“湿度低于阈值则打开阀门”这类业务规则,用引擎的事件脚本来实现,脚本也只是一些监听数据变化的回调函数。
- 最终导出JSON场景文件,嵌入到已有的业务后台系统里。
这套路径最大的好处是分工清晰:实施人员在编辑器里调场景和交互,后端工程师只提供稳定的数据API,前端开发人员不用再维护大段Three.js业务代码。我们在实施过程中明显感觉到,交付后期客户提出“这个地块重新划分一下”“大屏上多加一个产量统计图”时,直接在编辑器里改配置就行,不用发版不用重启服务,体验相当好。
2.4 为什么不用专业游戏引擎而是HT类可视化引擎
有人会问,Unity或者Unreal做农田3D效果不是更好吗?确实,游戏引擎渲染效果上限很高,但在这类项目里得不偿失。
第一,游戏引擎最终交付往往需要一个几十MB甚至几百MB的客户端或高度定制WebGL包,而HT引擎输出的场景文件是轻量JSON加少量JS,加载速度快,部署方便。第二,智慧农场项目需要跟客户的业务后台、物联网平台做深度集成,数据驱动的实时刷新、REST API对接、大屏拼接等功能,可视化引擎天然支持得好,CG软件和游戏引擎却需要大量中间层开发。第三,农场地块大多是规则的平面空间,不需要像射击游戏那样做复杂光照和物理模拟,HT引擎提供的渲染能力已经过剩。从成本角度说,培养一个会用可视化编辑器实施人员的成本,远低于组建一个Unity开发小组的成本。
3. 零代码搭建流程:从空白场景到可交付的3D大屏
3.1 前期准备:地块数据、设备清单与模型资源
搭建之前先盘资源,这一步决定后面能不能顺利推进。我们当时准备了三类东西:
地块边界数据:一般是GeoJSON或者Shapefile,标明所有地块的边界、编号、面积。这是整个场景的空间骨架。如果拿不到CAD或GIS数据,至少要在卫星图上人工描绘地块轮廓。
设备点位表:包括传感器、摄像头、农机、灌溉设备的位置描述,最好直接提供经纬度。此后建模时要把经纬度换算成场景局部坐标。
模型资源:农机、摄像头、气象站、泵房等设备最好有glTF或glb格式的三维模型。没有的话,从模型平台下载或者建模师临时制作,务必要控制面数。我踩过的一个坑是客户发来一个OBJ格式的收割机模型,单个文件就有近百万个三角面,导进场景以后帧率直接掉到十几,后来用3D减面工具压到几万面才恢复正常,所以资源入库前的减面和烘焙检查一定要做。
3.2 地形与农田场景搭建
HT引擎的可视化编辑器里,我先导入农场的GIS地块边界,把地块按真实比例投射到场景底面上。每个地块创建为一个独立的节点,并赋予不同颜色或纹理,正常状态下显示为绿色作物田块,作业完成或已收割时通过数据驱动切换为黄色或土色。
地形方面,如果农场是平原地区,直接用平面加网格线就够。但如果是丘陵地貌,需要加载DEM高程数据生成起伏地形,或者用无人机倾斜摄影生成的实景模型做底。我个人的建议是,能不用倾斜摄影实景模型就不用,因为实景模型动辄几个GB,Web端撑不住。更务实的做法是采用“低精度地形加关键地块高清化”的方案,大场景用简模,重点管控地块单独精细建模,效果和性能都能兼顾。
3.3 设备与农机摆放
在编辑器里把模型拖拽到场景中,听上去简单,但要注意几个细节。
首先是坐标对齐。GIS经纬度坐标不能直接用来摆放,需要先转换成以农场中心为原点的局部坐标,否则远处设备位置会有厘米级的浮点误差。其次是设备朝向。摄像头、农机停放、灌溉阀门都有明确的真实朝向,摆反了后期演示很尴尬。第三是节点命名规范。我强烈建议从第一天起就用“地块编号-设备类型-序列号”的方式命名节点,比如P01_IRGATE_003,这直接决定后续数据绑定脚本是不是容易维护。
其他辅助元素,比如水渠、道路、围墙,用简单的线条或低模拉伸即可,不要过度设计,它们是背景,不是主角。
3.4 数据接入与面板配置
场景搭完就该让数据流动起来了。HT引擎的编辑器支持把节点的属性绑定到外部数据源。我们一般走REST API拉取和WebSocket实时推送两种方式。
假设后端有一个接口,返回每个土壤传感器的最新数据:
{ "code": 200, "data": [ { "sensorId": "P01_SOIL_001", "moisture": 42.5, "temp": 18.3, "battery": 87 }, { "sensorId": "P01_SOIL_002", "moisture": 39.1, "temp": 18.8, "battery": 92 } ] }我们把sensorId对应到场景节点的ID,然后把moisture和temp绑定到节点下的数字标签或图表组件。这样每5秒轮询一次接口,场景里的数值标签就会自动刷新。对于灌溉阀门这种需要即时响应的设备,额外开一条WebSocket通道,后端一旦推送阀门状态变化,前端立刻更新3D对象的颜色和角度,做到分钟级甚至秒级的真实反映。
编辑器里内置了面板、图表、按钮等组件。地块信息弹窗就是点击地块节点后弹出的一个浮动面板,里面显示面积、作物品种、当前墒情、最近农事记录等字段。这些面板样式、字段名都可以在可视化界面里配置,不需要前端开发介入。
3.5 相机视角与多场景预案
3D场景不能只有一个固定全景视角,否则和一张截图没什么区别。我们至少设置了四类镜头预案:
- 开场全景:从高空俯瞰整个农场,适合放在大屏首页,展示农场全貌。
- 地块特写:点击某个地块后镜头平滑飞行到该地块上方,展示作物状态和地块信息。
- 设备聚焦:选中某个气象站或虫情测报灯时,镜头拉近到设备周围,配合弹窗展示细节数据。
- 农机跟随:实时视角锁定当前作业农机,模拟跟车视角。
这些镜头切换在HT编辑器里可以通过设置相机动画路径来实现,也可以通过事件脚本动态控制。演示现场客户对“点一个地方,镜头飞过去”这个交互印象最深,真的比任何统计图表都有说服力。
3.6 发布集成与多端适配
场景搭建完成后,HT引擎导出场景JSON文件和对应的加载JS门槛,嵌入到已有的业务系统中。大屏场景我们一般设置1920x1080或3840x1080分辨率,PC浏览器自适应窗口大小,平板和手机端则更换为更简洁的面板和更大的点击区域。
这里有一个交付层面的心得:不要一开始就做大屏完美适配,先把PC端场景跑通,大屏只是把字体和布局拉大。很多团队先在大屏上反复调样式,最后PC端一打开各种错位,白费时间。
4. 耕种管收四个核心场景的建模与可视化实现
4.1 耕:农机作业轨迹与整地进度可视化
耕整地环节的可视化重点是作业过程。我们在场景里加入了旋耕机的实时GPS位置,传感器终端通过物联网平台每10秒上报一次坐标,HT引擎把历史坐标点连成作业轨迹线,已经走过的路径用高亮颜色标记,未作业地块保持暗色。这样生产主管一看就明白当天作业进度是快是慢。
除了轨迹,还要把深松深度和油耗做成数据卡片。深松深度深了费油且可能破坏土壤结构,浅了达不到整地效果,实时的深度曲线图很有价值。这类数据本身是时序数据,直接以图表形式叠加在3D面板中,不必在3D场景里搞花哨的变形动画,数据准确和直观永远是第一位。
4.2 种:播种路径、农资库存与出苗联动
播种阶段场景上变化不大,但业务数据更细。播种机的作业路径、播种量、行驶速度是核心指标,对应3D场景里的农机位置和轨迹线。同时我们在场景右侧增加了一个农资库存面板,显示种子和复合肥的余量,当播种完成量超过80%时自动提示“该批次种子预计剩余作业面积不足”,这个逻辑用脚本监听累计作业面积字段触发。
有一个细节是出苗率的展示。播种后一段时间,客户很关心出苗情况。我们把地块出苗率映射为颜色,低于标准值的田块自动泛黄并出现告警图标。这个功能不需要真的做几千棵苗的3D模型,而是用纹理色和图标表达,大大降低了场景复杂度。
4.3 管:墒情、虫情、气象监测与设备联动
田间管理是整个智慧农场可视化里最复杂的部分,也是数据来源最多的部分。我们在地块里用四方柱体模拟土壤传感器,数字标签实时显示湿度、温度、电导率;田边布置小型气象站模型,显示风速、雨量、光照辐射;虫情测报灯模型上最上层用一个数字图标代表每小时捕虫数量,点击后弹出过去一周的虫量曲线。
设备联动是这部分的亮点。我们做了“墒情告警→自动开阀”的演示闭环:当某地块土壤湿度低于阈值时,该地块颜色由绿转红,弹窗弹出一条告警,同时在地块末端的水管阀门模型会从灰色变成蓝色并旋转打开,表示正在灌溉。这套联动在客户面前演示效果极好,因为它把“传感器发现风险”和“设备执行操作”这种因果链完整呈现了出来。
这里再延伸一句:现在田间物联感知已经不只有传统传感器,3D结构光相机和激光雷达点云也被用到农机避障、作物长势估算中。点云数据可以实时还原农机周边的障碍物分布,可视化层面可以叠加显示一个“感知范围圈”。我们在二期规划里也预留了点云标注相关能力,用于训练视觉识别模型,帮助算法团队批量拉框标注田间害虫和杂草图像。
4.4 收:收割机调度与产量数据汇总
收获环节的可视化核心是调度和汇总。收割机全部在地图上有真实位置,点击任意一台能看到当前收获面积、籽粒产量、粮箱容量、速度等参数。已完成地块的纹理色从金黄色切换为灰黄色,并把亩产数据标签固定在地块中央。
给客户演示收割调度时,我们做了一个“推荐路线”效果:系统根据地块成熟度和收割机当前位置计算出最优作业顺序,场景中用一条半透明的箭头线按顺序连接地块。这个功能背后的算法其实很简单,就是按距离和成熟度排序,但视觉上非常提气。产量汇总面板则把当日已收面积、总产量、平均亩产、湿粮含水率组合在一起,滚动更新,支撑大屏上的“丰产数字”。
5. 常见问题与性能调优记录
5.1 模型格式与贴图的几个坑
模型问题是最先遇到也最烦人的。实践下来,glTF或glb格式最适合Web端实时渲染,OBJ和FBX导入常常出现材质丢失。如果客户只给了OBJ,务必检查法线是否正确,否则会出现模型表面黑一块亮一块。
贴图尺寸也要严格控制。农机和设备模型贴图尽量压缩到2048甚至1024以下,不要在场景里放一批4096贴图,否则显存立刻爆掉。我见过一个项目把所有农机都贴了4096胶印贴图,GPU占用瞬间拉满,只好逐一替换成低分辨率贴图。另外模型入库前统一规范坐标系方向,Y轴向上还是Z轴向上要确认清楚,否则导入场景后模型会歪倒。
5.2 大场景卡顿的优化策略
几百亩农场的场景对象数量很容易过千,尤其是如果每一块地都用几十个小模型拼出来,DrawCall会不断增加。我们的经验是:
- 静态建筑、道路、树木尽量合并成一个节点或使用实例化渲染,减少提交次数。
- 远处的设备可以做LOD,切换到简化模型或直接替换为贴有设备图标的公告牌。
- 镜头看不到的背面场景对象可以设置为不可见,或者至少不要全部参与实时阴影计算。
- 动画和光照宁缺毋滥。农田地块不必开实时阴影,雾效、Bloom这类后处理也要谨慎,它们对画面提升有限,但性能消耗极明显。
5.3 数据刷新导致闪烁和卡顿
实时数据每5秒刷新一次,如果每次都把场景里所有文字标签重建一遍,画面会出现闪烁感,而且CPU占用会居高不下。我们改成数据驱动的增量更新方式:后端推送或前端轮询到新数据后,只更新数值发生变化的节点属性,不重建整个节点树。
还有一个小技巧:数值变化时不要直接数值跳变,添加一个短暂的透明度过渡或数字滚动动画,看起来更自然,也不会因为频繁硬刷新造成视觉疲劳。前端做数据缓冲和节流,比如AI分析结果每1秒推一次,可视化层只每3秒取一次最新值,避免渲染管线被高频数据打断。
5.4 经纬度坐标与局部坐标的转换
这个问题看起来简单,但真出问题时很隐蔽。GPS经纬度是弧度坐标,跨度大时直接用于场景会导致浮点精度退化。我们通常取农场中心点为原点,将经纬度差值乘以每度的米数换算成局部坐标,然后整体平移到3D场景原点附近。举个例子,假设中心点经度116.39、纬度39.90,某设备的经度为116.40、纬度为39.91,经度差0.01度约等于0.01乘111319米,大约1113米,纬度差0.01度约1113米,换算后设备位置就是局部坐标(1113, 0, 1113)。这种统一换算的脚本放在后端接口里返回,前端不多做处理,保证多个数据源坐标一致。
5.5 交互细节里容易被忽略的点
这类平庸但影响交付体验的细节特别多:3D场景里点击小目标时命中区域太小,需要给设备节点扩大可点击热区;弹窗面板弹出后如果跟随镜头移动,位置要做屏幕空间吸附,否则视角一转面板就飘走了;大屏使用红外触摸框时,过小的按钮和间距很容易误触,所以大屏的交互元素最小尺寸至少在64像素;长时间全屏显示固定画面,还要考虑OLED屏的烧屏风险,隔一段时间切换一下视角让像素休息。
6. 一些落地经验和后续扩展方向
6.1 零代码项目的工程化管理
很多人以为零代码项目就是“谁都能做”,但真正交付时容易乱在版本管理上。我们的做法是把HT场景JSON文件纳入Git仓库管理,每次修改都记录变更说明,数据绑定表单独维护一份Excel同步给后端和实施人员。零代码不是无序开发的遮羞布,恰恰因为修改门槛低,更需要流程来约束,否则一周后谁也不知道场景里哪些对象绑了什么数据。
同时要明确零代码的边界。阈值判断、告警推送、多系统联动这些逻辑,如果过于复杂就交给后端和少量前端脚本处理,不要在编辑器里硬堆配置。老实说,“90%配置加10%脚本”的配比比较理想,既保证迭代速度,又不至于让场景文件变成一堆看不明白的JSON。
6.2 从可视化到业务闭环:告警、工单和统计报表联动
3D可视化说到底只是入口。如果做完大屏,农场管理还是靠线下报事和表格统计,那项目交付一两个月后就会被客户束之高阁。我们后来在场景里增加了一个“告警事件列表”,值班人员在3D场景上点击告警就可以直接生成一条工单,指派给指定农机手或维护工程师。这样从发现异常到处置完毕有全流程记录,可视化大屏才真正进入了生产管理,而不是一个演示花瓶。
后续扩展方向上,我觉得最值得投入的是三维重建和感知数据的可视化叠加,比如用无人机多视角影像生成农场实景模型,用3D高斯重建技术做精细地块长势模拟,结合激光雷达点云对田间障碍物做自动识别标注。这些能力能让智慧农场可视化从“展示状态”升级为“辅助决策”,这也是耕、种、管、收闭环的终点——不再只是让数据被看见,而是让数据被用起来。