news 2026/9/7 12:51:54

Cesium+Vue飞机模型按预定航线飞行:从路径插值到姿态控制全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Cesium+Vue飞机模型按预定航线飞行:从路径插值到姿态控制全解析

简介:一份面向WebGIS开发者的Cesium与Vue.js整合实战资源,用于解决如何在3D地球中驱动飞机模型沿预设航线飞行的问题。项目完整演示了模型加载、航线定义、轨迹动画、实时更新、交互控制与航线可视化的实现路径,并涵盖性能优化技巧,例如利用Cesium的Model实体加载飞机模型,用Polyline绘制航迹,再通过Tween或时间轴机制让飞机平滑移动并同步更新视角,适合有一定前端基础、希望掌握三维地图场景开发或构建数字孪生演示的学习者。资源压缩包为7z格式,大小约18MB,文件清单未单独标注,但核心代码与配置集中在Vue组件与Cesium实体管理逻辑中,便于直接参考复用。该资源已有3800余人浏览学习,提供了一套清晰可复用的飞行轨迹模拟框架,读者可据此快速搭建自己的三维航线场景,并深入理解三维场景中模型动画与事件交互的配合用法。 做了几个Cesium相关的可视化项目之后,我发现“模型沿预定航线飞行”这个需求几乎是三维GIS项目里最常被点名的功能,不管是民航航线监控、无人机巡检路径模拟,还是智慧园区的物流小车示意,底层逻辑都一模一样。这篇文章就把我在这类项目里沉淀下来的一套“Cesium + Vue实现飞机模型按预定航线飞行”的完整方案拿出来聊聊,包括整体思路、关键代码、遇到过的坑和排查方法,按我的实际开发流程顺序写,适合刚接触Cesium、或者已经在写Cesium但被模型姿态、路径平滑、视角跟随折磨过的朋友参考。

1. 方案设计:Cesium负责时空,Vue负责状态

1.1 为什么是Cesium + Vue这个组合

先说选型。Cesium是目前三维地球领域生态最完整、资料最全的WebGL引擎,它天生就是做“带真实坐标的时空可视化”的——加载全球影像、地形、倾斜摄影、3D Tiles、glTF模型都是原生能力,不需要我们去重复造轮子。它内部有完整的时钟系统和时间轴机制,这个对“按航线飞行”来说太关键了,因为飞行本身就是“位置随时间变化”的过程,Cesium的 clock + SampledPositionProperty 正好为此设计。

Vue这边解决的是工程化和交互状态问题。Cesium的API虽然功能强,但它是偏命令式的,控件也主要集中在三维场景里。用Vue之后,我可以把播放/暂停按钮、速度切换、航线选择、视角模式这些UI全部拆成组件,用响应式数据去驱动三维场景变化,开发体验和可维护性比纯JS写要高一个档次。组合式API(composition API)和Cesium的事件回调配合也顺手,逻辑复用直接抽成一个useFlyManager函数就行。

1.2 飞行功能的核心机制拆解

我先把这个功能的本质拆开讲明白:飞机模型的“飞行”其实分三个部分叠加。第一部分是模型加载,本质上就是把一个glTF/glb格式的3D模型放进Cesium场景里,Cesium负责渲染出来。第二部分是路径插值,就是我们给出一系列经纬度+高度坐标点,Cesium帮我们把点之间的连续位置计算出来——Cesium内置了线性、样条等多种插值方式。第三部分是姿态计算,就是根据飞机当前的运动方向,自动算出模型该朝哪个方向,也就是机头要始终指向飞行方向。

这三个部分里,最容易让新手懵的是“模型在场景里动了”和“模型真的在飞”是两回事。前者可能只是模型位置跳变,后者需要让Cesium每一帧都知道模型在哪个时间点应该出现在什么位置。所以我们选择了SampledPositionProperty这个类,它是Cesium里专门用来采样位置轨迹的,配合时钟,Cesium每一帧都会根据当前时间自动插值计算出飞机的位置,这是整套方案的地基。

2. 环境搭建与Cesium接入的几种姿势

2.1 Vue项目集成Cesium的环境配置

我现在用的组合是Vue 3 + Vite + Cesium,官方文档和中文社区的资料基本都可以照这个组合跑通。第一步先建Vue项目,建议直接用Vite,相比webpack确实快不少,配置也简单:

npm create vite@latest cesium-flight -- --template vue cd cesium-flight npm install npm install cesium

安装完Cesium之后,最关键的配置是静态资源路径。Cesium运行时会从某个URL地址去加载它的资源文件(widgets.css、图片、wasm等),如果你不设置这个路径,会出现地图加载不出来或者控件样式全部丢失的情况。在Vite项目里,我在vite.config.js里做如下配置:

import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import path from 'path' export default defineConfig({ plugins: [vue()], define: { CESIUM_BASE_URL: JSON.stringify('/cesium/') }, optimizeDeps: { include: ['cesium'] }, resolve: { alias: { '@': path.resolve(__dirname, './src'), 'cesium': path.resolve(__dirname, 'node_modules/cesium/index.cjs') } } })

然后在index.html或者入口文件里引入Cesium的样式:

import 'cesium/Build/Cesium/Widgets/widgets.css'

我在第一次搭建的时候,因为没有正确处理CESIUM_BASE_URL,导致地图瓦片一直出不来,页面空白。后来查了Cesium中文文档和不少社区帖子,才知道这是Vite和Cesium集成最典型的坑之一。网上有一种方案是把Cesium的Build文件夹整个拷贝到public目录下,用静态资源方式提供:

cp -r node_modules/cesium/Build/Cesium public/cesium

这个方案实测最稳,我后来在多个项目里都用它,不依赖打包器对CESIUM_BASE_URL的支持,适合快速验证,也适合团队里其他不熟悉Cesium配置的同事直接拉起来跑。

2.2 加载Cesium官方飞机模型

Cesium官方提供了几个示例模型,其中Cesium_Air.glb就是一个飞机模型,用来做航线演示非常合适。这个模型可以直接通过官方模型链接加载,也可以本地下载后放到项目里。我在项目中是放在public/models/Cesium_Air.glb,然后在代码里这样加载:

const airplaneEntity = viewer.entities.add({ position: positionProperty, orientation: velocityOrientationProperty, model: { uri: '/models/Cesium_Air.glb', scale: 1.0, minimumPixelSize: 64, maximumScale: 200 } })

这里的minimumPixelSize值得展开说一下。它的作用是限制模型在屏幕上显示的最小像素尺寸,默认情况下,相机拉远了之后模型会缩小到看不见,设置了这个值之后,即使视角拉高到几万米,模型依然能保持一个可辨识的大小。我一般在做演示项目时会设到64~128,避免机组看不见飞机在哪儿。但如果做严谨的仿真项目,这个值就不建议设置太大,因为模型不按真实比例缩放会影响空间判断。

这里还牵扯到一个“模型节点”的概念。Cesium加载glTF之后,模型内部的各个部件(机翼、螺旋桨、起落架等)会组成一个节点树。如果你需要在飞行过程中动态控制某个部件的旋转(比如螺旋桨转动),就需要通过modelNode去访问和修改节点矩阵。虽然这次“按航线飞行”用不到这么深入的控制,但如果你后续想加螺旋桨旋转、起落架收放这些细节,就得先理解Cesium的模型节点体系。常见做法是遍历model_sceneGraph或者使用modelNodeCollection去查找节点。

3. 航线设计与飞行控制的核心实现

3.1 坐标点、采样与路径平滑处理

航线数据的源头通常是这样的:一组按时间或按顺序排列的航点,每个点包含经度、纬度、高度。我在实际项目里拿到的数据格式五花八门,有的来自数据库坐标字段,有的是后端接口返回的GeoJSON,有的干脆是Excel导出的CSV。我习惯先在工具里统一转成[lng, lat, height]数组,再交给Cesium处理。

const flightPath = [ [116.305, 39.985, 3000], [116.408, 39.912, 3500], [116.501, 39.868, 2500], [116.621, 39.856, 4000], [116.741, 39.877, 4500] ]

接下来,我用SampledPositionProperty把这些点按时间采样进去,Cesium才能知道飞机在每一帧应该处在什么位置。这里有一个关键问题:航点的疏密程度直接决定飞行轨迹的平滑度和计算开销。如果只有5个点,飞机在转弯处会出现明显的折线转向,像折纸飞机一样;如果想平滑,就需要在每段航线之间插入更多中间点,或者使用Cesium的样条插值算法。

我这里用CatmullRom样条曲线对原始航点做一次插值,把一条折线路径变成光滑曲线路径。插值之后得到的路径点数量明显增加,飞行动画会自然很多。核心代码大概是这样的:

