UE4室内VR交互开发:移动、抓取与UI实现指南
1. 从零搭建一个能走能抓的VR房间先搞清楚UE4里哪些轮子已经造好了很多人第一次打开UE4准备做VR室内交互第一反应是去网上找一套模板工程拖进来改改就完事。我早期也这么干过结果项目做到一半发现移动逻辑和碰撞打架、抓取物体穿墙、UI射线对不准回头拆模板比自己从头搭还费劲。所以这篇内容我打算换个思路讲——不依赖任何现成VR模板从UE4自带的基础组件出发把室内VR交互最核心的几件事一件件搭出来。所谓“室内VR交互基本功能”拆开来看其实就四件事能在房间里自由移动、能用手柄抓住和放下物体、能跟场景里的UI或按钮产生交互、能触发一些简单的反馈比如高亮、音效、震动。这四件事覆盖了绝大多数室内VR Demo和展示类项目的需求比如虚拟样板间、工业培训模拟、教育类场景漫游。适合的读者是已经会打开UE4编辑器、知道Actor和蓝图是什么、但还没系统做过VR交互的开发者。如果你连蓝图节点都没连过建议先花半天把官方的基础蓝图教程过一遍再回来。UE4做VR有一个天然优势它内置了MotionController组件和VR追踪相关的底层支持你不需要自己写驱动层的东西。但劣势也很明显——默认的移动组件CharacterMovementComponent是为键鼠和手柄设计的直接搬到VR里会有眩晕和碰撞问题。所以整篇文章的核心逻辑就是哪些用引擎自带的哪些必须自己改改的时候为什么这么改。我下面所有的操作都基于UE4.27版本这是目前VR项目里稳定性最好的一版。UE5的VR模板改动比较大但核心思路是通的我会在关键位置标注UE5的差异。2. 移动方案的选择传送还是平滑移动这不是一个随便选的选择题2.1 两种移动方式的本质差异与眩晕根源室内VR的移动绕不开一个根本矛盾你在虚拟世界里移动了但你的前庭系统内耳平衡器官告诉你没动。这个矛盾就是VR眩晕的主要来源。平滑移动Smooth Locomotion是左摇杆推着角色连续位移视觉上像滑冰传送移动Teleport是按住摇杆瞄准一个落点松手瞬间跳过去。从生理角度讲传送移动几乎不引起眩晕因为视觉上的位移是瞬时的前庭系统来不及产生冲突信号。平滑移动则因人而异有的人完全无感有的人三十秒就冒冷汗。我实测下来室内场景优先用传送原因是室内空间通常有墙壁和家具平滑移动很容易把玩家推进几何体内部而传送可以通过落点检测直接规避。但传送有一个体验上的硬伤空间连续感断裂。玩家在虚拟样板间里看房每走一步都“闪”一下沉浸感大打折扣。所以我的做法是混合方案默认传送但在小范围微调时允许平滑移动。具体实现上传送用抛物线投射平滑移动用摇杆输入直接驱动Actor位移。2.2 用抛物线投射实现可靠的传送落点传送的核心是落点检测。UE4里最直接的方式是用ProjectileMovement或者手动做抛物线投射。我推荐手动投射因为可控性更强。具体做法是在MotionController上挂一个Spline组件或者用Predict Projectile Path By TraceChannel节点。后者是UE4自带的异步节点输入起始位置、发射速度、重力它会返回一条抛物线路径和命中结果。你把这个路径用Spline Mesh画出来玩家就能看到一条弧线。关键参数是发射速度。速度太小抛物线太平远距离传送够不着速度太大弧线太陡落点不好判断。我一般设800-1200 cm/s重力用默认的-980。这个数值下抛物线在3-5米距离内比较自然。落点检测的TraceChannel要特别注意。默认的Visibility通道会打到所有可见物体包括一些你不想让玩家传送上去的装饰物。我的做法是自定义一个Teleport通道在项目设置里把地板、地毯、楼梯设为Block把墙壁、家具设为Overlap或Ignore。这样抛物线只会在地板上生成有效落点打到墙壁时显示红色禁止标记。还有一个容易忽略的点传送后的朝向。如果玩家传送过去之后面朝墙壁体验会很差。我的处理是传送时将玩家的朝向对齐到抛物线发射方向或者保留传送前的朝向。前者适合走廊场景后者适合房间场景。代码上就是设置Actor的Rotation注意要用Set Actor Rotation而不是Set Control Rotation因为VR里控制旋转是HMD驱动的。2.3 平滑移动的碰撞处理与防穿墙策略如果你决定加平滑移动碰撞是最大的坑。UE4默认的CharacterMovementComponent用胶囊体碰撞在VR里这个胶囊体是看不见的玩家很容易把头伸进墙里。我的做法是用SphereComponent做身体碰撞半径设30-40cm挂在Pawn的根节点上跟随HMD的水平位置移动。具体蓝图逻辑每帧获取Camera的世界位置取XY平面分量把碰撞球的位置设过去。这样玩家低头、抬头不会影响碰撞球只有水平移动才会。碰撞球用Block对所有静态几何体这样玩家就穿不过墙了。但这里有个细节碰撞球不能完全跟随HMD否则玩家快速转头时碰撞球会瞬移可能卡进几何体。我的做法是加一个插值Lerp让碰撞球以一定速度跟随速度设500-800 cm/s。这样既不会穿墙也不会因为转头而抖动。平滑移动的速度也要控制。室内场景我建议150-250 cm/s大约是人正常步行速度的一半。太快容易晕太慢又觉得拖沓。摇杆输入要做死区处理UE4的InputAxis节点自带死区参数设0.2左右比较合适防止手柄漂移导致角色自己走。注意如果你的项目要上架某些对眩晕敏感的平台平滑移动可能需要在设置里提供关闭选项。这不是技术问题是产品决策。3. 抓取交互从射线检测到物理约束的完整链路3.1 抓取检测射线、球体扫描还是重叠事件抓取的第一步是判断手柄碰到了什么。常见方案有三种射线检测Line Trace、球体扫描Sphere Trace、重叠事件Overlap。射线检测最精确但要求玩家瞄准球体扫描容错率高但可能抓到不想抓的东西重叠事件适合手部附近有多个物体时自动选取最近的。我的选择是球体扫描为主射线为辅。具体是在MotionController的前方挂一个SphereComponent半径8-10cm每帧做一次Sphere Trace By Channel检测距离设15-20cm。这个范围大约是一个拳头的大小符合直觉。如果球体扫描没结果再发一条短射线5cm做补充防止手指尖碰到物体但球体没覆盖到。检测通道同样要自定义。我建了一个Grabbable通道只有可抓取的物体设为Block其他一律Ignore。这样手柄不会因为碰到墙壁或地板而触发抓取提示。检测到物体后高亮反馈是必须的。UE4里最简单的做法是切换物体的Custom Depth Stencil然后在后期材质里根据Stencil值描边。更简单的做法是直接改物体的材质参数比如加一个自发光边缘。我一般用Set Render Custom Depth加一个描边后期材质性能开销小效果也够用。3.2 抓取方式附着、物理约束还是混合抓到物体之后物体怎么跟随手柄这是抓取交互最核心的技术决策。方案一直接Attach。把物体Attach到MotionController上关掉物理模拟。优点是稳定、不抖动、性能好。缺点是物体变成“死”的不能跟其他物体碰撞穿墙穿桌子。适合UI面板、工具类物体。方案二物理约束。物体保持物理模拟用PhysicsConstraint把它和手柄连起来。优点是物体仍然是物理体能跟环境碰撞。缺点是容易抖动、弹簧感明显、快速移动时物体可能飞出去。适合需要真实物理反馈的场景。方案三混合方案。抓取瞬间Attach但保留一个物理约束的“软连接”或者根据物体类型切换。这是我实际项目里用得最多的。具体实现上我推荐抓取时Attach但每帧用Set World Location和Set World Rotation做插值跟随而不是硬Attach。这样物体既稳定又有一定的物理感。插值速度设15-20Lerp的Alpha太快会抖太慢会拖沓。对于需要物理碰撞的物体比如你要把杯子放到桌子上我建议抓取时Attach松手时切回物理模拟并给一个初速度。初速度根据手柄的移动速度计算用Get Physics Linear Velocity或者手动记录前几帧的位置差。这样扔出去的物体有自然的抛物线。3.3 抓取姿态与手部模型的匹配物体抓在手里姿态很重要。一个扳手横着抓和竖着抓手感完全不同。UE4里可以用Grip Motion Controller插件如果是VRExpansion插件的话或者自己实现抓取点Grip Point。我的做法是在可抓取物体上加一个SceneComponent作为抓取点命名GripPoint。抓取时把手柄的位置和旋转对齐到这个GripPoint的相对变换。具体计算是GripPoint的世界变换乘以手柄的世界变换的逆得到相对变换然后每帧用这个相对变换驱动物体。这样不同物体可以有不同的抓取姿态。比如手枪的GripPoint在握把上杯子的GripPoint在杯壁一侧。你只需要在物体蓝图里调整GripPoint的位置和旋转就行不用改抓取逻辑。手部模型方面如果用的是Oculus Quest这类一体机手部追踪是另一套API。但如果是PC VR手柄模型直接用MotionController自带的Set Display Model就行。我建议手部模型不要做碰撞只做视觉碰撞交给前面的球体扫描。4. 室内场景的UI交互从3D按钮到射线点击4.1 3D UI与2D UI的选择逻辑室内VR里的UI我分成两类世界空间UIWorld Space Widget和屏幕空间UIScreen Space Widget。前者是挂在场景里的3D面板比如墙上的开关、桌上的说明书后者是跟随HMD的HUD比如菜单、提示。室内场景我强烈建议全部用世界空间UI。原因很简单VR里屏幕空间UI会一直挡在眼前破坏沉浸感。世界空间UI放在场景里玩家想看就转头看不想看就忽略符合直觉。UE4里创建世界空间Widget很简单新建一个Widget Blueprint在细节面板里把Space设为World然后拖到场景里。关键是尺寸。默认的Widget尺寸在VR里可能太大或太小。我的经验是1米距离上Widget的宽度大约30-50cm比较合适。你可以用一个WidgetComponent挂在Actor上调整Draw Size参数。4.2 射线交互与手柄震动反馈世界空间UI的交互最自然的方式是手柄射线。从MotionController发一条射线打到Widget上用Widget Interaction组件处理点击。具体做法在Pawn里加一个WidgetInteraction组件把它Attach到MotionController上。设置Interaction Distance为100-200cmInteraction Source设为Custom然后每帧把射线的起点和方向传给WidgetInteraction。WidgetInteraction会自动处理悬停和点击事件。点击的触发方式有两种扳机键和触摸板。我一般用扳机键因为反馈明确。在Input里绑定MotionController Trigger按下时调用WidgetInteraction的Press Pointer Key松开时调用Release Pointer Key。震动反馈是提升交互质感的关键。UE4里用Play Haptic Effect节点在悬停和点击时分别播放不同的震动效果。悬停用短促的低频震动频率0.5幅度0.3时长0.05秒点击用稍强的震动频率0.8幅度0.6时长0.1秒。注意震动强度不要太大否则长时间使用会手麻。4.3 按钮的视觉反馈与状态管理一个3D按钮玩家怎么知道它被按下了视觉反馈至少要有三种状态默认、悬停、按下。在Widget蓝图里用Button控件的Hovered和Pressed事件切换颜色或缩放。我一般用颜色变化默认灰色悬停浅蓝按下深蓝。缩放也可以悬停时放大1.05倍按下时缩小0.95倍。但缩放要注意锚点否则按钮会跑偏。状态管理上我建议用一个枚举变量记录当前状态而不是靠多个布尔值。比如EButtonState枚举Default、Hovered、Pressed、Disabled。每次状态切换时更新视觉表现逻辑清晰不容易出bug。还有一个细节按钮的碰撞。WidgetComponent默认的碰撞是Box但有时候玩家从侧面点不到。我的做法是把WidgetComponent的碰撞设为Box尺寸比Widget本身大一圈比如大10%这样容错率更高。5. 那些文档里不会写的坑碰撞、性能与调试5.1 碰撞通道的优先级冲突UE4的碰撞系统是VR项目里最容易出问题的地方。我踩过最深的坑是传送落点检测和抓取检测互相干扰。传送的抛物线打到了可抓取物体结果落点显示在物体上玩家传送过去之后站在了杯子上面。解决办法是给传送和抓取用不同的TraceChannel。传送用Teleport通道只检测地板和楼梯抓取用Grabbable通道只检测可抓取物体。两个通道互不干扰。在项目设置的Collision里把Teleport通道对Grabbable物体设为Ignore反之亦然。另一个坑是手柄碰撞和场景碰撞。MotionController默认没有碰撞但如果你加了球体扫描这个球体可能会跟墙壁碰撞导致手柄被“弹开”。我的做法是球体扫描只做检测不做物理碰撞。在SphereComponent的碰撞设置里把Collision Enabled设为Query Only这样它只参与射线检测不参与物理模拟。5.2 VR项目的性能红线与优化手段VR对帧率的要求是90fps起步最好120fps。UE4默认的渲染管线在室内场景里跑90fps不难但如果你加了大量动态光源、后期效果、高面数模型帧率会掉得很快。我的优化清单关闭动态阴影用静态光照烘焙。室内场景的光照变化不大烘焙完全够用。限制半透明物体数量。玻璃、水、粒子效果都是半透明每个半透明物体都会增加Overdraw。室内场景里玻璃窗用不透明材质加反射球代替。用LOD。远处的家具用低面数模型近处才用高模。关闭不必要的后期效果。Bloom、DOF、Motion Blur在VR里要么效果不好要么性能开销大。我一般只保留抗锯齿和色调映射。用Instanced Static Mesh。场景里重复的物体比如椅子、杯子用ISM合并Draw Call。还有一个隐藏的性能杀手WidgetComponent。每个世界空间Widget都是一个独立的Draw Call而且如果Widget里有动画每帧都会重绘。我的做法是把不常用的Widget设为Hidden需要时再显示。另外Widget的Tick能关就关用事件驱动代替每帧更新。5.3 调试VR交互的实用技巧VR调试比普通游戏调试麻烦因为你在编辑器里看不到头显里的画面。我的几个常用技巧第一用VR Preview模式。在编辑器里点Play旁边的小三角选VR Preview画面会直接输出到头显。这是最基本的调试方式。第二加屏幕日志。在关键节点用Print String输出信息比如抓取检测的结果、传送落点的坐标。VR Preview模式下屏幕日志会显示在编辑器窗口里你能一边看头显一边看日志。第三用Draw Debug系列节点。Draw Debug Line画射线Draw Debug Sphere画检测球Draw Debug Box画碰撞盒。这些在VR Preview里都能看到非常直观。注意发布版本里要关掉否则有性能开销。第四录屏回放。UE4的Sequence Recorder可以录制VR里的操作回放时能逐帧检查。这个功能在排查偶发bug时特别有用。提示VR Preview模式下编辑器的帧率会影响头显的帧率。如果你的编辑器卡头显也会卡。调试时把编辑器窗口最小化能提升不少。6. 从Demo到可用一些让交互更“跟手”的细节调校6.1 手柄位置预测与延迟补偿VR交互的“跟手”程度很大程度上取决于手柄位置的延迟。从手柄移动到头显里看到手部模型移动中间有大约20-40ms的延迟。这个延迟来自追踪、渲染、显示多个环节。UE4里有一个Motion Controller Late Update选项在MotionController组件的细节面板里。开启后手柄的位置更新会放在渲染线程的最后能减少几毫秒的延迟。我实测下来开启后手感有明显提升。另一个技巧是位置预测。根据手柄前一帧的速度预测下一帧的位置提前渲染。UE4没有内置这个功能但你可以手动实现记录手柄前两帧的位置算速度然后Set Relative Location时加上速度乘以预测时间。预测时间设10-15ms比较合适太长会过冲。6.2 抓取物体的质量感与阻尼设置抓取一个铁球和抓取一个纸杯手感应该不一样。UE4里通过物理材质Physical Material和质量Mass来区分。铁球的质量设5-10kg纸杯设0.1-0.5kg。抓取时如果物体质量大手柄的跟随速度要慢一点模拟“重”的感觉。具体做法是在插值跟随的Lerp节点里根据物体质量动态调整Alpha。质量越大Alpha越小跟随越慢。阻尼Damping也很重要。物理约束的Linear Damping和Angular Damping设0.5-2.0之间能减少抖动。但阻尼太大会让物体变得“粘滞”失去物理感。我一般从1.0开始调根据物体类型微调。6.3 交互提示的克制使用最后说一个设计层面的经验交互提示要克制。很多VR项目喜欢在可抓取物体上一直显示高亮或图标结果整个场景都是发光的东西玩家反而不知道看哪里。我的做法是只在手柄靠近时才显示提示。具体是球体扫描检测到物体后才开启物体的Custom Depth描边。手柄离开描边消失。这样场景平时是干净的玩家探索时才有反馈。UI提示也一样。不要一进场景就弹一堆文字说明让玩家自己摸索。实在需要引导用环境叙事代替文字——比如把可交互的物体放在显眼位置用灯光引导视线比弹窗有效得多。室内VR交互这个方向技术门槛其实不高难的是细节的打磨。同样的抓取功能插值速度差5手感就差很多同样的传送抛物线速度差200体验就完全不同。这些参数没有标准答案只能根据你的场景和用户反馈慢慢调。我上面给的数值都是起点不是终点。多戴头显多让不同的人试比看任何教程都管用。

