Unity相机观察器实战:旋转平移缩放与焦点跟随的稳定实现
做场景调试的人都有过被视角搞得崩溃的时刻。尤其是那种需要反复观察的多物体联动场景你明明想从左侧看一组传动的干涉情况镜头却卡在另一个模型内部你想整体拉远看看全局布局偏偏缩放被一两堵墙挡住。这类问题我以前也踩过不少后来干脆在项目里做了一个独立的Unity相机观察器把视角旋转、平移、缩放这三个基础操作用一套明确的状态逻辑管起来。实际用下来它不光解决了我自己调试时的视角困扰后来同事拿去做演示录制、问题复现也觉得比过去在Inspector里手动拖相机要顺手得多。这套东西的原理不难核心就是三个点围绕某个焦点做轨道旋转、在观察平面上做平移、沿视轴方向做缩放。下面我把完整设计思路、实现代码和踩坑记录都放出来尽量做到你复制到场景里就能跑跑完还能根据自己的项目改出花样。1. 先想清楚相机观察器到底解决什么问题1.1 调试视角和玩家视角是两种完全不同的需求Unity里自带的相机本身就是给玩家看的。玩家视角要求跟着角色走有碰撞、有边界、有玩法限制。但调试者的观察器不是这样它的核心诉求是“想怎么看就怎么看”。你要能瞬间拉远到几十米外看整体也要能一头扎进模型缝隙里看微小间隙有时候还要在场景暂停时慢慢绕着某个零件转一圈确认各个角度都没有穿帮。这个需求差异决定了观察器的设计不能照抄游戏相机。游戏相机常常要考虑被遮挡时自动拉近或者角色转身时镜头跟随这些逻辑放到调试场景里都是负担。一个调试点位相机一旦自动帮你挪走了问题现场就被破坏了。所以观察器最基本的素质是“可预测”鼠标怎么动画面就怎么变不存在隐形干预。1.2 旋转、平移、缩放是三个独立的能力很多人以为做相机观察器就是把相机脚本里加几个鼠标控制顺手一写就完事。实际上三个操作如果不分开设计很容易互相干扰。旋转解决的是“从哪个角度看”的问题。它应该围绕某个固定点转而不是让相机在空间中随便瞎转。这样你盯着一个零件的时候不管转到哪个角度目标点都钉在屏幕中心附近。平移解决的是“看哪个位置”的问题。它需要保持当前朝向不突变把观察焦点推向新的位置。旋转和平移之间的关键区别是旋转改变方向平移改变焦点两者不该混在一起改。缩放解决的是“看多近多远”的问题。放在观察器里它本质上是调整相机到焦点的距离而不是改相机的FOV视场角。用FOV缩放的虽然也能做出放大缩小效果但它会改变透视关系调试时看到的形变和最终游戏效果不一致反而不靠谱。把这三个能力分开以后你会得到一个非常漂亮的不变量无论怎么旋转、平移、缩放相机视线始终指向同一个焦点或焦点附近。这个不变量会让整套控制逻辑特别好推理出问题时也好排查。1.3 适合谁来用适合什么场景这套观察器最适合三类人经常在Unity编辑器里摆场景、调Prefab的人需要一个比Scene视图更接近运行态预览的视角。做模拟演示、录制操作视频的人需要一套稳定可控的镜头操作手法。做项目验收或问题复现的测试人员需要能快速在运行时定位到某个具体模型位置。它解决的核心痛点就是“相机失控”和“操作反直觉”。如果你经常出现“镜头转着转着不知道自己在哪”的感觉那多半是相机控制逻辑没有围绕一个稳定焦点来组织。这篇文章里实现的东西就是专门治这个病的。2. 方案选型为什么要走“焦点轨道”而不是自由飞行2.1 自由飞行相机的问题在哪自由飞行相机也就是WASD加鼠标控制位置和朝向的方案在游戏里很常见。它适合第一人称探索但在调试观察场景里非常别扭。原因很简单自由飞行时你的身体和你的观察目标之间没有一个稳定的关系。你想绕着一个部件转一圈就得一边按方向键一边转鼠标配合不好就把视野甩飞了。更麻烦的是当你要准确描述“从这个位置看过去了什么”的时候自由飞行相机的位置坐标和朝向需要多个数值沟通成本高。而焦点轨道相机只需要三个参数俯仰角、偏航角、距离。这三个参数直接描述了“相机相对目标在哪里”比如“俯角30度、正前方、距离5米”这就是一个很自然的空间描述方式。实际上很多三维软件里的观察器用的都是这个模型因为它符合人观察物体时的直觉我关心的是物体不是我自己站在哪。2.2 用球坐标参数而不是直接累加欧拉角实现旋转时我一开始也走过弯路直接在Transform上累加欧拉角。后来发现这样写容易出两件事一是万向锁。当旋转到俯仰角接近正上方或正下方时偏航和翻滚轴会耦合画面会出现突然的翻转。二是数值漂移。长期累加下去欧拉角的数值会越来越大精度逐渐丢失。所以最终方案是把旋转参数拆成两个独立的标量yaw偏航角和pitch俯仰角每一帧都从这两个角度重新构造成Quaternion.Euler(pitch, yaw, 0)。这样每次计算都是基于原始参数不依赖上一帧的旋转结果天然避免了累计误差。俯仰角再配合Mathf.Clamp限制在正负85度之间就不会出现翻转瞬间带来的迷惑操作。2.3 为什么焦点独立于相机位置观察器最重要的设计决定是把“焦点”当作一个独立变量而不是让相机每次都去盯某个挂载的物体。独立焦点变量的好处在平移时特别明显。如果你直接围绕某个空物体的Transform来转当你要平移观察位置时必须移动这个空物体可如果你只是想稍微挪一下视线不能改变这个空物体的定位平移就被卡住了。把焦点作为Vector3存下来每次平移只是老老实实地改这个向量而空物体或模型目标可以作为焦点的一个“参考来源”需要时通过FocusOn方法把目标位置灌进来。这样既保留了焦点可自由移动的灵活性又能在需要时一键锁定到某个模型中心两种用法都能支持。2.4 平移是拖场景不是推相机很多人写平移时会直接给相机加一个鼠标方向的偏移结果拖起来特别“飘”。正确做法是记住一件事你在观察器里拖动中键是在拖动场景不是推动相机。所以实现时是把焦点的位置向鼠标移动的反方向移动。比如你按住中键向右拖鼠标输入Mouse X为正那么焦点就应该向左移动。这样相机为了保证视线还是指向焦点就会向右摆动画面上看起来就是整个场景被你的手拽着向右移动。这个手感符合绝大多数三维操作软件的习惯团队成员上手成本低。3. 实操最简可复现的旋转平移缩放脚本3.1 脚本整体和关键字段下面这个脚本是我平时项目里用的精简版去掉了一些业务相关逻辑保留最核心的旋转、平移、缩放以及可选的平滑处理。把它挂到场景中的主相机上运行后就能通过鼠标右键旋转、鼠标中键平移、滚轮缩放。using UnityEngine; [RequireComponent(typeof(Camera))] public class CameraObserver : MonoBehaviour { [Header(焦点设置)] public Transform target; public Vector3 focusOffset Vector3.zero; public Vector3 focus Vector3.zero; [Header(旋转参数)] public float yaw 45f; public float pitch 30f; public float rotateSpeed 0.1f; public Vector2 pitchClamp new Vector2(-85f, 85f); [Header(平移参数)] public float panSpeed 1f; [Header(缩放参数)] public float zoomSensitivity 0.5f; public float minDistance 0.2f; public float maxDistance 200f; [Header(平滑参数)] public bool useSmooth true; public float positionSmoothTime 0.12f; public float rotationSmoothTime 0.15f; private float distance 10f; private Vector3 posVelocity; void Start() { if (target ! null) { focus target.position focusOffset; } Vector3 dirToTarget focus - transform.position; distance Mathf.Max(dirToTarget.magnitude, 0.1f); Vector3 angles transform.eulerAngles; yaw angles.y; pitch angles.x; if (pitch 180f) pitch - 360f; } void LateUpdate() { HandleInput(); ApplyCamera(); } void HandleInput() { float mx Input.GetAxis(Mouse X); float my Input.GetAxis(Mouse Y); float scroll Input.GetAxis(Mouse ScrollWheel); // 鼠标右键旋转 if (Input.GetMouseButton(1)) { yaw mx * rotateSpeed * 100f * Time.deltaTime; pitch - my * rotateSpeed * 100f * Time.deltaTime; pitch Mathf.Clamp(pitch, pitchClamp.x, pitchClamp.y); } // 鼠标中键平移焦点 if (Input.GetMouseButton(2)) { Quaternion rot Quaternion.Euler(pitch, yaw, 0f); Vector3 right rot * Vector3.right; Vector3 forward rot * Vector3.forward; Vector3 up Vector3.Cross(right, forward).normalized; focus - right * mx * panSpeed * distance * Time.deltaTime; focus up * my * panSpeed * distance * Time.deltaTime; } // 滚轮缩放距离 if (Mathf.Abs(scroll) 0.0001f) { distance - scroll * zoomSensitivity * distance; distance Mathf.Clamp(distance, minDistance, maxDistance); } } void ApplyCamera() { Quaternion rot Quaternion.Euler(pitch, yaw, 0f); Vector3 desiredPos focus rot * Vector3.forward * distance; if (useSmooth) { transform.position Vector3.SmoothDamp( transform.position, desiredPos, ref posVelocity, positionSmoothTime); float t 1f - Mathf.Exp(-rotationSmoothTime * Time.deltaTime); transform.rotation Quaternion.Slerp(transform.rotation, rot, t); } else { transform.position desiredPos; transform.rotation rot; } } public void FocusOn(Vector3 point) { focus point; } }脚本里几个字段的取值我是按照常规观察场景调的rotateSpeed默认0.1乘以100再乘Time.deltaTime后鼠标移动一圈大约能让视角转90到120度手感适中。如果你觉得转太快直接降到0.05。panSpeed默认1但实际移动量会乘上distance也就是离目标越远拖动同样距离时焦点移动得越快。这是为了保持“屏幕上拖动的距离感一致”否则在后拉远之后中键拖动的效果会感觉特别慢。zoomSensitivity默认0.5滚轮滚一格大约会让距离变化当前距离的50%。这个速度在模型观察和场景巡视里都比较合适。3.2 旋转为什么用两个标量而不是直接改Transform旋转相关代码就三行但值得展开讲一下。yaw是绕世界Y轴的偏航角pitch是绕X轴的俯仰角。每次需要旋转时不是让Unity去累加transform.rotation而是先修改yaw和pitch这两个标量最后统一用Quaternion.Euler(pitch, yaw, 0f)重新构造四元数。这样做有几个直接好处。第一你永远知道当前相机的朝向参数是多少打印日志时可以直接把yaw和pitch打出来方便问题复现。第二不会出现“旋转累加后欧拉角数值巨大”的情况。第三pitchClamp的限制可以直接作用在标量上比在四元数上做限制简单得多。鼠标Y轴输入为什么用pitch - my而不是pitch my因为Unity的Mouse Y向上为正值而我们希望鼠标向上推时视角向下看也就是俯仰角减小。如果你习惯相反的方向把这个减号换成加号即可。3.3 平移基于当前朝向构造屏幕平面平移部分的经典坑是直接把相机的right和up拿来做偏移但如果你开了旋转平滑相机实际朝向还没转到最终位置就会产生“拖的时候画面方向在变”的错位感。所以我在这里用Quaternion.Euler(pitch, yaw, 0f)先算出目标旋转再从这个目标旋转里取right和up方向。这里还有一个容易被忽略的点right和up要保证垂直。简单用rot * Vector3.up得到的可能是微小的非垂直方向因为旋转后X轴和Y轴在Unity的左手坐标系下确实互相垂直不过考虑到浮点误差稳妥做法还是用Vector3.Cross(right, forward)重新算一次up。平移时乘上distance是为了让缩放后平移速度保持屏幕比例一致。你可以这样理解距离50米时视线里一个物体占屏比例很小如果移动速度还和距离1米时一样那拖动的效果几乎看不见。乘上距离以后不管远近中键拖过相同像素目标在屏幕上走过的距离是接近一致的。这就是角度度量和线段度量的区别。3.4 缩放非线性变化比线性变化更顺手滚轮缩放这里我特意用了distance - scroll * zoomSensitivity * distance也就是“当前距离越大单次滚轮改变的量越大”。为什么不写成distance - scroll * zoomSpeed的线性模式因为人眼对距离变化的感觉是对数级的。你在5米距离时一次滚轮前进0.5米能感觉到明显放大如果你在100米时一次滚轮只前进0.5米画面几乎无变化。反过来如果线性速度设成每次10米靠近时一滚就穿模。所以让速度和当前距离成正比是最自然的手感这也是很多三维软件默认采用的缩放曲线。Mathf.Clamp把距离限制在minDistance和maxDistance之间是必需品。如果不限制你继续滚动滚轮相机会穿过焦点跑到另一侧然后画面会突然变成背后视角造成巨大困惑。我踩过这个坑后就把最小距离设成了0.2米最大距离按场景规模设成200米。3.5 平滑什么时候需要什么时候必须关掉useSmooth默认打开此时位置用Vector3.SmoothDamp做阻尼逼近旋转用Quaternion.Slerp配合帧率无关的系数趋近。这样录屏或做演示时画面特别稳不会有那种生硬的跳变感。但是要注意平滑本质上引入了滞后。如果你是在做精确问题复现比如要检查两个模型是否碰撞或者要记录某个精确视角那就把useSmooth关掉。刚性模式下相机位置和旋转完全由参数计算得出鼠标停住画面就停住不存在等待收敛的问题。在我实际项目中这两种模式我会用快捷键切换比如按Q快速开关平滑。原因就是调试和演示对响应的要求不一样。3.6 挂载方式和初始角度校正脚本挂到相机上以后Start里会根据当前相机位置和focus反算初始distance再读取相机当前的eulerAngles作为初始yaw和pitch。所以你在编辑器里已经摆好一个视角运行起来不会跳一下。不过有一个细节要注意Unity的transform.eulerAngles.x返回范围是0到360俯仰角通常我们希望它落在-90到90之间。所以我在读取后加了if (pitch 180f) pitch - 360f;让初始俯仰值归一到-180到180的范围否则pitchClamp可能在一开始就把角度裁掉。4. 常见问题与排查实录4.1 相机在运行后乱转或者输入完全没反应这个八成不是脚本逻辑问题而是输入系统没配对。现在Unity项目经常开了新输入系统Input System但脚本里用的还是旧版Input.GetAxis。这种情况下旧的输入接口可能被禁用鼠标数据读不到。解决办法是到Player Settings里看Active Input Handling选“Both”或者“Input Manager (Old)”让旧的Input.GetAxis接口正常工作。如果你项目里完全用新输入系统那也简单把HandleInput里的输入读取换成新输入系统的Mouse.current事件即可核心的旋转平移缩放流程不用变。另外还有一个小坑如果相机挂载了AudioListener在场景里又摆了很多带声音的物体偶尔会因为音频系统的状态导致性能问题间接让相机卡顿。这种情况和观察器本身无关但排查时容易被带偏。4.2 旋转到正上方或正下方时画面突然翻转这是欧拉角模式最常见的现象。pitch接近90度时偏航角已经无法唯一决定朝向Unity就会为了保持某种约束强行翻转。我的解法是在HandleInput里对pitch做Mathf.Clamp(pitch, -85, 85)。设置成85而不是89是因为角度太贴极点时即使不翻转操作手感也极其敏感鼠标稍微动一下画面就转很大。85度对绝大多数观察需求都够用了还能留下一点容错空间。4.3 滚轮缩放时经常穿过目标物体出现这个问题的原因有两种。一是minDistance设得比相机近裁剪平面还小导致相机已经退到物体内部自然就穿模了。二是缩放速度曲线太陡滚一格距离变化太大。处理时我会把minDistance和相机nearClipPlane联动考虑。如果你是精细观察微小的机械结构可以把nearClipPlane设到0.02minDistance设到0.05如果你只是场景巡视默认0.5到1.0就够了。不要只顾观察器脚本里的距离限制忽略了相机自己的近裁剪面。4.4 中键拖动时画面方向不稳定这个问题在开了平滑的时候尤其明显。因为你从transform.right取平移方向而transform.rotation每帧都在Slerp追赶目标方向就一直在变焦点被拖到一半又被新的旋转影响。我现在都是按照上面代码的做法从目标旋转Quaternion.Euler(pitch, yaw, 0f)里取方向而不是从当前的transform里取。这样平移方向稳定不受平滑过程影响。4.5 常见问题速查表现象可能原因解决方式鼠标操作完全无效输入系统冲突Player Settings里改成Both或改用新输入接口视角翻转pitch越过90度限制俯仰角在±85度滚轮缩放穿模minDistance太小或nearClipPlane太大联动设置两个参数中键拖动方向漂移使用了transform.right而非目标旋转用Quaternion.Euler(pitch, yaw, 0)计算方向画面抖得厉害相机移动放在了Update而非LateUpdate放到LateUpdate里执行平滑模式下响应慢positionSmoothTime太大调小到0.05到0.1之间焦点初始位置不对相机初始pitch没有做范围归正补上if (pitch 180f) pitch - 360f4.6 一个容易被忽略的编辑器问题如果你在编辑器的Game视图里测试观察器一定要确保场景中只有一个活动相机。有时候你为了调试方便在场景里又加了一个观察相机又保留了原来的主相机两个相机都带AudioListenerUnity会直接在Console里刷警告甚至导致渲染顺序混乱。另外在编辑器里运行时移动相机Scene视图里的Gizmo可能不会立刻刷新看起来好像相机没动。这是视图刷新时机的问题不是代码问题。直接把Game视图放大看实时画面就行。5. 一些调试经验与可扩展的方向5.1 焦点跟随目标物体在调试中我经常需要观察一个正在移动的物体。这时候反复手动平移肯定不现实。我给观察器加了一个很简单的扩展在LateUpdate里判断target是否为空如果不为空就每帧把focus拖向target.position focusOffset。但这又会和手动平移冲突。所以我的做法是加一个锁定开关锁定状态下跟随目标解锁后只在调用FocusOn时更新焦点。实际操作中我会先用快捷键锁定目标转几圈看问题再解锁继续平移寻找其他位置。这个模式下面向运行态调试特别有用。5.2 从物体包围盒自动聚焦如果你经常要观察一批模型手动指定focus坐标很麻烦。一个比较省事的做法是拿到目标物体的Renderer或Collider用bounds.center算出中心然后调用FocusOn。public void FocusOnRenderer(Renderer renderer) { Vector3 center renderer.bounds.center; FocusOn(center); }这个小函数看着简单实际场景里很好用。尤其在处理多物体联动模拟时点击某个设备观察器瞬间对准设备中心比手动拖拽快得多。5.3 接管Unity编辑器Scene视图有人会问为什么不直接做一个Editor扩展把这段逻辑塞进Scene视图的导航里。这条路可行但工作量比想象中大不少。Scene视图有自己的一套输入和手势系统你需要通过SceneView的onGUI事件来接管鼠标消息还得考虑和自带导航的冲突。我个人建议分两步先在运行时把观察器用好满足绝大多数预览、录制需求如果团队对编辑器内部巡检需求很高再考虑写Editor窗口版本复用同一套旋转平移缩放参数。这样逻辑一致维护成本也低。5.4 我自己的使用习惯最后分享几个我实际总结下来的操作习惯第一录制演示视频前我一定把useSmooth打开而且把rotationSmoothTime调到0.2左右。这样镜头转动会有一种克制的阻尼感观众看视频时不会因为快速甩镜头而发晕。第二精细调试碰撞间隙时我会把useSmooth关掉同时把minDistance降到0.1以下。这时候相机是完全跟着鼠标走的指哪打哪耐心找一个小到几毫米的缝隙都不费劲。第三我强烈建议在观察器脚本里做一个“保存当前视角”的小功能。哪怕只是把yaw、pitch、focus、distance四个值导出成字符串也能在多次调试之间快速恢复同一个视角。很多时候排查问题需要先记住一个事发视角然后切换其他视角看原因最后再切回来验证这个功能能省下大量重复调整时间。这套相机观察器本身不复杂但把它用顺了以后你会发现整个团队的调试效率都上了一个台阶。它解决的不只是“镜头能不能转”的问题更是“镜头能不能按开发者意志精准落位”的问题。你把它跑起来再用上几天应该就会理解我说的这些坑和习惯了。

相关新闻

Solr面试核心考点:倒排索引、分词器与SolrCloud分布式原理

Solr面试核心考点:倒排索引、分词器与SolrCloud分布式原理

/* 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 5:34:37 阅读更多 →
openLayers坐标系详解:EPSG:3857与EPSG:4326转换与排坑

openLayers坐标系详解:EPSG:3857与EPSG:4326转换与排坑

/* 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 7:45:12 阅读更多 →
ARMv7函数调用中栈指针SP变化详解与调试实战

ARMv7函数调用中栈指针SP变化详解与调试实战

/* 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 7:45:30 阅读更多 →

最新新闻

函数调用集成实战:机器学习如何让AI原生应用从聊天到办事

函数调用集成实战:机器学习如何让AI原生应用从聊天到办事

上个月我在重构一个AI原生应用的信息聚合助手时,遇到一个特别典型的困境:模型已经很聪明了,能理解用户的复杂表达,但它只会输出文字。用户问"明天北京适合穿什么出门",它确实可以回答"明天北京有小雨&a…

2026/10/17 7:48:14 阅读更多 →
Python命令行待办清单实战:用标准库串起基础语法与本地持久化

Python命令行待办清单实战:用标准库串起基础语法与本地持久化

简介:这是一份面向 Python 初学者的命令行待办事项练习资源,帮助读者在本地环境中通过实现增删任务、保存与加载数据等核心功能,掌握 CLI 程序的基本开发思路。资源围绕 add_one_task、print_list、delete_task、save_todos、load_todos 五个…

2026/10/17 7:48:14 阅读更多 →
Python命令行待办工具入门:从零实现本地任务管理CLI

Python命令行待办工具入门:从零实现本地任务管理CLI

简介:这是一份面向 Python 初学者的命令行待办事项练习资源,帮助读者在本地环境中通过实现增删任务、保存与加载数据等核心功能,掌握函数封装、文件读写与 CLI 交互的基本思路。压缩包共 7 个文件,约 295KB,包含 2 个 …

2026/10/17 7:48:14 阅读更多 →
具身智能端侧推理引擎:从100ms到26ms的关键优化技术拆解

具身智能端侧推理引擎:从100ms到26ms的关键优化技术拆解

这套引擎到底解决了什么问题,又凭什么能把延迟压到 26ms,我结合自己跑过的一些端侧项目经验,做一个比较完整的拆解。先说结论:在具身智能这个赛道里,端侧推理引擎不是“把模型塞进机器人”那么简单。真正的难点在于&am…

2026/10/17 7:48:14 阅读更多 →
堆排序为何比快排慢?缓存局部性才是关键

堆排序为何比快排慢?缓存局部性才是关键

有一次我在某项目中需要给一个几千万规模的数据集排序,为了实现方便直接手写了堆排序。跑完一看耗时,比同复杂度、同样是 O(n log n) 的快速排序慢了将近一倍。一开始我以为是自己实现水平问题,直到用性能分析工具查看了缓存未命中数据&#…

2026/10/17 7:48:14 阅读更多 →
DbUtils下划线转驼峰:BeanHandler列名映射全解析

DbUtils下划线转驼峰:BeanHandler列名映射全解析

大概每个写过 JDBC 报表查询的 Java 开发者,都经历过类似的场景:数据库表里明明写着user_name、create_time,Java 实体类里是userName、createTime,用 Apache Commons DbUtils 的BeanHandler一查,返回的对象里全是 nul…

2026/10/17 7:47:13 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →