Unity角色头部跟踪系统:Animation Rigging实现与性能优化
1. 项目概述为什么需要角色头部跟踪系统在Unity中开发角色时我们常常会遇到一个看似简单却影响深远的细节角色的头部如何自然地跟随目标无论是第一人称射击游戏中角色转头瞄准还是RPG中NPC与玩家对话时的眼神交流亦或是策略游戏中单位对选中指令的视觉反馈一个流畅、自然的头部跟踪系统都是提升沉浸感和角色“生命力”的关键。它远不止是让一个骨骼节点旋转那么简单它涉及到动画层级的优先级处理、骨骼旋转的物理限制、与现有动画系统的平滑混合以及性能开销的平衡。很多开发者尤其是新手可能会尝试在Update函数里直接写一句head.LookAt(target)。这样做虽然能让头转过去但结果往往非常生硬像机器人一样瞬间“咔哒”对准目标完全无视颈部、脊椎的连带运动并且会粗暴地覆盖掉角色正在播放的行走、奔跑等基础动画导致角色身体扭曲。一个成熟的头部跟踪系统需要像一位经验丰富的动画师一样在程序层面“引导”而非“命令”头部运动。我自己在多个项目里踩过坑后总结出头部跟踪系统的核心价值在于三点增强交互真实感、提升角色AI的智能表现、作为动画状态机的有效补充。它不是一个独立的功能而是一个需要与Animator Controller、动画蓝图、物理骨骼如Unity的Unity Animation Rigging深度集成的子系统。接下来我将拆解实现这样一个系统的完整思路、核心技术与避坑指南。2. 系统核心设计思路与架构选型实现头部跟踪首先得明确设计目标。我们不是要做一个万能解而是要一个可控、可混合、高性能的解决方案。核心思路可以概括为在动画系统的上层施加一个基于骨骼层级的、带约束的、可插值的旋转叠加层。2.1 核心方案对比Animator IK vs. Animation Rigging在Unity中主流实现路径有两条选择哪条取决于项目复杂度和对动画控制粒度的要求。方案一使用Animator的IK反向动力学功能这是Unity内置的、较为传统的方案。通过重写OnAnimatorIK回调函数我们可以设置AvatarIKGoal或AvatarIKHint来影响四肢而对于头部主要是通过设置Animator.SetLookAtPosition和Animator.SetLookAtWeight来实现。优点无需额外插件集成在Mecanim系统内与状态机结合较好。对于简单的“看向某点”需求配置快速。缺点控制粒度较粗难以进行复杂的多骨骼链如完整的颈椎链约束。权重控制参数相对简单与复杂动画混合时可能不够精细。性能开销在角色数量极多时需要关注。方案二使用Unity的Animation Rigging扩展包这是Unity官方推出的、基于Job System和Burst Compiler的高性能动画运行时扩展系统。它提供了MultiAimConstraint、TwoBoneIKConstraint等强大的约束组件可以像搭积木一样构建骨骼控制逻辑。优点控制粒度极细可以针对每一节脊椎骨进行独立的旋转约束和权重设置。性能优化好利用数据导向技术栈DOTS思想适合大量角色。可视化编辑逻辑清晰。缺点需要导入额外的Package学习曲线稍陡。对于非常简单的需求可能显得“杀鸡用牛刀”。选型建议 对于移动端、WebGL等性能敏感平台或者角色数量少于50的简单项目追求快速开发可以优先考虑Animator IK。 对于PC、主机项目需要电影级角色表现或场景中存在大量需要头部跟踪的NPC如大型开放世界Animation Rigging是更专业、更强大的选择。它代表了Unity动画技术的未来方向。本次分享我将以功能更强大、更代表先进工作流的Animation Rigging方案作为主线进行详解因为其设计思想更具普适性理解了它再回头看Animator IK会更容易。2.2 系统架构设计一个健壮的头部跟踪系统通常包含以下层级目标管理层负责管理和筛选跟踪目标。可能是玩家的摄像机位置、另一个角色、场景中的交互物体或者是AI计算出的一个兴趣点。跟踪逻辑层核心计算层。根据当前目标的位置计算头部及连带脊椎理论上应朝向的旋转角度。这里需要处理平滑过渡、上下左右的角度限制等。约束应用层将计算出的旋转数据通过Animation Rigging的约束组件安全、平滑地施加到角色的骨骼上。这一层负责处理与基础动画的混合。状态协调层与角色的Animator Controller或行为树通信。例如当角色进入“死亡”、“眩晕”状态时应强制关闭头部跟踪当角色“潜行”时可能需要降低头部转动的幅度和速度。3. 基于Animation Rigging的详细实现步骤让我们进入实战环节。假设我们有一个标准的人形角色Humanoid已经配置好了Avatar和基本的Animator Controller。3.1 环境准备与基础配置首先通过Unity的Package Manager安装Animation Rigging包。确保它已添加到你的项目中。创建Rig构建器在角色根物体通常是有Animator组件的那个GameObject下添加一个空子物体命名为Rig。然后为这个Rig物体添加Rig组件。创建骨骼映射在Rig物体下添加一个Bone Renderer组件可选用于可视化骨骼。更重要的是我们需要一个结构来引用骨骼。通常的做法是创建一个GameObject为其添加MultiParentConstraint组件但更优雅的方式是使用Rig Builder推荐的Transform引用。 实际上更常见的流程是为Rig物体添加一个子物体命名为HeadAim_Rig。然后为HeadAim_Rig添加所需的约束组件。Rig组件会管理其下所有约束的更新顺序。配置Rig Builder回到角色根物体添加Rig Builder组件。将之前创建的Rig物体拖拽到Rig Builder的Rig Layers列表中。3.2 核心约束设置Multi-Aim ConstraintMultiAimConstraint是实现头部跟踪的主力。它可以将一系列骨骼如头骨和几节颈椎骨的旋转约束到指向一个目标。创建约束对象在HeadAim_Rig下创建一个空物体命名为HeadAim_Constraint为其添加Multi-Aim Constraint组件。关联受约束骨骼在Multi-Aim Constraint组件的Constrained Object列表中添加需要影响的骨骼。通常至少包括Head骨骼。为了更自然的效果可以按顺序从上到下添加Neck、Spine2或上胸部骨骼等。权重可以递减例如Head权重为1.0Neck为0.7Spine2为0.3这样转动会从头部发起带动部分脊椎。设置目标源创建一个空物体作为跟踪目标例如HeadAim_Target将其拖拽到Multi-Aim Constraint的Source Objects列表中。约束器会使受约束骨骼的前向轴通常是Z轴指向这个目标物体。关键参数详解Aim Axis: 设置哪个骨骼本地轴指向目标。对于Mixamo等标准模型头部骨骼的前向轴通常是Blue (Z)。Up Axis: 保持哪个轴朝上通常为Green (Y)以确保头部不会产生奇怪的翻滚。World Up Type: 设置为Scene或Object Up以Vector (0,1,0)作为世界朝上方向保持稳定。Min Limit / Max Limit:这是实现自然转头的关键必须为头部旋转设置角度限制。例如设置Y轴左右限制为-80到80度X轴上下限制为-40到20度人很难大幅度抬头或低头。不设置限制头部可能会旋转360度导致模型严重变形。Weight: 约束的全局权重0为完全不影响1为完全应用。我们可以通过代码动态控制这个值来实现平滑的开启/关闭。3.3 编写目标控制脚本现在我们需要一个脚本来动态移动HeadAim_Target这个目标物体。using UnityEngine; using UnityEngine.Animations.Rigging; // 引入Rigging命名空间 public class HeadLookAtController : MonoBehaviour { [Header(Rig References)] [SerializeField] private Transform headAimTarget; // 拖入HeadAim_Target [SerializeField] private MultiAimConstraint headAimConstraint; // 拖入HeadAim_Constraint上的组件 [Header(Tracking Settings)] [SerializeField] private Transform defaultLookAtTarget; // 默认看向的目标如主摄像机 [SerializeField] private float rotationSpeed 5f; // 目标点移动的平滑速度 [SerializeField] private float maxTrackingDistance 10f; // 最大跟踪距离 [SerializeField] private LayerMask obstructionLayers; // 遮挡检测的层 private Transform currentTarget; private float currentWeight 0f; private bool isEnabled true; void Start() { if (defaultLookAtTarget null) defaultLookAtTarget Camera.main?.transform; SetTarget(defaultLookAtTarget); // 初始时权重为0通过平滑过渡开启 if (headAimConstraint ! null) headAimConstraint.weight 0f; } void Update() { if (!isEnabled || headAimTarget null || currentTarget null) return; // 计算理想的目标位置直接看向当前目标 Vector3 idealTargetPos currentTarget.position; // 简单的遮挡检测从头部或眼睛位置向目标发射射线 Vector3 headPos headAimConstraint.data.constrainedObject.position; // 获取头部骨骼世界位置 Vector3 directionToTarget (idealTargetPos - headPos).normalized; float distanceToTarget Vector3.Distance(headPos, idealTargetPos); RaycastHit hit; if (Physics.Raycast(headPos, directionToTarget, out hit, Mathf.Min(distanceToTarget, maxTrackingDistance), obstructionLayers)) { // 如果被遮挡则将目标点设置在遮挡物表面稍前的位置 idealTargetPos hit.point - directionToTarget * 0.1f; } else if (distanceToTarget maxTrackingDistance) { // 如果目标超出最大距离看向目标方向上的一个远点 idealTargetPos headPos directionToTarget * maxTrackingDistance; } // 使用Lerp平滑移动目标点避免跳跃 headAimTarget.position Vector3.Lerp(headAimTarget.position, idealTargetPos, Time.deltaTime * rotationSpeed); // 平滑过渡约束权重至1如果当前有目标且系统启用 float targetWeight (currentTarget ! null) ? 1.0f : 0.0f; currentWeight Mathf.Lerp(currentWeight, targetWeight, Time.deltaTime * rotationSpeed); if (headAimConstraint ! null) headAimConstraint.weight currentWeight; } /// summary /// 设置新的跟踪目标 /// /summary public void SetTarget(Transform newTarget) { if (newTarget currentTarget) return; currentTarget newTarget; // 当目标改变时可以在这里触发一些事件比如播放一个轻微的转头音效 } /// summary /// 启用或禁用整个头部跟踪系统 /// /summary public void SetEnabled(bool enabled) { isEnabled enabled; if (!enabled) { // 禁用时将目标权重平滑过渡到0 currentWeight 0f; if (headAimConstraint ! null) headAimConstraint.weight 0f; } } }注意上述代码中从headAimConstraint.data.constrainedObject获取头部位置是一种方法。更稳健的做法是在Inspector中公开一个Transform headBone字段手动将角色的头部骨骼拖拽进去。3.4 与动画状态机的集成头部跟踪不应该在所有动画状态下都生效。我们需要在Animator Controller中管理一个Bool类型的参数例如CanLookAt。在HeadLookAtController脚本中增加对Animator的引用和参数监听。在Animator中为“死亡”、“倒地”、“过场动画”等状态设置CanLookAt为False。可以在State Machine Behaviours中设置或通过其他游戏逻辑脚本设置。修改Update逻辑只有当CanLookAt为True时才执行跟踪计算和权重混合。// 在HeadLookAtController中新增 private Animator animator; private int canLookAtParamHash; void Start() { animator GetComponentAnimator(); canLookAtParamHash Animator.StringToHash(CanLookAt); // ... 其他初始化 } void Update() { bool canLook animator ! null animator.GetBool(canLookAtParamHash); // 将 canLook 条件整合到跟踪逻辑中 if (!isEnabled || !canLook || headAimTarget null) { // 平滑关闭权重 currentWeight Mathf.Lerp(currentWeight, 0f, Time.deltaTime * rotationSpeed * 2); // 关闭时可以更快 if (headAimConstraint ! null) headAimConstraint.weight currentWeight; return; } // ... 原有的跟踪逻辑 }4. 高级技巧与性能优化实现基础功能后以下几个高级技巧能让你的系统从“能用”变得“好用”。4.1 实现自然的视线偏移与随机微动永远直视目标中心会显得呆板。我们可以为目标点添加一个小的随机偏移模拟真人视线的不确定性。[Header(Naturalism Settings)] [SerializeField] private float maxHorizontalOffset 0.05f; [SerializeField] private float maxVerticalOffset 0.03f; [SerializeField] private float offsetChangeInterval 2f; // 偏移变化间隔 private float offsetTimer; private Vector3 currentOffset; void UpdateNaturalOffset() { offsetTimer - Time.deltaTime; if (offsetTimer 0) { // 在限定范围内生成新的随机偏移 currentOffset new Vector3( Random.Range(-maxHorizontalOffset, maxHorizontalOffset), Random.Range(-maxVerticalOffset, maxVerticalOffset), 0 // 深度方向通常不需要偏移 ); offsetTimer offsetChangeInterval Random.Range(-0.5f, 0.5f); // 加入随机性 } } // 在计算idealTargetPos后加上这个偏移需要转换到合适的空间可能是目标物体的本地空间4.2 多目标优先级与平滑切换在复杂场景中角色可能同时看到多个可交互对象。我们需要一个目标管理器。public class HeadLookAtTargetManager : MonoBehaviour { private HeadLookAtController lookController; private ListLookAtTarget potentialTargets new ListLookAtTarget(); private LookAtTarget currentBestTarget; void Update() { if (potentialTargets.Count 0) return; LookAtTarget best null; float bestScore float.MinValue; foreach (var target in potentialTargets) { float score CalculateTargetScore(target); if (score bestScore) { bestScore score; best target; } } if (best ! currentBestTarget) { currentBestTarget best; lookController.SetTarget(best?.transform); } } private float CalculateTargetScore(LookAtTarget target) { float score 0; // 因素1距离越近分越高 float distance Vector3.Distance(transform.position, target.transform.position); score (1f / Mathf.Max(distance, 0.1f)) * 10; // 因素2是否在视野锥内FOV if (IsInFieldOfView(target.transform)) score 50; // 因素3目标的重要性可配置的优先级 score target.priority; // 因素4最近是否交互过时效性 // ... 其他游戏特定逻辑 return score; } // 注册/注销目标的方法 public void RegisterTarget(LookAtTarget target) { /*...*/ } public void UnregisterTarget(LookAtTarget target) { /*...*/ } }4.3 性能优化要点当场景中有上百个NPC时每个都每帧进行射线检测和复杂计算是不可取的。降低更新频率对于非关键NPC如背景角色不要每帧更新HeadLookAtController.Update()。可以使用InvokeRepeating或基于距离的更新频率LOD。void UpdateLowPriority() { // 每5帧更新一次 if (Time.frameCount % 5 0) { PerformLookAtLogic(); } }简化遮挡检测对于大量角色可以使用球体投射Physics.OverlapSphere或触发器体积进行粗略的“前方是否有障碍”判断而非精确的射线检测。使用Animation Rigging的运行时优化Animation Rigging本身已为性能优化。确保在Rig Builder组件上为不需要每帧更新的Rig层如远处的角色设置合适的更新模式Update Mode例如设为Manual并在脚本中控制。对象池管理目标物体如果每个角色都动态生成目标物体可以考虑使用对象池来管理HeadAim_Target这类轻量级GameObject。5. 常见问题排查与调试技巧即使按照步骤操作你也可能会遇到一些问题。以下是一些常见坑点及其解决方案。5.1 头部旋转方向错误或扭曲症状头转向了完全错误的方向或者脖子严重扭曲。排查检查Aim Axis这是最常见的原因。选中头部骨骼在Scene视图的Gizmo中查看其本地坐标轴。通常需要指向鼻尖的方向是前向轴蓝色Z。在MultiAimConstraint中确认Aim Axis设置正确。检查骨骼层级和初始旋转导入的模型骨骼初始旋转可能非零。确保在建模或导入设置中骨骼的初始旋转尽可能归零或符合标准T-Pose。可以在导入Rig设置中尝试不同的Animation Type或Avatar Definition。检查World Up Type如果头部发生翻滚调整World Up Type和World Up Vector。尝试设置为Object Up并指定一个向上的Transform如角色自身。5.2 头部跟踪与基础动画如走路冲突症状角色走路时头部跟踪生效导致上半身僵硬或脚步滑动。排查权重分配确保在MultiAimConstraint中只有头部和部分上脊椎骨骼受强烈影响。腰部以下的骨骼权重应为0。通过调整Constrained Objects列表中每个骨骼的权重实现从头部到脊椎的平滑衰减。动画层优先级Animation Rigging约束是在动画播放之后应用的。如果基础动画本身就包含强烈的头部运动如某些夸张的跑步动画约束会覆盖它。这时需要调整原始动画或者使用动画遮罩Avatar Mask在Animator层中限制基础动画对头部骨骼的影响范围让Rigging层有更大的控制权。5.3 性能开销过大症状角色增多后帧率明显下降。排查Profile分析使用Unity Profiler查看Animation Rigging和OverlapSphere/Raycast的CPU耗时。禁用不可见角色通过OnBecameVisible/OnBecameInvisible或自定义的视锥体剔除禁用屏幕外角色的头部跟踪逻辑。简化约束链对于远处的角色只对Head骨骼应用约束去掉Neck和Spine的约束或者大幅降低其权重。5.4 跟踪切换时出现“跳跃感”症状目标突然切换时头部瞬间“弹”到新方向。解决关键在于不要直接切换目标Transform的位置而是平滑插值目标物体的位置。正如我们在控制脚本中使用Vector3.Lerp移动headAimTarget.position一样。同时约束权重headAimConstraint.weight的开启和关闭也应使用Mathf.Lerp或Mathf.SmoothDamp进行平滑过渡创造一个淡入淡出的效果。调试时多使用Scene视图的Gizmo。开启Bone Renderer或手动绘制Debug射线Debug.DrawRay来可视化目标点、视线方向和遮挡检测结果能极大提升排查效率。

相关新闻

图解SQL JOIN:从INNER到FULL OUTER,避坑数据查询失真

图解SQL JOIN:从INNER到FULL OUTER,避坑数据查询失真

1. 从一次数据查询的“翻车”说起那天下午,产品经理急匆匆地跑过来,说后台报表里新用户的数据对不上,明明昨天注册了1000人,但统计出来的活跃行为只有800条记录。我第一反应是数据同步延迟,但检查了流水日志&#xff0…

2026/10/12 14:30:44 阅读更多 →
WorkBuddy x CSDN MCP 链路自检(草稿)

WorkBuddy x CSDN MCP 链路自检(草稿)

链路自检草稿 这是一次 MCP 验活,仅存草稿不发布。 验证 Cookie 有效验证签名通过

2026/10/12 16:22:37 阅读更多 →
SIM800C GSM/GPRS模块开发指南:从AT指令到物联网应用实战

SIM800C GSM/GPRS模块开发指南:从AT指令到物联网应用实战

1. 项目概述:从一块“黑疙瘩”到物联网基石第一次拿到SIM800C模块,它就是个不起眼的黑色方块,几排引脚,一个天线接口,看起来平平无奇。但就是这个模块,在过去十年里,成为了无数物联网项目、远程…

2026/10/12 20:51:57 阅读更多 →

最新新闻

WSL 下 CPU 版 Caffe 与 Faster R-CNN 环境搭建实战

WSL 下 CPU 版 Caffe 与 Faster R-CNN 环境搭建实战

1. 为什么要在 WSL 里折腾 CPU 版 Caffe 和 Faster R-CNN先把场景说清楚。你手里大概率是一台 Windows 笔记本或者台式机,显卡要么是核显,要么是 N 卡但驱动环境不想动,总之短期内不打算碰 CUDA。可你又想跑通一个经典的目标检测流程&#xf…

2026/10/13 17:58:35 阅读更多 →
三种手眼标定方法实战对比:AX=XB、非线性优化与FOE

三种手眼标定方法实战对比:AX=XB、非线性优化与FOE

简介:这份PDF资料聚焦机器人视觉中的手眼标定技术,面向计算机视觉、双目视觉与机器人抓取方向的学习者和研究者,系统讲解末端执行器与摄像头坐标系转换关系的求解思路。内容从Euler角、Rodrigues表示、Cayley表示及FOE点等基础知识切入&#…

2026/10/13 17:58:35 阅读更多 →
交换机端口镜像SPAN全解析:从原理到排障实战

交换机端口镜像SPAN全解析:从原理到排障实战

抓包可以说是网络工程师最常用的排查手段之一,但很多刚入行的朋友第一次遇到“端口镜像”这个概念时,都会卡在一个问题上:明明交换机上连着好几台设备,我把电脑接在交换机上,为什么用抓包工具就是看不到别的机器在跑什…

2026/10/13 17:58:35 阅读更多 →
图书管理系统课程设计:从E-R图到SQL Server存储过程的完整实践指南

图书管理系统课程设计:从E-R图到SQL Server存储过程的完整实践指南

简介:一份软件工程与数据库课程设计任务书,围绕“图书管理系统”展开完整数据库设计流程,适合高校计算机、软件工程专业学生作为课程设计参考。文档覆盖需求分析、概念结构设计(E-R图)、逻辑结构设计(关系模…

2026/10/13 17:58:35 阅读更多 →
自然语言优化求解系统:NLP与运筹学融合的工程实践

自然语言优化求解系统:NLP与运筹学融合的工程实践

1. 这不是又一个“大模型微调教程”,而是一套可落地的NLPSolver工程实践“从零构建一个自己的自然语言优化求解系统”——这个标题里藏着三个容易被忽略但极其关键的词:自己的、优化求解、系统。它不指向LLM API调用封装,不等于Prompt Engine…

2026/10/13 17:58:35 阅读更多 →
PS中英文对照表制作指南:从菜单导出到PDF生成与版本维护

PS中英文对照表制作指南:从菜单导出到PDF生成与版本维护

简介:这份PS中英文对照表PDF面向Photoshop初学者及需要查阅英文界面术语的设计从业者,帮助解决中文版与英文版菜单名称对应困难、切换语言环境后找不到功能入口的问题。资源包共1个PDF文件,大小约18KB,轻量易存,适合打…

2026/10/13 17:57:33 阅读更多 →

日新闻

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

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

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

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/13 16:22:04 阅读更多 →
影刀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 阅读更多 →