相关新闻

Kotlin继承与接口代理:by关键字及super冲突解决实战

Kotlin继承与接口代理:by关键字及super冲突解决实战

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

2026/10/14 3:27:35 阅读更多 →
嵌入式老兵转机器人:简历为何总被刷?

嵌入式老兵转机器人:简历为何总被刷?

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

2026/10/14 3:27:35 阅读更多 →
纯CSS图片手风琴效果:零JS高性能悬停交互方案

纯CSS图片手风琴效果:零JS高性能悬停交互方案

1. 项目概述:这不是炫技,是解决真实交互痛点的轻量方案“CSS图片手风琴效果(鼠标悬停)”——这八个字背后,藏着前端日常中一个高频却常被低估的需求:如何在不加载额外JS库、不触发页面重排、不牺牲首屏性能…

2026/10/14 3:27:35 阅读更多 →

最新新闻

从零构建每日晨报:信息过滤系统的设计与实现

从零构建每日晨报:信息过滤系统的设计与实现

1. 一份“每日晨报”到底在解决什么问题每天早上七点半,我习惯性打开自己维护的一个小工具,屏幕上会弹出一份排版干净的简报:昨天圈子里发生了什么、有哪些值得点进去看的链接、今天有什么值得留意的节点。这份东西我管它叫“每日晨报”&…

2026/10/14 3:59:41 阅读更多 →
TensorFlow工程实践:从数据流水线到模型部署的关键技术

TensorFlow工程实践:从数据流水线到模型部署的关键技术

TensorFlow这个标题一摆出来,懂行的人就知道,这不是在聊一个简单的开源库,而是在聊一套“深度学习工业化”的完整体系。我最早接触它的时候,还是在1.x时代,那时候写个模型要先搞placeholder、Session、global_variable…

2026/10/14 3:59:41 阅读更多 →
PyTorch本质:动态图张量系统与Python原生深度学习范式

PyTorch本质:动态图张量系统与Python原生深度学习范式

1. 项目概述:PyTorch不是“框架”,而是一套可编程的张量计算系统你点开这个标题,大概率是刚接触深度学习,被“PyTorch”三个字反复刷屏——课程推荐它、招聘要求它、论文代码用它、连隔壁做CV的同事都在说“我用PyTorch跑通了”。…

2026/10/14 3:59:41 阅读更多 →
小程序生日提醒应用开发全流程:云开发、定时触发与订阅消息实战

小程序生日提醒应用开发全流程:云开发、定时触发与订阅消息实战

简介:小程序作为轻量应用载体,常用于实现生日提醒、待办打卡等工具类场景。其核心价值不只是页面呈现,更在于数据模型设计与消息触达链路是否可靠。借助微信云开发环境,开发者可以免运维地使用云函数、文档型数据库与定时触发器&a…

2026/10/14 3:59:41 阅读更多 →
PyTorch深度学习实战:从动态计算图到模型部署的完整指南

PyTorch深度学习实战:从动态计算图到模型部署的完整指南

开篇先亮明我的态度:PyTorch这个框架,早就不只是“学术界玩具”了。如果你去翻各大厂的生产环境、顶会论文的复现代码、甚至Kaggle前排方案,十有八九跑的都是它。我最早从另一个框架转过来的时候,心里也犯嘀咕——动态图是不是太慢…

2026/10/14 3:59:41 阅读更多 →
SAS信号处理中停-走-停假设的局限与修正方法

SAS信号处理中停-走-停假设的局限与修正方法

1. SAS信号处理中的"停-走-停"假设概述合成孔径声呐(SAS)成像技术中,"停-走-停"假设是传统信号处理的基础模型。这个假设认为声呐平台在发射脉冲和接收回波时处于静止状态,实际运动只在脉冲间隔期间发生。听起来很理想化对吧&#x…

2026/10/14 3:58:41 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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 阅读更多 →