// 原始航点转成笛卡尔坐标 const rawPositions = flightPath.map(item => { return Cesium.Cartesian3.fromDegrees(item[0], item[1], item[2]) }) // 通过样条插值得到连续路径 const spline = new Cesium.CatmullRomSpline({ times: rawPositions.map((_, index) => index), points: rawPositions }) // 对路径做密采样,作为后续飞行采样的关键帧 const sampledPositions = [] for (let t = 0; t <= rawPositions.length - 1; t += 0.1) { sampledPositions.push(spline.evaluate(t)) }

这里说明一下为什么CatmullRom适合做航线插值。它生成的曲线会经过所有控制点,不会出现像某些拟合算法那样“曲线偏离航点”的问题,这对航线显示来说很重要——你要保证飞机实际轨迹和业务规定的航线高度一致,不能插完之后飞机飞到了航线外面。另外CatmullRom计算量不大,几百个点实时计算完全没有压力。

如果项目里不允许引入额外的曲线计算逻辑,Cesium自带的SampledPositionProperty也支持设置插值参数,通过forwardExtrapolationTypebackwardExtrapolationTypesetInterpolationOptions控制外推和插值行为,默认的线性插值效果虽然比不上样条曲线,但在航点加密的情况下也够用。

3.2 时钟系统驱动的飞行动画与速度调节

Cesium里所有动画都有一个总驱动力——viewer.clock。你可以把它理解成一个虚拟世界里的钟表,它的时间流逝速度可以调快调慢。飞行路径采样的时候,我事先把每个路径点对应的时间都算好,这样Cesium时钟每走一秒,飞机就走完对应的距离。

实现起来是这样的:

// 设置每个采样点的时间,这里按每两个航点间隔60秒来分配 const startTime = Cesium.JulianDate.now() const timeIntervalInSeconds = 60 sampledPositions.forEach((position, index) => { const time = Cesium.JulianDate.addSeconds(startTime, index * 0.1 * timeIntervalInSeconds, new Cesium.JulianDate()) positionProperty.addSample(time, position) }) // 把采样属性绑定给实体 airplaneEntity.position = positionProperty // 计算模型朝向,让机头始终朝飞行方向 const velocityOrientationProperty = new Cesium.VelocityOrientationProperty(positionProperty) airplaneEntity.orientation = velocityOrientationProperty

VelocityOrientationProperty这个类非常关键,它做的事情是:根据位置属性的变化趋势,实时计算当前速度向量,然后根据速度向量推导出模型的朝向四元数。这样我们就不用自己手动去算偏航角、俯仰角,Cesium自动让机头指向飞行方向。

时钟倍率控制速度的方法也很直接:

viewer.clock.multiplier = 2 // 两倍速 viewer.clock.multiplier = 0.5 // 半速

在实际项目里,我会在Vue组件中放一个速度状态,把1倍速、2倍速、4倍速、0.5倍速这几个档位做成按钮,点击后直接修改viewer.clock.multiplier。有一个必须注意的问题:当速度倍率太高的时候,插值采样点之间的跳变会变得明显,飞机看起来会“瞬移”。所以采样点的时间间隔不能太大,通常我控制在1秒以内一个点,才能保证高倍速下依然平滑。

还有一个容易忽略的点:viewer.clockshouldAnimate属性决定了时钟是否自动前进。如果没有把它设为true,时钟会停在初始时间,模型不会动。我用官方示例经常要手动检查这个属性,它默认是true还是false取决于Viewer的初始化参数,如果你发现模型加载了但一动不动,优先排查shouldAnimate

3.3 视角跟随、航线轨迹绘制与UI控制

飞行演示中,视角跟随是刚需。Cesium提供了非常简单的跟踪模式,通过设置trackedEntity,相机就会自动跟着飞机移动,视角一直锁定目标:

viewer.trackedEntity = airplaneEntity // 绑定视角偏移,让相机在飞机后上方跟随 viewer.viewFrom = new Cesium.Cartesian3(-500, 300, 200)

这里的viewFrom设置的是相机相对被跟踪目标的本地坐标偏移。我调了几次后比较习惯用(-500, 300, 200),效果就是相机在飞机屁股后面斜上方跟着走,能看到机头和前方航线。如果你需要第一人称视角或者侧面跟随,改这个坐标就行。

为了在飞行过程中清楚地表达“预定航线”,通常我会把航线轨迹也画出来,用Cesium的PolylineGraphics加一个带箭头的线,能明显看出飞行方向。热词里提到的“cesium实现高德箭头效果”其实就是这一类需求,本质是给Polyline加纹理箭头贴图:

viewer.entities.add({ polyline: { positions: Cesium.Cartesian3.fromDegreesArrayHeights([ 116.305, 39.985, 3000, 116.408, 39.912, 3500, 116.501, 39.868, 2500, 116.621, 39.856, 4000, 116.741, 39.877, 4500 ]), width: 5, material: new Cesium.PolylineArrowMaterialProperty(Cesium.Color.fromCssColorString('#00BFFF')) } })

如果想在地面上投影一条完整的二维轨迹,也可以用高度为0的线或者贴地的GroundPolyline,不过要注意Cesium对GroundPrimitive更新有时会有延迟,强制更新是一个常见的坑点。我一般在更新航线后会主动调用viewer.scene.requestRender()来确保渲染及时刷新。

在UI控制层面,我在Vue里封装了一个飞行控制组件,包含播放、暂停、重置、速度切换四个核心操作,通过ref暴露给父组件调用。播放和暂停本质上是切换shouldAnimate,重置则是把viewer.clock.currentTime重置回起始时间:

// 暂停 viewer.clock.shouldAnimate = false // 播放 viewer.clock.shouldAnimate = true // 重置 viewer.clock.currentTime = Cesium.JulianDate.addSeconds(startTime, 0, new Cesium.JulianDate())

4. 踩坑实录与排查技巧

4.1 模型不显示或姿态异常的排查方法

第一个高发问题是飞机模型加载不出来,页面里只有轨迹线在动。我遇到过的情况分三种:一是模型路径写错,本地模型在public目录下时uri应该以斜杠开头,写成相对路径在路由切换后会404;二是Cesium的access token没配置好,导致官方在线模型无法加载;三是模型文件本身损坏或者格式不对,Cesium对glTF标准要求较严格,部分建模软件导出的gltf会带有不兼容的材质参数。

排除思路是按顺序来:打开浏览器Network面板看请求是否返回200;接着在控制台打印viewer.entities.values确认实体是否创建成功;再检查Model的readyPromise状态,Cesium在模型加载完成时会触发这个Promise,可以监听它来做后续处理:

airplaneEntity.model.readyPromise.then(model => { console.log('模型加载完成', model) }).catch(error => { console.error('模型加载失败', error) })

第二个高发问题是飞机姿态不对。最常见的现象是模型虽然沿着航线在动,但机头歪着,比如航线是东西方向飞行,机头却一直冲着北。这是因为每个glTF模型建模时的“正方向”不一致。Cesium的VelocityOrientationProperty默认生成的速度坐标系中,模型沿着本地坐标系的X轴方向飞行,但很多模型的机头是沿着Y轴或Z轴建模的。解决办法是在Entity上加一个额外的旋转修正,我用过一个相对简单有效的办法,就是给模型实体的orientation加一个固定的heading偏移:

// 对模型方向做90度修正 const heading = Cesium.Math.toRadians(-90) const pitch = 0 const roll = 0 const orientation = Cesium.Transforms.headingPitchRollQuaternion( position, new Cesium.HeadingPitchRoll(heading, pitch, roll) )

但这种写法和VelocityOrientationProperty有冲突,因为两个都在设置orientation,后赋值的那一方会覆盖。更稳妥的做法是在后处理阶段,监听velocity的更新再叠加修正角。我在项目里采用的方法是写一个自定义的PositionProperty子类,在getValue里调用原始属性拿到坐标,再叠加heading修正。这个方案比较干净,不依赖模型内部节点。

4.2 路径不平滑、视角抖动与画面卡顿

如果飞行轨迹看起来一卡一卡的,或者转弯的时候航线明显是折线,先检查采样点的密度,点数太少是最大的原因。我用上面的CatmullRom方案,在每段航线上按0.1步长采样之后,从原始5个点扩展到几百个点,飞行非常顺滑。如果你的数据量比较大,成千上万条航线实时计算样条曲线会有性能压力,这时我建议预计算:在拿到航线数据后提前跑一遍插值计算,把结果缓存下来,不要在每一帧里重复计算。

视角抖动的问题比较隐蔽。有一种情况是跟踪视角下相机位置计算不稳定,尤其是模型快速转弯时,viewFrom相对偏移在转弯时会有明显的摆动感。这时候可以适当降低时钟倍率,让转弯过程更长更平缓。另一种情况是模型本身在运动中的微小抖动,多半是使用了不稳定的插值算法,这时候可以检查SampledPositionPropertysetInterpolationOptions,使用更高阶的插值算法来稳定轨迹:

positionProperty.setInterpolationOptions({ interpolationDegree: 3, interpolationAlgorithm: Cesium.HermitePolynomialApproximation })

姿态更新和动画渲染同时进行时,页面卡顿是另一个高频问题。Cesium默认会尝试60fps下持续渲染,如果你的场景里还叠加了3D Tiles、动态光照、热力图这些重量级数据,帧率会明显下降。这里想提一下热词里的“cesium动态光照”和“cesium 雷达光波”这类效果,动态光源和多边形光波如果是实时逐帧计算,GPU压力非常大。我实践下来的优化思路是:在不必要的时候把动态效果关掉,或者在后台飞行时用低配渲染。Cesium本身提供了performancepreferenceMode参数,用于控制画面渲染质量优先还是性能优先,在飞行演示场景里我建议设成Cesium.PerformancePreferenceMode.REFRESH_RATE_NON_GPU这类模式,画面流畅优先。

4.3 组件销毁、路由切换与内存泄漏

Vue项目里用Cesium,最常见的隐蔽问题就是内存泄漏。Cesium的Viewer对象非常重,如果组件销毁时没有正确释放,特别是通过addEventListener挂载的事件监听器,会导致页面切来切去之后越来越卡。我们项目里的标准做法是在onBeforeUnmount钩子里统一清理:

import { onBeforeUnmount } from 'vue' onBeforeUnmount(() => { if (viewer) { viewer.trackedEntity = undefined viewer.entities.removeAll() viewer.scene.primitives.removeAll() viewer.destroy() } })

这里有一个细节:直接调用viewer.destroy()有时候会报错,报错内容往往是“使用的对象已经被销毁”,原因是destroy之前先要解除所有对场景元素的引用。正确的是先清空实体、图元,最后销毁Viewer。另外,如果是通过viewer.scene.postRender.addEventListener注册的回调,也要手动移除,不然组件销毁后回调还在执行,可能访问到已经不存在的DOM节点。

路由切换时还需要注意,如果项目中使用了vue-router,从三维场景页面切到其他页面时一定要走销毁流程,否则底层的WebGL上下文会一直保留,浏览器最多能创建的WebGL上下文有限,切几次页面就黑屏了。这个问题排查起来很费劲,因为报错信息不明显,往往是切到第三个页面时突然白屏。我的建议是路由守卫里统一处理,或使用KeepAlive页面时明确区分哪些需要缓存、哪些需要重建。

5. 性能优化与业务扩展方面的思考

5.1 动态加载周边低精度数据与资源优化

飞行演示项目做到后面,往往不只是一架飞机在飞,还要叠加航线周边的城市建筑、地形、遥感影像等数据。这时候你会发现一上来就把全部高精度3D Tiles加载完根本带不动,合理的方式是做“相机周边加载低精度、核心区域加载高精度”的LOD策略。我现在的思路是按照相机距离动态调整底层3D Tiles的显示精度级别,远处的建筑用低精度模型,靠近航线的区域才显示细节;同时结合Cesium的maximumScreenSpaceError参数,适当增大屏幕空间误差来减少渲染的三角形数量。

Cesium还有很实用的视锥体裁剪、按需加载机制,不在地图可视范围内的瓦片根本不会进入渲染管线,这是一开始就有的能力,但需要我们在数据组织层面配合。比如把城市建筑3D Tiles按照瓦片切分,而不是一整块加载。飞行过程中如果还要展示视频贴图、地面POI标注、热力图这些内容,最好先把视频抽帧成纹理贴到Billboard上,而不是直接放一个video元素往场景里叠加,那样性能真扛不住。

5.2 给飞行功能叠加雷达、可视域与航迹分析

飞机飞行的业务价值不只是“看它飞”,更多时候是要叠加专业分析能力。“cesium雷达”和“cesium雷达光波”常常出现在空管、安防项目中,实现思路一般是围绕飞机位置动态生成一个圆环或多边形片区,模拟雷达扫描。我通常用PolygonGraphics加动态材质来做这个效果,固定周期重新生成长度递增、透明度渐变的扫描圈,并配合雷达光波材质让整个区域有“探测”的视觉感受。

可视域分析也是飞行项目中经常一起出现的需求,比如模拟飞机在某个高度的瞭望范围。Cesium做可视域分析有几个常用方案:一是基于视锥体求交计算可视区域边界;二是用Raycasting逐角度发射射线去检测与地形、模型的相交点。实测下来逐射线检测的精度高,但性能开销大,适合静态分析;动态跟着飞机实时更新的话,建议减少射线数量,只计算关键方向的可见边界,再连线闭合形成可视域多边形。

热词里还提到了“cesium热力图”和“cesium绘制矩形”。热力图一般用在人群密度、信号覆盖、污染分布等场景,如果你做的是多架飞机同时飞行的监控系统,可以在地图上叠加信号覆盖热力图,表示每架飞机的通讯范围。绘矩形则常用于圈选分析区域,交互上直接通过ScreenSpaceEventHandler监听鼠标事件实现,画一个矩形区域,然后对区域内的航线做筛选分析。这些都是飞行功能之外的增值模块,按项目需求补充即可。

5.3 坐标系、底图兼容与全产品线版本注意点

Cesium默认使用WGS84坐标系,我碰到的国内项目经常要求CGCS2000坐标或者地方独立坐标。好在Cesium的坐标转换机制比较灵活,可以直接把CGCS2000下的经纬度当作WGS84经纬度使用(两者在绝大多数民用场景下差异可以忽略),或者通过Cesium.Ellipsoid定义自定义椭球体来处理。如果需要严格的坐标转换,我建议在数据后端统一转好,前端只负责展示,不要在前端做复杂的坐标系变换,既容易出错又拖慢渲染。

底图这块我们也踩过不少坑。Cesium默认加载的是在线影像服务,如果部署在内网或者离线环境,需要换成离线底图。热词中提到“cesium图片当底图”,这个场景我很经常遇到:客户内部有定制的地图图片或者Web墨卡托瓦片服务,我们可以通过SingleTileImageryProvider加载一张完整的地图图片作为底层底图,或者用UrlTemplateImageryProvider加载标准瓦片服务。遇到有偏移的图片,还要配合Rectangle参数做位置校准。

关于Cesium的版本选择,官方产品线更新比较频繁,虽然Cesium官方已经发布了for Unity、for Unreal等面向游戏引擎的版本,Web端依然是以CesiumJS为主。我在项目里习惯锁死一个长期稳定版本,避免后续升级带来的API不兼容问题。建议读者在用全新项目时直接查Cesium中文文档的最新版本,并关注release note,如果项目已经跑得好好的,就别频繁升。

6. 写在最后的实操心得

做这个飞行项目前后调了小一周,最深的体会是:Cesium写功能不难,难的是把细节扣好。模型方向、采样密度、时钟倍率、组件销毁、视角位置,任何一个环节不到位,看起来就是哪儿都不对。但只要把这几个核心点吃透——SampledPositionProperty负责位置、VelocityOrientationProperty负责朝向、clock负责驱动、trackedEntity负责视角——其他东西都是在这个骨架上加肉。

最后再分享一个小技巧:调试阶段可以把Cesium的物理相机参考(viewer.scene.debugShowFramesPerSecond)打开,或者直接用viewer.clock.currentTime在控制台手动拖动时间,观察模型在某一帧的位置和姿态,快速定位是不是插值或朝向的问题。等这些都稳定了,再把业务数据、飞行状态上报、地面轨迹这些按需接进来,一套完整的三维航线飞行展示系统就成型了。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/7 12:51:06

ComfyUI节点式工作流:从零搭建Stable Diffusion可视化生成环境

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

作者头像 李华
网站建设 2026/9/7 12:50:41

GitHub Trending日榜盘点:数据备份与大模型项目实践指南

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

作者头像 李华
网站建设 2026/9/7 12:47:51

STM32G431KBU6深度解析:电机控制与数字电源的高性价比MCU

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

作者头像 李华
网站建设 2026/9/7 12:46:22

ESP32P4+GPT5.6实现智能音乐下载:硬件AI与物联网应用实践

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

作者头像 李华
网站建设 2026/9/7 12:45:49

AI短剧制作全流程教程:从角色一致性到ComfyUI工作流实战

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

作者头像 李华
网站建设 2026/9/7 12:45:36

Vibe Coding完全指南:场景边界、工具对比与实战工作流

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

作者头像 李华