Three.js实现3D心形照片墙:坐标计算与性能优化
简介这是一份基于HTML5与CSS3实现的“心”形3D照片墙特效源码面向前端初学者、网页特效爱好者以及需要为个人主页或纪念页面增添视觉亮点的开发者。它解决了传统照片墙排列呆板、缺乏空间感的问题将图片以“心”形布局悬挂于虚拟墙面并支持鼠标拖动实时改变观察角度营造出可交互的3D纵深感。压缩包共13个文件包含11张jpg示例图片、1张png素材以及1个html主页面整体约517KB结构轻量下载后可直接在浏览器中打开体验。目前已有4917人学习下载说明该特效在实战练习与二次开发中具有较高参考价值。读者可从中掌握CSS3 3D变换、透视与旋转属性、鼠标事件驱动视角变化等核心思路并基于现有图片与页面结构快速替换素材改造成属于自己的心形照片墙作品。1. 从一张静态照片到会呼吸的 3D 心形墙这个 .rar 里到底装了什么把几十上百张照片摆成一个心形还要能在浏览器里转起来、有纵深感、不卡顿——这是很多前端和可视化方向的人拿到「html5实现心形的3D照片墙」这个标题时脑子里冒出来的第一个画面。它解决的不是「怎么画一个心形」这种几何题而是「怎么让一堆矩形图片在三维空间里排成心形并且随鼠标转动时每张图都有正确的朝向和遮挡关系」。适合谁适合已经会写基础 HTML/CSS/JS、想找一个能直接跑起来、又能改参数的三维可视化练手项目的人也适合做活动页、纪念页、个人主页时需要一个视觉锚点的开发者。这类 .rar 压缩包通常包含一个 index.html、若干 css/js 文件、一个图片目录以及可能引入的 Three.js 或纯 CSS3D 方案。它真正值钱的地方不在「心形」这个形状而在坐标计算和渲染管线的取舍是用 CSS 3D transform 硬扛还是用 WebGL 走 Three.js。前者上手快、兼容好后者性能强、能加粒子光效。下面按「先立住原理、再动手复现、最后讲坑」的顺序拆开讲你照着改就能得到自己的版本。2. 心形坐标怎么算参数方程与照片落位2.1 为什么不用 CSS 画心形而是算坐标很多人第一反应是用 CSS 的clip-path或者两个圆加一个旋转正方形拼心形但那是二维的。3D 照片墙要求每张照片是一个独立平面分布在一个有厚度的心形壳层或心形体积上。所以必须拿到心形在三维空间中的点集再把照片逐个贴上去。常见做法是用心形参数方程生成二维轮廓再给一个 Z 轴抖动或分层形成「照片墙」的厚度感。心形参数方程最常用的是下面这组它来自笛卡尔坐标系的隐式方程变形优点是形状饱满、左右对称、计算量小// 心形参数方程t 从 0 到 2π // x 16 sin^3 t // y 13 cos t - 5 cos 2t - 2 cos 3t - cos 4t function heartPoint(t) { const x 16 * Math.pow(Math.sin(t), 3); const y 13 * Math.cos(t) - 5 * Math.cos(2 * t) - 2 * Math.cos(3 * t) - Math.cos(4 * t); return { x, y }; }这段代码里t是角度参数遍历一圈就能得到闭合的心形轮廓。注意 y 轴方向在数学坐标系里 y 向上为正但屏幕坐标系 y 向下为正所以实际使用时通常要给 y 取负或者整体翻转。参数说明16和13控制心形的宽高比例改小16会让心形变瘦改大13会让上半部分更鼓。5、2、1这几个系数决定心形顶部凹陷的深度一般不动。2.2 把轮廓点扩展成三维照片墙只有一圈轮廓点不够照片墙需要「面」甚至「体」。我一般会做两层外层用轮廓点均匀分布照片内层用缩放后的轮廓点再放一圈Z 轴错开形成前后景深。具体做法是对每个轮廓点按比例缩小坐标比如乘 0.6、0.3得到多层同心心形。// 生成多层心形点集 function buildHeartLayers(layerCount, photosPerLayer) { const layers []; for (let l 0; l layerCount; l) { const scale 1 - l * 0.25; // 每层缩小 25% const z l * 40; // 每层 Z 轴错开 40px const points []; for (let i 0; i photosPerLayer; i) { const t (i / photosPerLayer) * Math.PI * 2; const p heartPoint(t); points.push({ x: p.x * scale * 10, // 放大 10 倍便于观察 y: -p.y * scale * 10, // y 取负适配屏幕坐标 z: z }); } layers.push(points); } return layers; }逻辑说明layerCount控制层数一般 3 到 5 层视觉最舒服photosPerLayer是每层照片数建议 12 到 24太少心形不连贯太多照片会重叠。scale逐层递减让内层心形变小形成纵深。z逐层递增配合相机透视就有前后分离感。参数怎么改想让心形更「厚」把z的步长从 40 调到 80想让照片更密提高photosPerLayer但要注意性能。2.3 照片朝向让每张图都面向相机还是面向法线这是最容易翻车的地方。如果每张照片都固定朝向转动时侧面看就是一条线。常见两种策略一是 billboard广告牌每帧让照片朝向相机二是沿心形法线方向排列照片像鳞片一样贴着心形表面。前者实现简单视觉上始终能看到照片内容后者更有立体感但转到侧面会看到照片边缘。// billboard每帧更新照片朝向 function updateBillboard(photoMesh, camera) { photoMesh.lookAt(camera.position); }lookAt是 Three.js 的 Object3D 方法让物体的 Z 轴指向目标点。对于平面几何体默认正面是 Z 轴正方向所以调用后照片正面就对准相机。参数注意如果照片用了PlaneGeometry它的法线是 Z 轴lookAt正好适用如果用了自定义几何体要确认朝向轴。我一般会先用 billboard 跑通再根据效果决定是否换成法线排列。3. 用 Three.js 把照片墙跑起来从场景到交互3.1 最小可运行场景搭建Three.js 是目前做这类效果最稳的选择社区资料多透视相机和纹理加载都很成熟。下面是一个最小场景包含相机、渲染器、灯光和照片平面。import * as THREE from three; // 1. 场景 const scene new THREE.Scene(); scene.background new THREE.Color(0x0a0a1a); // 2. 透视相机视野 60 度宽高比自适应近裁面 1远裁面 5000 const camera new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 5000 ); camera.position.set(0, 0, 800); // 3. 渲染器 const renderer new THREE.WebGLRenderer({ antialias: true }); renderer.setSize(window.innerWidth, window.innerHeight); renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2)); document.body.appendChild(renderer.domElement); // 4. 环境光 点光源避免照片全黑 scene.add(new THREE.AmbientLight(0xffffff, 0.8)); const pointLight new THREE.PointLight(0xffffff, 1); pointLight.position.set(500, 500, 500); scene.add(pointLight);参数说明PerspectiveCamera的视野 60 是常用值调大能看到更多照片但边缘会拉伸camera.position.z 800决定观察距离照片墙整体尺寸在 400 到 600 之间时800 能完整看到心形。setPixelRatio限制到 2 是为了在高分屏上避免渲染压力过大这是性能优化的第一道关。AmbientLight强度 0.8 保证基础亮度PointLight给一点方向感让照片有轻微明暗变化。3.2 加载照片纹理并贴到心形点位纹理加载是异步的要等所有图片加载完再统一放置否则会出现部分照片空白。用TextureLoader配合Promise.all是标准做法。const loader new THREE.TextureLoader(); const photoUrls [./img/1.jpg, ./img/2.jpg /* ... */]; // 统一加载返回 texture 数组 function loadTextures(urls) { return Promise.all(urls.map(url { return new Promise((resolve) { loader.load(url, (texture) { texture.colorSpace THREE.SRGBColorSpace; // 色彩校正 resolve(texture); }); }); })); } // 放置照片 async function placePhotos() { const textures await loadTextures(photoUrls); const layers buildHeartLayers(3, 16); let idx 0; layers.forEach((points) { points.forEach((p) { const texture textures[idx % textures.length]; const material new THREE.MeshBasicMaterial({ map: texture, side: THREE.DoubleSide, // 双面可见转动时不消失 transparent: true }); const geometry new THREE.PlaneGeometry(60, 60); // 照片尺寸 const mesh new THREE.Mesh(geometry, material); mesh.position.set(p.x, p.y, p.z); scene.add(mesh); idx; }); }); }逻辑说明colorSpace设为SRGBColorSpace是 Three.js 新版本的要求不设会导致照片偏暗或偏灰这是很多人忽略的坑。PlaneGeometry(60, 60)是照片平面的宽高心形整体宽度约 32016×10×260 的照片放 16 张一圈刚好不重叠。DoubleSide让照片背面也可见避免转到后面时照片消失。transparent: true配合 PNG 透明通道如果全是 JPG 可以关掉省性能。3.3 鼠标交互旋转、缩放与惯性静态照片墙没意思要能拖拽旋转。最简方案是监听鼠标移动把位移映射到场景旋转。加惯性会让手感更顺但代码稍多。let isDragging false; let prevX 0, prevY 0; let rotY 0, rotX 0; let velY 0, velX 0; renderer.domElement.addEventListener(mousedown, (e) { isDragging true; prevX e.clientX; prevY e.clientY; }); window.addEventListener(mousemove, (e) { if (!isDragging) return; const dx e.clientX - prevX; const dy e.clientY - prevY; velY dx * 0.005; // 水平位移影响 Y 轴旋转 velX dy * 0.005; // 垂直位移影响 X 轴旋转 prevX e.clientX; prevY e.clientY; }); window.addEventListener(mouseup, () { isDragging false; }); // 动画循环 function animate() { requestAnimationFrame(animate); if (!isDragging) { velY * 0.95; // 惯性衰减 velX * 0.95; } rotY velY; rotX velX; rotX Math.max(-0.6, Math.min(0.6, rotX)); // 限制垂直角度 scene.rotation.y rotY; scene.rotation.x rotX; renderer.render(scene, camera); } animate();参数说明0.005是灵敏度系数调大转得快调小转得慢。0.95是惯性衰减越接近 1 滑得越久0.9 以下很快就停。rotX限制在 ±0.6 弧度约 ±34 度是为了避免转到心形背面看到空洞如果你做了完整球面分布可以放开。注意这里旋转的是整个scene如果场景里还有其他元素不想被转应该把照片墙放进一个Group再旋转 Group。4. 性能与兼容照片多了怎么不卡4.1 纹理压缩与按需加载照片墙最容易卡在纹理上。一张 4000×3000 的 JPG 解码后占显存约 48MB50 张就是 2.4GB浏览器直接崩。常见做法是提前把照片压到 512×512 或 1024×1024格式用 WebP 或压缩后的 JPG。# 用 ImageMagick 批量压缩到 512 宽质量 80 mogrify -resize 512x512 -quality 80 -format jpg ./img/*.jpg这条命令会把 img 目录下所有图片缩到最长边 512质量 80。512 对于照片墙上的小图足够清晰显存占用降到每张约 1MB。如果原图是 PNG 带透明转 WebP 更好但要注意兼容性。按需加载则是只加载当前视野内的照片但心形墙通常整体可见收益不大不如直接压缩来得实在。4.2 合并几何体减少 Draw Call每张照片一个 Mesh 就是一次 Draw Call50 张就是 50 次加上每帧渲染低端设备会掉帧。优化手段是用InstancedMesh或者手动合并几何体。但照片纹理不同不能简单合并。折中方案是限制照片数量在 60 张以内并且关闭不必要的阴影和抗锯齿。// 关闭阴影降低抗锯齿开销 renderer.shadowMap.enabled false; // 如果照片不需要透明关掉 transparent material.transparent false; // 使用 BufferGeometryUtils 合并相同材质的平面如果纹理相同参数说明shadowMap默认关闭但有些示例会打开照片墙不需要阴影关掉省一大笔。transparent关掉后渲染顺序不敏感性能更好。如果所有照片用同一张纹理比如占位图可以用BufferGeometryUtils.mergeGeometries合并成一个 MeshDraw Call 降到 1但实际项目照片各不相同这个方案只适合做加载占位。4.3 移动端适配与触摸事件移动端没有鼠标事件要换成touchstart、touchmove、touchend。同时要处理设备像素比和屏幕尺寸变化。// 触摸事件 renderer.domElement.addEventListener(touchstart, (e) { isDragging true; prevX e.touches[0].clientX; prevY e.touches[0].clientY; }, { passive: true }); renderer.domElement.addEventListener(touchmove, (e) { if (!isDragging) return; const dx e.touches[0].clientX - prevX; const dy e.touches[0].clientY - prevY; velY dx * 0.005; velX dy * 0.005; prevX e.touches[0].clientX; prevY e.touches[0].clientY; }, { passive: true }); // 窗口尺寸变化 window.addEventListener(resize, () { camera.aspect window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize(window.innerWidth, window.innerHeight); });注意passive: true是告诉浏览器这个监听器不会阻止默认滚动能提升滚动性能。camera.updateProjectionMatrix()在修改 aspect 后必须调用否则画面比例不对。移动端还要考虑devicePixelRatio可能高达 3setPixelRatio限制到 2 能明显降低发热。5. 避坑与排查那些让我重做过三次的细节5.1 照片全黑或偏暗现象场景搭好照片加载了但显示出来是黑的或者很暗。原因通常是两个一是没有加灯光MeshBasicMaterial虽然不受光照影响但如果用了MeshStandardMaterial就必须有光二是纹理的colorSpace没设对Three.js r152 之后默认线性空间不设SRGBColorSpace就会偏暗。解决确认材质类型MeshBasicMaterial不需要光MeshStandardMaterial加AmbientLight纹理加载后立即设texture.colorSpace THREE.SRGBColorSpace。5.2 照片顺序错乱或重复现象心形上的照片顺序和预期不一致有的重复有的缺失。原因Promise.all返回的顺序和传入的 urls 顺序一致但如果在forEach里异步加载并直接 push 到数组顺序就乱了。解决用Promise.all配合map保证顺序或者给每个 texture 记录原始索引放置时按索引取。另外idx % textures.length这种取模在照片数少于点位时会重复要确保照片数大于等于点位数或者接受重复但打乱顺序。5.3 转动时照片突然消失现象鼠标拖拽旋转转到某个角度照片不见了。原因PlaneGeometry默认单面渲染背面不可见。解决材质设side: THREE.DoubleSide。但双面渲染有性能代价如果确定不会转到背面可以保持单面并限制旋转角度。另一个原因是相机的远裁面太小照片转到远处被裁掉把far从 5000 调大或把场景整体缩小。5.4 移动端触摸滚动页面而不是旋转现象手机上手指滑动页面跟着滚照片墙不转。原因touchmove默认会触发页面滚动即使你监听了事件。解决在touchmove里调用e.preventDefault()但要注意passive不能为 true否则 preventDefault 无效。或者给 canvas 加 CSStouch-action: none这是更现代的做法。canvas { touch-action: none; /* 禁止浏览器处理触摸手势 */ }5.5 照片墙整体偏移或不对称现象心形看起来歪了或者中心不在屏幕中央。原因心形参数方程的 y 轴范围和屏幕坐标系不一致或者照片平面没有居中。解决计算所有点的包围盒取中心点把整个 Group 的位置减去中心点。或者手动调整心形方程 y 范围大约在 -17 到 12 之间中心偏下所以y取负后还要加一个偏移量让视觉居中。6. 进阶让心形照片墙更有记忆点的两个技巧第一个技巧是给照片加入场动画。不要一次性全部显示而是按心形参数t的顺序逐张淡入配合缩放从 0 到 1视觉上像心形在「生长」。实现上给每张照片一个延迟用setTimeout或者在一个统一的时间轴上更新material.opacity。注意transparent要设为 true并且渲染顺序按距离排序否则透明混合会出错。第二个技巧是用粒子做心形轮廓的光晕。在照片墙外层再生成一圈更密集的点用Points加PointsMaterial颜色用暖红或粉色大小随距离衰减。这样转动时照片是主体粒子是氛围层次感立刻出来。粒子数量控制在 2000 以内移动端降到 800否则 GPU 压力大。验证方法很简单打开 Chrome DevTools 的 Performance 面板录制 10 秒转动过程看 FPS 是否稳定在 50 以上看 GPU 内存是否持续增长增长说明有纹理泄漏。我自己的习惯是每加一个效果就跑一次 Performance确认没有掉帧再继续。这个项目最值得投入的地方不是心形本身而是你在这个过程中把 Three.js 的相机、纹理、交互、性能四条线都摸了一遍换任何形状都只是改一个坐标函数的事。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

五种OpenCV图像滤波对比:BoxBlur、高斯、中值、双边滤波参数与选型指南

五种OpenCV图像滤波对比:BoxBlur、高斯、中值、双边滤波参数与选型指南

第一次系统性把 BoxBlur、Blur、GaussianBlur、medianBlur、bilateralFilter 这五种滤波放到一起对比,是因为手头某图像处理 Demo 的预处理流程出了问题:输入画面的噪声构成很杂,既有全局的高斯扰动,又时不时冒出几个椒盐白点。我…

2026/10/13 14:16:11 阅读更多 →
微信抢红包功能实现:二倍均值法与Redis原子操作详解

微信抢红包功能实现:二倍均值法与Redis原子操作详解

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

2026/10/13 14:16:11 阅读更多 →
PyTorch+MNIST云端快速验证:从环境配置到99.2%准确率

PyTorch+MNIST云端快速验证:从环境配置到99.2%准确率

1. 项目概述:为什么一个Notebook就能跑通MNIST识别?你有没有试过,打开PyTorch官网教程,复制粘贴几行代码,结果卡在环境配置上——CUDA版本不匹配、torchvision安装报错、GPU设备识别失败……最后关掉终端,默…

2026/10/13 14:16:11 阅读更多 →

最新新闻

【CStackGUI 实战】我用自研的 Win32 GUI 框架写了个「工具箱启动器」:8 页签、真注册表操作、右键菜单管理

【CStackGUI 实战】我用自研的 Win32 GUI 框架写了个「工具箱启动器」:8 页签、真注册表操作、右键菜单管理

文章目录一、这是什么二、功能介绍1. 八页签工具启动器 全局搜索2. 我的工具:改一个 ini 就能加工具,不用重编译3. 右键菜单管理:扫描、批量禁用、备份删除、一键还原4. 成对开关:模式照抄原版,落点绝不越界5. 日志与…

2026/10/13 15:07:39 阅读更多 →
从公开事故档案到结构化数据集:CrashData 抓取解析清洗全流程

从公开事故档案到结构化数据集:CrashData 抓取解析清洗全流程

简介:CrashData 是一份面向数据分析初学者与航空安全研究爱好者的 R 语言数据采集脚本资源,用于从 planecrashinfo.com 逐年抓取飞机失事的历史记录,解决公开事故数据分散、难以批量整理的问题。压缩包共 2 个文件,包含 1 个 R 脚…

2026/10/13 15:07:39 阅读更多 →
Palantir文件来源与血缘追溯:元数据四件套实战指南

Palantir文件来源与血缘追溯:元数据四件套实战指南

简介:Palantir插件资源包共16个文件,压缩包约75.55MB,其中14个zip为插件本体或依赖模块,另附1个HTML页面与1个md文档用于安装说明。这套包是Kodi媒体中心的插件集合:核心包括plugin.video.palantir2的2.1.9与2.1.10版本…

2026/10/13 15:07:39 阅读更多 →
绩效管理经典书籍推荐,入门必看!

绩效管理经典书籍推荐,入门必看!

要快速入门绩效管理,阅读一些经典书籍不失为一个好方法,而在所有绩效管理书籍中,最值得推荐的还是《经理人参阅:绩效管理》这本。对于刚接触绩效管理的HR来说,选对入门读物,可以少走不少弯路。这本书值得推…

2026/10/13 15:07:39 阅读更多 →
高校宿舍智能分配:用KMeans聚类实现多约束条件下的可解释分组

高校宿舍智能分配:用KMeans聚类实现多约束条件下的可解释分组

简介:本资源是一套面向高校信息化建设者、Python数据科学初学者及宿舍管理优化需求者的完整实践方案,聚焦KMeans聚类算法在真实校园场景中的落地应用——高校宿舍智能分配。通过Python实现学生多维特征(如专业、生活习惯、作息倾向等&#xf…

2026/10/13 15:07:39 阅读更多 →
【仓颉语言入门 · 第二篇 第 3 课】

【仓颉语言入门 · 第二篇 第 3 课】

【仓颉语言入门 第二篇 第 3 课】命令行参数解析:让程序听懂命令(std.argopt) 上一课结尾说过:我们的程序一直是"哑巴"——所有输入要么写死在代码里,要么靠改文件。真实世界的工具第一件事就是听懂命令行&…

2026/10/13 15:06:39 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →