Three.js粒子系统多模型切换动画:用TaoToken统一Key打通shader调试链路
1. Three.js 粒子系统多模型切换动画为什么卡在 shader 调试粒子系统做多模型切换最直观的坑不在动画本身而在调试链路。你写完顶点着色器把oldPositions、toPositions、toPositionsDuration这些 attribute 塞进BufferGeometry跑起来发现粒子要么原地不动要么瞬间跳变要么颜色过渡断层。问题往往出在三个地方attribute 没标needsUpdate、uniform 的time没推进、模型点数和粒子总数不匹配导致索引越界。我试过用 9 万多个点做形态切换单个模型直接更新position数组帧率掉到个位数换成自定义 shader 把插值计算交给 GPU 后页面其他交互完全不受影响。核心思路是CPU 只负责在切换瞬间写入起点、终点、时长、颜色GPU 每帧根据time算当前位置。这样即使点数上万每帧的 JS 开销也接近零。但调试这套链路时另一个隐形成本出现了着色器逻辑改一版就要重新验证一次请求参数、模型数据、材质 uniform 是否对齐。如果本地同时开着多个模型源、多个调试端点Key 和 Base URL 散落在不同配置文件里改一处忘一处报错信息还经常是reading choices这种和 Three.js 无关的提示排查方向直接被带偏。这篇面向需要在本地快速验证粒子形态切换效果的开发者给出可复制的粒子系统配置、多模型切换参数与 shader 片段并演示通过 TaoToken 统一 Key/API 通道完成调试请求的验证动作。TaoToken 在这里的角色不是渲染引擎而是把调试期用到的模型对话、代码补全、参数校验请求收敛到一个入口减少在多个 Key 之间来回切换的干扰。官网入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 通道是 https://taotoken.net/api 两者分工不同后面会具体说。适合谁已经能跑通单个模型粒子化、想进一步做多形态平滑过渡的前端开发者正在被 shader attribute 更新时机折磨、想找一套可复现调试流程的人以及希望把调试请求统一管理、不想在多个平台 Key 之间反复横跳的团队。2. TaoToken 统一 Key 在粒子调试链路里的前置准备先把定位说清楚TaoToken 不参与 Three.js 的渲染它解决的是调试过程中“请求往哪发、用哪个 Key、模型 ID 写什么”这三个问题。粒子系统的 shader 调试经常需要边改边问——比如确认gl_PointSize的近大远小公式、核对AdditiveBlending和depthWrite的搭配、让模型帮你生成一段颜色插值代码。这些请求如果分散在多个平台每个平台一套 Key、一套 Base URL、一套模型命名切换成本会吃掉大量调试时间。TaoToken 的做法是提供一个统一的 API 通道Base URL 固定为https://taotoken.net/apiKey 在控制台生成一次模型 ID 按平台实际支持的名称填写。这样你在调试脚本、IDE 插件、命令行工具里填的是同一组凭证改模型只改 Model ID 一个字段。前置准备分三步。第一步拿到 Key。进入控制台页面路径是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 创建 API Key。建议按用途分 Key比如“粒子调试专用”“日常编码专用”方便后续排查是哪个环节的请求出了问题。Key 只在创建时完整显示一次复制后存到本地环境变量不要硬编码进前端仓库。第二步确认接入文档里的字段规范。文档地址是 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 重点看三件事Base URL 是否要带/v1、请求头里 Authorization 的格式、模型 ID 的命名规则。这三项写错报错往往不是 401 就是model not found和 shader 本身无关但会浪费大量时间。第三步准备一个最小验证脚本。不要一上来就接进 Three.js 项目先用 curl 或 Node 脚本确认通道通。验证通过后再把配置搬进项目这样出问题时能快速判断是通道问题还是渲染问题。这里要强调一个边界TaoToken 是 API 通道不是编辑器替代品也不做模型直连生产库。粒子系统的几何数据、纹理、模型文件仍然走你自己的加载流程TaoToken 只处理调试期的文本请求。把这条边界守住排查思路才不会乱。如果你后续要做长期编码或 Agent 类任务可以了解 Coding Plan入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 它面向的是持续性的编码辅助场景和粒子调试这种短平快验证是两种用法。3. 可复制的粒子系统配置与多模型切换参数这一节给出能直接落地的配置。先看粒子控制器的核心结构再看着色器材质最后看多模型数据怎么追加。粒子控制器的构造函数里关键是把所有 attribute 一次性分配好。粒子总数必须大于等于所有模型中最大的点数否则显示不全。下面这段是精简后的可复制版本保留了oldPositions、toPositions、toPositionsDuration、color、oldColor五个 attributeimport { BufferAttribute, BufferGeometry, Color, Points, TextureLoader } from three; import { PointsShaderMaterial } from ./shader/points.material; export class PointsControlClass { constructor(numberOfPoints) { this.numberOfPoints numberOfPoints; this.particlesGeometry new BufferGeometry(); this.positions new Float32Array(numberOfPoints * 3); this.oldPositions new Float32Array(numberOfPoints * 3); this.toPositions new Float32Array(numberOfPoints * 3); this.toPositionsDuration new Float32Array(numberOfPoints); this.color new Float32Array(numberOfPoints * 3); this.oldColor new Float32Array(numberOfPoints * 3); this.particlesGeometry.setAttribute(position, new BufferAttribute(this.positions, 3)); this.particlesGeometry.setAttribute(oldPositions, new BufferAttribute(this.oldPositions, 3)); this.particlesGeometry.setAttribute(toPositions, new BufferAttribute(this.toPositions, 3)); this.particlesGeometry.setAttribute(toPositionsDuration, new BufferAttribute(this.toPositionsDuration, 1)); this.particlesGeometry.setAttribute(color, new BufferAttribute(this.color, 3)); this.particlesGeometry.setAttribute(oldColor, new BufferAttribute(this.oldColor, 3)); const textureLoader new TextureLoader(); PointsShaderMaterial.uniforms.textureMap { value: textureLoader.load(starMap.src), }; this.particles new Points(this.particlesGeometry, PointsShaderMaterial); this.modelsList { current: -1, length: 0 }; this.init(); } }着色器材质用ShaderMaterial注意补上PointsMaterial才有的size和sizeAttenuation效果因为自定义 shader 不会自动带这些import { AdditiveBlending, ShaderMaterial } from three; import vertexShader from ./points.vt.glsl; import fragmentShader from ./points.fm.glsl; export const PointsShaderMaterial new ShaderMaterial({ uniforms: { time: { value: 0 }, size: { value: 8 }, }, blending: AdditiveBlending, transparent: true, vertexShader, fragmentShader, alphaTest: 0.001, depthWrite: false, });顶点着色器负责插值。percent是当前时间在单点运动时长中的占比超过 1 就停在终点varying vec3 vColor; uniform float time; uniform float size; attribute vec3 color; attribute vec3 oldColor; attribute vec3 toPositions; attribute vec3 oldPositions; attribute float toPositionsDuration; void main() { vec3 dispatchPos toPositions; vColor color; float percent time / toPositionsDuration; if (percent 1.0) { dispatchPos.x oldPositions.x percent * (toPositions.x - oldPositions.x); dispatchPos.y oldPositions.y percent * (toPositions.y - oldPositions.y); dispatchPos.z oldPositions.z percent * (toPositions.z - oldPositions.z); vColor.x oldColor.x percent * (color.x - oldColor.x); vColor.y oldColor.y percent * (color.y - oldColor.y); vColor.z oldColor.z percent * (color.z - oldColor.z); } vec4 viewPosition modelViewMatrix * vec4(dispatchPos, 1.0); gl_Position projectionMatrix * viewPosition; gl_PointSize size; gl_PointSize * (120.0 / -(modelViewMatrix * vec4(dispatchPos, 1.0)).z); }片元着色器只做颜色输出varying vec3 vColor; void main() { gl_FragColor vec4(vColor, 1.0); }多模型切换的核心在toIndex方法。它把目标模型的点坐标循环写入toPositions同时把当前toPositions存进oldPositions作为起点再按 x 坐标算颜色分界toIndex(index) { const { positions, color, box3, duration } this.modelsList[index]; const pointCount positions.length / 3; const { dividingLine, left, right } color; const width Math.abs(box3.min.x - box3.max.x); const dividingLineValue box3.min.x width * dividingLine; for (let i 0, realCount 0; i this.numberOfPoints; i, realCount) { realCount realCount % pointCount; const i3 i * 3; const r3 realCount * 3; this.oldPositions[i3] this.toPositions[i3]; this.oldPositions[i3 1] this.toPositions[i3 1]; this.oldPositions[i3 2] this.toPositions[i3 2]; const x positions[r3]; this.toPositions[i3] x; this.toPositions[i3 1] positions[r3 1]; this.toPositions[i3 2] positions[r3 2]; this.oldColor[i3] this.color[i3]; this.oldColor[i3 1] this.color[i3 1]; this.oldColor[i3 2] this.color[i3 2]; const percent Math.abs( x dividingLineValue ? ((box3.min.x - x) / (dividingLineValue - box3.min.x)) * dividingLine * dividingLine : ((x - dividingLineValue) / (box3.max.x - dividingLineValue)) * (1 - dividingLine) dividingLine ); this.color[i3] left.r - percent * (left.r - right.r); this.color[i3 1] left.g - percent * (left.g - right.g); this.color[i3 2] left.b - percent * (left.b - right.b); this.toPositionsDuration[i] duration.min Math.random() * (duration.max - duration.min); } }切换后必须逐个标needsUpdate否则 GPU 拿到的还是旧数据updateAttributes() { this.particlesGeometry.attributes.color.needsUpdate true; this.particlesGeometry.attributes.oldColor.needsUpdate true; this.particlesGeometry.attributes.toPositions.needsUpdate true; this.particlesGeometry.attributes.oldPositions.needsUpdate true; this.particlesGeometry.attributes.toPositionsDuration.needsUpdate true; }加载模型并追加数据时用getObjectByProperty(type, Mesh)取网格把geometry.attributes.position.array作为点源td.loadGltf(url).then((g) { const targetMesh g.scene.getObjectByProperty(type, Mesh); if (!targetMesh) throw new Error(获取目标物体失败); const { array: positions } targetMesh.geometry.attributes.position; targetMesh.geometry.computeBoundingBox(); const color { left: new Color(#f00), right: new Color(#5f1), dividingLine: 0.65 }; const params { duration: { min: 1000, max: 3000 }, color, positions, box3: targetMesh.geometry.boundingBox, }; PointsControl.append(params, 0); });如果你在调试这些参数时需要让模型帮你核对公式或生成变体可以在项目里放一份统一的请求配置。以 Node 环境为例用环境变量存 KeyBase URL 固定// debug-client.js const BASE_URL https://taotoken.net/api; const API_KEY process.env.TAOTOKEN_API_KEY; async function askModel(prompt, modelId) { const res await fetch(${BASE_URL}/chat/completions, { method: POST, headers: { Content-Type: application/json, Authorization: Bearer ${API_KEY}, }, body: JSON.stringify({ model: modelId, messages: [{ role: user, content: prompt }], }), }); if (!res.ok) { throw new Error(请求失败: ${res.status} ${await res.text()}); } return res.json(); }这段配置里三个字段必须对齐Base URL 用https://taotoken.net/apiKey 从控制台生成后放进环境变量Model ID 按文档里实际支持的名称填。三件套缺一个请求就会失败而失败信息经常和 Three.js 报错混在一起所以建议把调试请求单独封装别和渲染逻辑耦合。4. 验证请求与成功结果从 curl 到粒子切换实测配置写完后先别急着接进 Three.js。用最小请求确认通道通再验证粒子切换。第一步命令行验证。把 Key 放进环境变量后执行export TAOTOKEN_API_KEY你的Key curl -s https://taotoken.net/api/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -d { model: 你的ModelID, messages: [{role: user, content: 用一句话说明GLSL中varying的作用}] }成功时返回 JSONchoices[0].message.content里有模型输出。如果返回 401说明 Key 或 Authorization 格式有问题如果返回model not found说明 Model ID 和文档不一致。这两种错误都和 shader 无关先解决通道再调渲染。第二步把请求封装进调试脚本验证模型能否正确理解你的 shader 问题。比如问它“gl_PointSize * (120.0 / -(modelViewMatrix * vec4(dispatchPos, 1.0)).z)里负号的作用是什么”看返回是否指向透视除法后的深度。这一步的目的是确认你问的问题能被正确解析而不是让模型替你写渲染代码。第三步回到 Three.js 项目验证粒子切换。在渲染循环里推进timelet clock new THREE.Clock(); function animate() { requestAnimationFrame(animate); const elapsed clock.getElapsedTime() * 1000; PointsControl.update(elapsed); renderer.render(scene, camera); }注意time的单位要和toPositionsDuration一致。上面duration用的是毫秒所以elapsed乘了 1000。如果单位混用粒子会瞬间到位或者永远不动。第四步触发切换。调用next()或prev()观察粒子是否平滑过渡document.querySelector(#next).addEventListener(click, () { PointsControl.next(); });成功的结果是点击切换后粒子从当前形态平滑移动到目标形态颜色按 x 坐标从左到右渐变运动时长在 1000 到 3000 毫秒之间随机分布整体没有卡顿。9 万多个点的场景下帧率应保持稳定页面其他交互不受影响。如果要做模型对话类的交互验证比如让用户输入一句话生成粒子参数可以用模型对话入口 https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 先手动试几轮确认返回格式稳定后再接进代码。这样比直接写死在项目里调试更快。验证阶段还有一个实用技巧把每次切换的oldPositions、toPositions、toPositionsDuration抽样打印几个值确认起点和终点不是同一组数据。如果两者相等粒子看起来就是静止的但代码不报错很容易误判为 shader 问题。5. 本篇常见错误排查401、local proxy failed、reading choices调试链路里最容易撞上的几类报错逐个拆。401 Unauthorized。最常见的原因是 Key 没读到、Authorization 头格式不对、或者 Key 前后带了空格。检查顺序先确认环境变量在当前 shell 里生效echo $TAOTOKEN_API_KEY再确认请求头是Bearer加 Key中间一个空格。如果用的是前端直接请求注意不要把 Key 暴露在浏览器里调试请求应该走本地脚本或后端转发。local proxy failed。这类提示通常出现在本地网络配置或工具链层面和 TaoToken 的 API 通道无关。排查方向是确认本地请求能否直连https://taotoken.net/api以及是否有其他工具占用了同名环境变量。不要在这个方向上引入任何网络代理类工具保持请求路径干净。reading choices。这个报错说明代码在解析返回时choices字段不存在。原因通常是请求失败但代码没检查res.ok直接res.json().choices。修复方式是先判断状态码再取字段const res await fetch(url, options); if (!res.ok) { const text await res.text(); throw new Error(HTTP ${res.status}: ${text}); } const data await res.json(); const content data?.choices?.[0]?.message?.content; if (!content) { throw new Error(返回结构异常: ${JSON.stringify(data)}); }OAuth 相关报错。如果你用的是需要 OAuth 授权的客户端工具报错通常指向 token 过期或回调地址不匹配。这类问题优先看工具自身的授权配置确认 Base URL 填的是https://taotoken.net/api而不是带其他路径的地址。attribute 更新后粒子不动。这不是请求报错但排查频率很高。检查三件事needsUpdate是否逐个设置、time是否在渲染循环里推进、toPositionsDuration是否被写成了 0。时长为 0 会导致除零percent变成Infinity插值结果异常。粒子数量不足导致显示不全。构造函数里的numberOfPoints必须大于等于所有模型中最大的点数。如果某个模型有 12 万点而控制器只分配了 9 万多出来的点会被截断。排查时打印每个模型的positions.length / 3和numberOfPoints对比。颜色过渡断层。检查dividingLine是否在 0 到 1 之间以及box3是否在写入数据前调用了computeBoundingBox()。如果box3是空的分界值计算会得到NaN颜色插值随之失效。切换时闪烁。通常是depthWrite和AdditiveBlending搭配问题。粒子材质设了depthWrite: false后叠加混合下不会互相遮挡视觉上更干净。如果还闪检查alphaTest是否设了合理值纹理透明区域是否被正确剔除。排查时建议把请求层和渲染层分开验证先用 curl 确认通道返回正常再在浏览器里确认粒子数据写入正常最后看 shader 插值。三层分开定位速度会快很多。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 字段规范以文档为准。6. 把调试请求收敛到一个入口粒子系统的 shader 调试难点从来不是某一行 GLSL而是“改一版、验一版”的循环里请求配置、模型 ID、Key 管理这些杂事不断打断思路。把 Base URL 固定成https://taotoken.net/apiKey 在控制台生成一次Model ID 按文档填写三件套对齐后调试脚本、IDE 插件、命令行工具用的是同一组凭证改模型只改一个字段。如果你只是偶尔验证模型返回用模型对话入口手动试几轮就够如果要把请求接进项目去 API Keys 页面生成专用 Key路径是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 再对照接入文档把字段填对。长期做编码辅助或 Agent 类任务再看 Coding Plan 的用法。最后留一个实操建议把粒子切换的toIndex逻辑和请求封装分成两个文件渲染出问题时先确认数据写入请求出问题时先确认通道返回。两层不混排查就不会被reading choices这种无关报错带偏。

相关新闻

PHP+WebRTC实时互动系统源码:Laravel+Swoole音视频陪练方案

PHP+WebRTC实时互动系统源码:Laravel+Swoole音视频陪练方案

简介:这是一套基于PHP开发的全功能游戏陪玩平台源码,面向Web与移动应用开发者、创业团队及二次开发爱好者,用于快速搭建集直播、社交、陪玩匹配于一体的在线游戏服务平台。资源包含完整前后端代码,支持WAP自适应网页及安卓、iOS双…

2026/10/18 9:45:34 阅读更多 →
Bolt.new 一句话建站实测:开源 AI 全栈开发如何用 TaoToken 打通模型调用

Bolt.new 一句话建站实测:开源 AI 全栈开发如何用 TaoToken 打通模型调用

/* 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 9:45:34 阅读更多 →
免安装ZBar库二维码识别实战:DLL部署与Python ctypes调用

免安装ZBar库二维码识别实战:DLL部署与Python ctypes调用

简介:ZBar库免安装版是一套面向 Windows 开发者的开源二维码/条形码识别工具包,内部同时提供 64 位与 32 位库文件,拷贝即可使用,省去编译安装环节。整个压缩包共 41 个文件、约 3.66MB,核心包含 DLL 动态链接库、头文…

2026/10/18 9:44:34 阅读更多 →

最新新闻

DDIA核心思想:数据系统是一套精密妥协机制

DDIA核心思想:数据系统是一套精密妥协机制

简介:本资源是《设计数据密集型应用程序》(DDIA)中文译本的完整 GitBook 风格学习包,面向分布式系统工程师、数据库开发者、后端架构师及进阶全栈工程师,聚焦数据系统设计核心能力提升——从底层存储、事务一致性到流处…

2026/10/18 11:11:00 阅读更多 →
基于SpringBoot的农用车4S店管理系统实战解析

基于SpringBoot的农用车4S店管理系统实战解析

每年到了毕业季,计算机专业的同学就开始为选题头疼。电商、商城、博客、会议室预约,这些老面孔估计不少人都看厌了。我今天想认真聊聊一个比较冷门但很实用的切入点:基于springboot的农用车4S店管理系统。这套题目如果你正在犹豫选什么&#…

2026/10/18 11:11:00 阅读更多 →
DDIA实战:用四层抽象重构订单履约系统

DDIA实战:用四层抽象重构订单履约系统

简介:本资源是《设计数据密集型应用程序》(DDIA)中文译本的完整 GitBook 风格学习包,面向分布式系统工程师、数据库开发者、后端架构师及进阶全栈工程师,聚焦数据系统设计核心能力提升——从底层存储、事务一致性到流处…

2026/10/18 11:11:00 阅读更多 →
Delphi ODAC 安装配置全攻略:从环境准备到连接测试

Delphi ODAC 安装配置全攻略:从环境准备到连接测试

简介:本资源为Delphi与CBuilder开发者准备的ODAC(Oracle Data Access Components)Oracle连接控件组件库,面向需要在Windows桌面应用中高效访问Oracle数据库的中高级开发者。ODAC由Devart开发,核心组件TOracleConnectio…

2026/10/18 11:11:00 阅读更多 →
MySQL 8.0 免安装版部署指南:从解压到远程连接全流程

MySQL 8.0 免安装版部署指南:从解压到远程连接全流程

简介:这是一份面向后端开发、运维及数据库学习者的 MySQL 8.0 免安装绿色版资源,主打解压即用,无需繁琐安装流程,适合快速搭建本地测试环境或临时部署数据库服务。压缩包共 420 个文件,以 sdi、dll、pdb、exe、xml、sy…

2026/10/18 11:11:00 阅读更多 →
rea技术路线全解析:React、REA会计模型与实时分析实践指南

rea技术路线全解析:React、REA会计模型与实时分析实践指南

1. 从一个字母组合说起:为什么"rea"值得单独拿出来聊第一次看到"rea"这个标题,我脑子里蹦出来的第一反应是——这大概率是个缩写,而且是个被严重低估的缩写。在技术圈里,三个字母的组合往往承载着远超字面长度…

2026/10/18 11:09:58 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →