自由学习记录(228)
xxxxxxxxxxxxxxxxxxx源码里确认了一个关键顺序**先稳定地形、水域范围和 PCG 规则再完成地表与雪的整理最后录水面。**PCG 会改写 Terrain 材质权重和清雪遮罩雪的运行材质还会读取这些地表层。水面画面里能看到的河床因此也会受这条链影响。这里要区分“水域范围”和“水的实时模拟”PCG 用的是水面范围、水位和 Terrain 高度不需要等流体模拟调完。雪也没有读取水的速度或泡沫状态所以它们没有必须同步调参的依赖。先处理雪所用的地表材质是为了稳定水下河床的最终外观减少水面重录。技能预览相对独立可以靠后集中录贴表烟雾则要等环境几何与距离场准备好。这样顺序就能依据实际输入关系确定。Valais sheep / Valais Blacknose瓦莱黑鼻羊Render Dependency Graph in Unreal Engine | Unreal Engine 5.8 Documentation | Epic Developer Community“一个默认脑内模型是A(); B(); C();顺序执行的 C 小白”来读这页只挑真正会把这个模型掀掉的地方不讲 RDG 术语表。重点会区分你写代码的顺序、Pass 真正执行的顺序、资源真正存在的时间。OSM OpenStreetMap。就是开放的全球地图数据库你前面看到那些 “OSM → UE → 道路/建筑/地形” 的项目通常就是读它的道路、建筑轮廓、标签等数据。wiki.openstreetmap.org/wiki/OsmMFC Microsoft Foundation Classes。它是微软给 C 做 Windows 桌面程序的一套老牌框架本质上是对 Win32 / COM 做面向对象封装。learn.microsoft.com/en-us/cpp/mfc/mfc-desktop-applications迁移中修了两类实际出现的问题三个场景的 NGUI 相机改为 URP 的 BaseOverlay 相机叠加旧 Toon Shader 与头像、小地图使用的遮罩 Shader 改为 URP 实现Unity 2022.3 的 TerrainData.SetAlphamaps() 就允许代码在运行时直接改 TerrainLayer 的混合权重。官方示例甚至就是运行时计算整张 alphamap然后写回 Terrain。docs.unity3d.com/cn/2022.3/ScriptReference/TerrainData.SetAlphamaps.htmlMeshDistortionTileMap是 UE材质图里的静态开关参数不是引擎自动给 Terrain 做的功能。它让材质编译时选择地形顶点偏移所用的数据是否来自 Tile Map。沿着图里的连接看启用的分支会把 Tile Map 的采样值经过强度、幂次和 Clamp 处理再与顶点法线方向组合送入材质的偏移计算。直观地说它把 Tile Map 的数值当作起伏数据用来让地表顶点产生偏移。这不是单纯的 UV 扰动也不能仅凭这个开关说它打散了纹理平铺。混合比例根据地表朝向计算大致是把法线 Z 分量做三次幂再经过SmoothStep(0.07, 0.2, ...)。平坦朝上的地方主要显示 Snow 基础材质陡坡逐渐混入第二层颜色。Epic 官方给的合法例子里整个 Landscape 可以只有Plain text127 × 127 vertices 253 × 253 505 × 505 1009 × 1009 2017 × 2017 ...甚至 127×127 就可以是一个只有 1 个 Component 的 Landscape。dev.epicgames.com/documentation/unreal-engine/landscape-technical-guide-in-unreal-engineT_sandheight1和T_MultilevelNoise1的红通道合成细节密度再乘流体模拟的密度信号。VelocityDensityBuffer的 B 通道是SimDensityR/G 存二维速度。它是模拟网格每个格子里的影响值不是 Terrain 的手绘图层也不代表雪的物理总量。Niagara 的交互绘制阶段把输入写入PainterGrid再由Composite and Gradient等阶段合并、搬运最后由Export VelocityAndDensity复制到材质读取的 Render Target。而 UE 经典 Landscape 实际走的是Plain textFrame N Grid Heightmap LOD → VS 算 position Frame N1 Grid Heightmap LOD → VS 再算 position Frame N2 Grid Heightmap LOD → VS 再算 position即使这几帧Plain textHeightmap 没变 LOD 没变 MorphAlpha 没变 材质 WPO 没变它也没有做你说的这种“跨帧结果缓存直到 dirty 再重算”。名字就叫Post-Transform Vertex Cache/Post-TL Cache。Khronos 和 NVIDIA 都明确有文档。wikis.khronos.org/opengl/Post_Transform_Cache但我要把范围收窄它不是你刚才说的那种“跨帧缓存 Landscape 最终位置”。它只是在一次 indexed draw 的顶点处理阶段发现同一个 index 又被后面的 triangle 引用了就可能复用刚才 Vertex Shader 的输出。例如一个 quadPlain text0 ---- 1 | / | | / | 2 ---- 3两个三角形Plain text0, 3, 1 0, 2, 3如果完全没有这种 cache那么理论上提交 index streamPlain text0 → VS 3 → VS 1 → VS 0 → VS // 又算一次 2 → VS 3 → VS // 又算一次有 post-transform cache 时更接近Plain text0 → VS → cache 3 → VS → cache 1 → VS → cache 0 → cache hit 2 → VS 3 → cache hit所以一个 triangle mesh 虽然Plain texttriangle 数 × 311 和 12 不是这么造的。古英语里它们分别是endleofan→ 后来变成 eleven字面意思接近「十之后还剩一个」one lefttwelf→ 后来变成 twelve意思是「十之后还剩两个」two leftSnowEffectController.cs └ 找到角色和怪物的脚、计算接触位置、调度模拟 SnowInteraction.compute └ 把接触写进网格更新痕迹的流动、反馈和消退 SnowSourceTerrainSurface.hlsl └ 读取更新后的网格把痕迹表现为颜色、法线和粗糙度NinjaLive_Large_FluidSim └─ 一套 2048 × 2048 的局部模拟网格 └─ 挂在 ThirdPersonCharacter1 下随角色移动日常手动操作最常见的是这两条让特效读取某种数据打开 Niagara System → 选一个 emitter 的模块 → 找到相关输入 → 选用并配置 Curve、Vector Field 等数据源。模块在运行时读取它你通常不需要自己写 Data Interface 的 C 实现。让别人方便地调这个特效在模块里找到想开放的输入比如尺寸→ 输入旁的下拉菜单选择Read from new User parameter→ 命名 → 保存 System。之后把 System 放进关卡选中 Niagara 组件就能在 Details 的User Parameters中改这个值蓝图也可以传值。Epic 的逐步操作说明。只有现成 Data Interface 无法提供你要的数据时才进入“自己定义并实现 Data Interface”的插件C开发流程。​UE 原版也朝向摄像机但它同时开启了“沿速度方向对齐”日常看到的“鹅毛大雪”往往比细碎小雪花落得稍快但两者都远慢于雨滴且容易受湍流影响而盘旋、减速。温度、湿度一个点附近vector field 总体是在往外散还是往里挤想象这个点周围套一个很小的盒子Plain text↑ ↗ □ ↖ ← → ↘ ↙ ↓如果穿出盒子的流量比流进来的多∇⋅v0\nabla\cdot v0它像一个 source东西从这里“冒出来”。如果更多箭头往盒子里∇⋅v0\nabla\cdot v0它像一个 sink东西在这里“被吃掉”。如果进多少出多少∇⋅v0\nabla\cdot v0它可以拐弯、旋转、拉成长条但局部不会凭空膨胀或压缩。数学上 divergence 就是“一个无穷小区域的净向外 flux / 体积”。mathworld.wolfram.com/Divergence.html所以 Curl Noise 论文里真正关心的是这三个概念Plain textvelocity field └─ 每个位置一根运动箭头 ├─ divergence 0 → source ├─ divergence 0 → sink └─ divergence 0 → 进出平衡而 curl 问的是完全不同的东西Plain textdivergence └─ 这里有没有“膨胀 / 收缩”趋势 curl └─ 这里有没有“旋转”趋势这两个特别容易因为 Curl Noise 论文混在一起。最有意思的是一个场完全可以Plain text疯狂旋转 divergence 0比如理想的绕圈Plain text← ← ↓ ↑ ↓ ↑ → →东西一直转但没有东西从中心产生也没有东西消失到中心。这正是论文想要的状态。所以前面那个恒等式∇⋅(∇×ψ)0\nabla\cdot(\nabla\times\psi)0现在可以直接读成“由 curl 造出来的场天然没有 source / sink。”速度 ÷ 20 m/s → 限制在 01 └─ 用这个比例把宽高倍率从 (1,1) 逐渐变到 (2,10) └─ 乘以雪片出生时的尺寸假设一片雪出生时是3 cm × 3 cm运动速度宽高倍率最终显示尺寸接近 0(1,1)3 × 3 cm10 m/s(1.5,5.5)4.5 × 16.5 cm20 m/s 及以上(2,10)6 × 30 cm再配合VelocityAligned雪片的长轴沿着它在屏幕上的运动方向排列于是你看到的是沿运动方向掠过的长雪片。这是人为设计的速度感不是雪花真的变大也不是靠运动模糊拖出来的。我说“解释了差别”指的是这组实际参数和这段计算能产生这种形状变化Cascadeur 官方对 game-engine pipeline 有一个挺适合你的建议Plain textAccuRIG ↓ Unity / UE ↓ 从 Game Engine 再 export 一份角色 ↓ Cascadeur ↓ 动画 ↓ Unity / UE他们认为先经过目标引擎一次可以提前固定 scale、axes、skeleton interpretation减少动画回来时 rotation/scale 出错。cascadeur.com/help/getting_started/import_fbxdae/import_from_blender​​结构其实是Plain text你导入一个 thigh joint ↓ Cascadeur 给它做 Rig Element ↓ 这个 Rig Element 同时知道 ├─ 它控制哪个 Joint ├─ 控制器在哪里 ├─ 它和父级怎么连接 ├─ AutoPosing 怎么处理它 └─ Physics 里这一截身体多重、多大AutoPosing、AutoPhysics 都依赖 Rig。cascadeur.com/help/rig低成本的physical proxy。Cascadeur 官方把这些青色椭球直接定义成 Rigid Body每个刚体除了 Mass还有 Position / Rotation / Ellipsoid dimensions并且内部还有 principal inertia moments用于物理计算。cascadeur.com/help/rig/rig_structure/rig_elements/rigid_bodies为什么光有 Mass 不够看两个东西Plain text1 kg 的铁球 1 kg 的长铁棍两者质量一样。你推着它们整体平移Plain textF ma区别可能不大。但你让它们旋转区别巨大Plain text同样 1 kg ● ───────── 质量靠近轴 质量离轴很远 容易旋转 更难改变旋转这里缺的量就是惯性矩 / inertia。这个身体部分 ├─ 有多重 Mass ├─ 中心在哪里 Position ├─ 朝哪个方向 Rotation └─ 有多大多长 Ellipsoid XYZCascadeur 的 physics engine 里甚至还有全局 Inertia Multiplier。cascadeur.com/help/rig/rig_structure/rig_elements/rigid_bodies青色椭球本身甚至不完全等于 collider。Cascadeur 另外还有 Collision Shape可以是 capsule / box官方说创建 collision shape 时可以拿 Rigid Body 的尺寸作为初始尺寸。也就是说它们在系统里是分开的cascadeur.com/help/category/267Plain textrigid body 的 mass / size 会参与物理计算和 Center of Mass而 Center of Mass 又是 AutoPhysics、Ballistic Trajectory、Fulcrum Points 等工具的基础。cascadeur.com/help/faq这里的cog icon就是你图里右下角那个 ⚙️。cog 原本更严格地说是齿轮上的一个“齿”也可以泛指 cogwheel即齿轮本身。dictionary.cambridge.org/dictionary/english/cog所以 UI 里说Click the cog icon基本就是点那个齿轮形的设置按钮你可以直接把几个词这样对应gear icon ≈ cog icon ⚙️ 设置图标这里不要纠结机械工程里 cog 和 gear 的严格区别。软件 UI 语境里cog icon 几乎就是“那个设置齿轮”。如果你是 UE则对应Plain textLevel Sequence ├─ Skeletal Animation Track └─ Audio Track动画 FBX 和音频分别 import​权重混合控制在UE引擎中Animation Blueprint里可以通过曲线控制IK和FK的混合权重最终结果 FK和IK按权重混合。走路时脚步IK权重设为高脚要贴地面跳跃时设为0动画接管脚在空中。在Maya中可以通过设置混合权重来同时使用IK和FK在需要精确控制的部位使用IK在需要自然流畅动作的部位使用FK。Survival Kit是英语里很常见的比喻一套让你足够应付这个领域核心问题的必备知识/工具。所以自然一点可以理解成《动画师必备宝典》 / 《动画师生存手册》 / 《动画师基础工具箱》这是 Richard Williams 很经典的一套动画教材核心讲角色动画的传统原则spacing、timing、walk cycle、weight、anticipation、overlap 等而且这些原则并不限于手绘动画同样用于 CGI、stop-motion。你截图这个The Animator’s Survival Kit Animated是把原来的书和 masterclass 内容做成大量动态示例的视频版本。www.youtube.com/watch​​​​Physics Settings → Physics → Gravity中将重力设为0也可以先使用0.01预设。一个 Animation Sequence让 Cascadeur 持续更新它。 但负责通讯的是Live LinkAnimation Sequence 负责接收和保存骨骼动画数据。​区分 Gameplay Animation 和 Cinematic Animation或 Cutscene Animation。实际游戏还有介于两者之间的一类常叫 Contextual Animation情境交互动画例如开门、处决、双人格斗、翻越障碍。它们往往是预制好的表演同时又需要适应运行时的角色与场景位置。Gameplay 追求动作的可复用性与运行时适应性。Cinematic 追求角色、镜头、场景在时间上的精确编排。Gameplay Camera System提供 Camera Rig、Camera Director 和 Transition 等结构用来组织复杂的运行时相机行为。Sequencer 编排人物和摄影机​Sequencer 中的一段 Animation Section。一个 Level Sequence 也可以容纳多段 Animation Sequence。Animation Sequence 已经由 Live Link 创建完毕Sequencer 只是引用它。Live Link for Unreal EngineCombined Skeletal MeshAssembleLevel Sequence Actor 才是场景中的 Actor。├─ Sequencer编辑器窗口 │ └─ 用来编辑 Level Sequence Asset​​​左侧 Asset Details└Animation→Retarget Source└ 选择实际的 MetaHuman Skeletal Mesh└ Save共享 Skeleton、模型比例不同的情况它和你之前用过的IK Retargeter不是同一个工具。不同 Skeleton 之间的动作转换仍可能需要 IK Retargeter。Retarget Manager in Unreal Engine | Unreal Engine 5.8 Documentation / Animation Sequences in Unreal Engine | Unreal Engine 5.8 DocumentationCascadeur 的 Timeline 播放头可以同步驱动 UE 中已打开的 Sequencer 播放头但反方向不成立。Live Link for Unreal Engine强制 MetaHuman 的 LOD 避免切换时的视觉异常。作者明确提醒他当时在 Live Link 开启的情况下 Bake 遇到了 UE 崩溃因此操作前先断开连接。他也承认这只是他找到的一种面部动画制作方法并未确定是最佳流程。右键 Control Rig 轨道 →Convert To Layered将它叠加在 Animation Sequence 上。这可以实现 Cascadeur 提供基础动作UE Control Rig 负责局部修正但要求 Control Rig 支持 Backwards Solve。Animating with Control Rig in Unreal Engine | Unreal Engine 5.8 DocumentationMute 主要是编辑器操作不保证影响游戏运行时的播放结果。 如果要将这个 Level Sequence 用于正式游戏不能只依赖 Mute 来解决冲突。Sequencer Track List in Unreal Engine | Unreal Engine 5.8 DocumentationSequencer → Actor Binding ├─ Possessable默认 │ └─ 引用 Level 中已经存在的 Actor │ └─ Spawnable ├─ 播放 Sequence 时创建 Actor ├─ 可以通过 Spawned Track 控制存在时间 └─ 名称旁边有闪电图标 ⚡cascadeur shift s /c / v 显示类型的快捷键按键功能SView Mode ↔ 当前 Edit ModeCJoint Mode ↔ 当前 Edit ModeShift SPoint Controller Mode ↔ 当前模式Shift CJoint Mode ↔ Mesh ModeQSelector ToolV隐藏选中对象Shift V隐藏未选中对象Alt V显示所有对象View Menu / Default Hot Keys很实用的 Selection Groups例如经常要同时选中左手整套控制器按键操作Ctrl 1将当前选择加入 Group 1Alt 1只选择 Group 11将 Group 1 与当前选择合并或切换共有0–9十个快捷选择组。Selector Tool特别注意 Cascadeur 中Joint才相当于 Blender 的 Bone。日常制作姿势时官方更推荐选择Point Controller或AutoPosing Controller而不是直接编辑 Joint。Joints2026 年 10 月 7 日Google 与 Unity 正式公布合作Google 的 blog.google/innovation-and-ai/technology/ai/playground-experimental-gaming-platform 已经允许用户通过自然语言生成可玩的游戏而更高级的 Unity Spark 计划进一步引入专业级游戏机制、高保真 3D 和 Unity Runtime。Create custom games without coding on Playground / Google and Unity Partner on New AI Gaming Platform for the Next Era of Interactive EntertainmentStateTree 和 Schema 又在哪里把运行角色也放进来完整关系就变成Plain textBP_Character场景中的角色 └─ StateTree Component负责运行 └─ ST_Character引用 StateTree 资产 ├─ Schema运行环境约束 ├─ Parameters / Evaluators提供数据 └─ Root State状态层级的起点 ├─ OnGround │ ├─ Idle │ └─ Run └─ InAir这里要注意Schema 并不参与 Root → OnGround → Run 这条状态选择路径。StateTree整棵状态树dev.epicgames.com这是编辑器中的 States 面板。Root、Danger、Peaceful、Wander 都是 State只是存在父子层级。​只有速度场还不能保证流体不会在某个地方凭空堆积或消失。Pressure压力提供修正速度的作用Jacobi 则负责近似算出这份压力分布。这也是为什么流体模拟中会花几十轮 Jacobi 迭代来求压力。Chapter 38. Fast Fluid Dynamics Simulation on the GPU真正改变速度的是压力梯度Pressure Gradient不是压力的绝对数值。 整个压力场统一加 100只要各处压力差不变流体受到的压力作用力也不变。创建 StateTree 时的 Schema 选择窗口。StateTree Component通常由 Actor 上的组件运行。StateTree AI Component面向 AIController 的环境。Mass Behavior面向 Mass Entity 系统常用于大量 NPC、Crowd AI。Selection Behavior选中它时下一步怎么选这里同一个 State 的 Details 同时有Type State它属于什么结构。Selection Behavior Try Enter当选择流程到达它时直接进入自己还是继续选择子状态。比较常用的 BehaviorSelection Behavior规则Try Enter直接选中当前 StateTry Select Children in Order按顺序找第一个满足条件的子状态Try Select Children at Random随机尝试子状态Try Select Children with Highest Utility选择评分最高的有效子状态Try Follow Transitions尝试沿当前 State 的 Transition 继续选择State Tree Selectors Overview | Unreal Engine 5.8 Documentation例如速度场有A、B 两张三维纹理尺寸和格式相同。一次更新读取 A 中的旧速度计算后写入 B完成后交换它们的读写角色这样做是因为每个格子的计算会读取周围格子。如果同时读写同一张纹理有些线程可能读到旧值有些读到刚更新的值结果就会依赖 GPU 的执行顺序。这种做法叫Ping-Pong 双缓冲。散度场张什么样?散度场Divergence Field通常看起来像一张红蓝交错的热力图。 每个格子存储一个数值表示这个位置的流体正在向外发散还是向内汇聚。math.umd.edu马里兰大学的二维散度可视化。黑色箭头是 Velocity Field背景颜色是 Divergence Field。 Example for curl and div of a 2D vector field红色正散度流出大于流入局部趋向膨胀。蓝色负散度流入大于流出局部趋向收缩。接近零流入与流出平衡即使流体正在高速运动或旋转。实际模拟中长什么样physicsbaseddeeplearning.org32×32 速度网格计算出的散度场可见每个格子的散度数值分布。Learning the Helmholtz-Hodge Decomposition它本质上就是一张单通道的浮点 Texture。你前面提到的 Pressure Projection目标就是把这张图里的数值尽可能压到 0同时保留流体能够进行的流动和旋转。因此一个烟团可以卷得很厉害但散度场依然几乎全为零。卷得厉不厉害主要看 Vorticity旋度局部膨胀收缩则看 Divergence散度。Navier–Stokes纳维–斯托克斯两位科学家的姓氏。指描述流体运动的一组方程。Vorticity涡量。来自 vortex涡旋后缀 -ity 表示某种性质或量。重音从 vortex 的第一音节移到了 TIS。Confinement来自 confine限制、约束。这里指让涡量保持集中避免小尺度涡旋被数值耗散抹平。with Vorticity Confinement即「带有涡量约束的 Navier–Stokes 流体模拟」。还有一个值得注意的地方2001 年经典论文 www.graphics.stanford.edu/papers/smoke 采用的是无黏性的 Euler Equations再引入 Vorticity Confinement。也就是说涡量约束并不要求一定使用 Navier–Stokes 方程。Visual Simulation of Smoke完全可以而且这是另一条更值得考虑的路线。例如提高网格分辨率。使用更高阶的 MacCormack Advection减少数值平滑。在需要时采用其他低耗散数值格式。NVIDIA 的 developer.nvidia.com/gpugems/gpugems3/part-v-physics-simulation/chapter-30-real-time-simulation-and-rendering-3d-fluids 就采用 MacCormack 来提高平流精度。Chapter 30. Real-Time Simulation and Rendering of 3D Fluids​这种额外损失叫 Numerical Diffusion / Numerical Dissipation数值扩散数值耗散。NVIDIA 的 developer.nvidia.com/gpugems/gpugems3/part-v-physics-simulation/chapter-30-real-time-simulation-and-rendering-3d-fluids 明确把它列为 Semi-Lagrangian 的问题。Chapter 30. Real-Time Simulation and Rendering of 3D FluidsVorticity Confinement 就是试图补回那些因数值耗散而衰弱的旋转。它不一定能恢复原来正确的速度场。直接提高平流精度、减少插值误差确实可以降低对 Vorticity Confinement 的依赖。 MacCormack Advection 就是针对这个问题的一种改进。它根据什么补偿经典 Vorticity Confinement 使用两个信息Vorticity涡量从当前速度场的 Curl 计算知道局部旋转的方向和强度。Vorticity Magnitude Gradient涡量大小的梯度知道涡量向哪个方向变得更强。它根据这两者计算一个额外的力。--增强力度,网格尺度。尤其注意最后的叉乘它产生的力垂直于涡量方向和涡量大小的梯度方向通常会沿着涡旋的切向推动流体。算法只知道应该朝哪个方向增强旋转不知道应该补偿多少才准确。 补偿强度由人为参数 ε\varepsilon 决定。Chapter 38. Fast Fluid Dynamics Simulation on the GPU / Visual Simulation of Smoke如果局部的 Vorticity 已经变成零或者它的大小在周围完全没有梯度那么经典 Confinement 在该处就不会产生有效补偿力。是否考虑流体的黏性Viscosity。两者的关系非常直接这是不可压缩、常密度情况下的 Navier–Stokes 动量方程。令黏性系数 ν0就得到相应的 Euler 方程。 Euler Equations | Glenn Research Center模拟的烟雾显式考虑黏性带来的收益有限却增加计算成本​GPU 上具体做什么Plain textVelocity Texture (RG) └─ Compute Divergence └─ Divergence Texture (R) └─ Initialize Pressure 0 └─ Jacobi × 40 ├─ Read Divergence Texture ├─ Read Pressure A ├─ Write Pressure B └─ Swap A / B └─ Final Pressure Texture └─ Subtract Pressure Gradient └─ Corrected Velocity Texture这里要注意Jacobi 的 40 次迭代只更新 Pressure Texture并不会每轮重新计算 Divergence 或修改 Velocity。可以直接看的 github.com/jeroenwjb/webgpu-fluid-sim支持切换 Jacobi、Gauss–Seidel 和 Multigrid并测量各自的 GPU 耗时与残差。Jacobi 一直在原分辨率上更新邻居Multigrid 则利用低分辨率网格处理大范围误差再将修正传回高分辨率。​​Trajectory Weight 7、Pose Weight 1就是在调节两类距离的相对重要性。UE 还会对特征及权重进行归一化处理。Motion Matching in Unreal Engine | Unreal Engine 5.8 Documentation还可以添加Velocity、Heading、Phase等 Channel并不限于默认两个。Pose Search 插件提供了一组自定义 Rewind Debugger 工具能够追踪 Motion Matching 的 Pose 选择及其相关数值。这些数据可以帮助你理解系统选择了哪些 Pose。为什么选择这些 Pose。​对于连续移动维持 GASP 原有的每帧 Motion Matching对于一次性的攻击、弹反和处决更适合在动作触发时调用一次Motion Match选好起始帧后按动作规则执行避免搜索器每帧把攻击切断。这恰好也是 GASP 的 Traversal跨越障碍采用的思路。 它先根据障碍类别过滤动画再执行 Motion Matching 搜索选取动作进入点。UE 提供Pose Search: Motion Matched Branch In来限制可以进入动画的区间。Motion Match | Unreal Engine 5.8 Documentation / Motion Matching in Unreal Engine | Unreal Engine 5.8 Documentation假设角色需要向左转但数据库里有两个候选 Pose比较项目候选 A候选 BTrajectory 误差0.20.5Pose 误差0.80.1总 Cost1.00.6这些数值仅作示例假设两个 Channel 的权重相同。A 的运动轨迹更符合要求但 B 的骨骼姿态更接近当前角色。综合计算后B 的 Cost 更低因此更可能被选中。2026 年 5 月一位开发者在 Epic 论坛和 Reddit 上公布了用 Unreal Insights 对比 UE 5.7 GASP 与传统动画系统的结果。测量项目传统 State MachineGASP Motion Matching动作选择相关开销 / 角色0.008 ms约 0.25 ms整体动画 Worker Thread 耗时 / 角色0.43 ms0.50 msGame Thread 动画开销 / 角色0.07 ms0.14 msState Machine vs. Motion Matching - Demo Performance Analysis Share - Character Animation / State Machine vs. Motion Matching值得注意动作选择相关部分约贵 31 倍。但整体动画耗时没有增长 31 倍因为两套 Animation Blueprint 做的工作不同。GASP 的 0.25 ms 包括 Pose Search、Trajectory、Chooser、BlendStack 等并非纯粹的 KD-Tree 搜索时间。这不是严格控制变量的测试传统系统有 19 个角色而 GASP 只有一个角色动画图的其他功能也不相同。这组结果说明了为什么开发者会认真考虑 Motion Matching 的性能却不会仅凭它比 State Machine 慢几十倍就放弃使用。提取各帧特征 → PCA 降维 → 建立 KD-Tree搜索模式性能特征Brute Force遍历全部索引 Pose准确但成本随数据库增大。PCAKDTree优化模式先近似检索再计算少量候选的完整 Cost。VPTree另一种索引搜索模式官方仍标为 Experimental。Motion Matching in Unreal Engine | Unreal Engine 5.8 Documentation特别注意两个频率Schema → Sample Rate 30每秒从原始动画建立约 30 个候选采样点主要决定 Database 密度。Motion Matching → Search Throttle Time 0.033两次主动搜索至少间隔约 33 ms不代表动画只能以 30 FPS 播放。两者是独立的。对于远处 NPC还可以结合 Animation Update Rate OptimizationURO减少动画更新次数。角色数量越多这些措施越重要。Animation Optimization in Unreal Engine | Unreal Engine 5.8 DocumentationUE 要求已有 Sequence被当前关卡中的 Level Sequence Actor 引用才会把它列在这里。让它出现在这个下拉菜单把这个已有资产从 Content Drawer 拖进关卡。UE 会创建一个引用它的 Level Sequence Actor之后菜单就会显示它。​​​​Qt 3D Studio。左键拖拽对象 → 在相机平面内移动。右键拖拽对象 → 沿相机视线轴前后移动。这是它的官方操作定义。Studio: Toolbar精确世界坐标的建模操作未必合适。Cascadeur 目前的 Trajectory Tangents 工具只支持 IK 的 Translation / Direction 轨迹不支持 FK 或 Rotation 轨迹。Trajectory Tangents (Beta)​

相关新闻

SpringBoot智能出行系统开发实战

SpringBoot智能出行系统开发实战

1. 项目概述与背景作为一名长期从事Java开发的工程师,我最近完成了一个基于SpringBoot的智能出行系统毕业设计项目。这个系统将拼车和打车功能整合在一个平台上,解决了传统出行方式中信息不对称、流程不规范的问题。在实际开发过程中,我发现这…

2026/10/13 6:49:51 阅读更多 →
Cortex-M4 三级流水线 BL 带返回跳转指令(PC、LB)

Cortex-M4 三级流水线 BL 带返回跳转指令(PC、LB)

一、行业经典疑点:两段官方描述看似冲突在 Cortex‑M4 汇编体系中,关于 BL 指令存在两段标准描述,是嵌入式学习、面试、考试的核心易错点:硬件流水线描述:BL 执行顺序为先将 PC−4 赋值给 LR,再将目标函数入…

2026/10/13 6:49:51 阅读更多 →
CentOS 7 NTP精准同步实战:从配置到生产级时间治理

CentOS 7 NTP精准同步实战:从配置到生产级时间治理

1. 为什么在CentOS 7里搭NTP不是“装个包就完事”——从一次生产环境时间漂移说起去年冬天,某公司一套基于Kubernetes的订单处理系统突然出现大量“时间戳异常”告警。日志里同一笔交易的前端请求时间比后端数据库写入时间早了3.2秒,而MQ消息的消费延迟计…

2026/10/13 6:49:51 阅读更多 →

最新新闻

链表分解:从内存布局到指针偏移的底层实践

链表分解:从内存布局到指针偏移的底层实践

1. 项目概述:这不是“拆链子”,而是把链表“掰开揉碎”讲清楚 “链表的分解”这五个字,乍看像一道算法题的标题,但实际在一线教学、代码评审和系统调试中,它代表一种极其关键的底层思维训练——不是单纯地写个反转或删…

2026/10/13 7:37:09 阅读更多 →
Python网络协议编辑器与分析器:从抓包到构造的全链路实现

Python网络协议编辑器与分析器:从抓包到构造的全链路实现

简介:计算机网络课程设计作品,包含网络协议编辑器与网络协议分析器,采用Python编程实现,面向计算机专业本科生、网络编程爱好者及需要完成类似课设的开发者。资源内包括两个主要Python脚本:packet_sender.py用于创建、…

2026/10/13 7:37:09 阅读更多 →
Unity触发器实战:翻滚闪避技能与无敌帧实现

Unity触发器实战:翻滚闪避技能与无敌帧实现

最近在做动作类游戏原型时,我发现很多新手在实现“翻滚/闪避”这类技能时,会遇到一个很典型的问题:动画已经播了、位移也加了,但角色在翻滚过程中要么被敌人的攻击触发器误判命中,要么翻滚结束后触发器没有正确恢复状态…

2026/10/13 7:37:09 阅读更多 →
SwiftUI 与 Agent 架构解析:声明式 UI 驱动端侧智能体

SwiftUI 与 Agent 架构解析:声明式 UI 驱动端侧智能体

1. 从标题拆解 SwiftUI-Agent-Skill 到底想解决什么问题第一次看到 “SwiftUI-Agent-Skill” 这个组合词,我的直觉是:它不是一个单纯的 UI 框架教程,也不是一个泛泛的 AI 工具介绍,而是把三个原本分属不同层面的东西强行捏在了一起…

2026/10/13 7:37:09 阅读更多 →
网页正文提取实战:从URL到干净Markdown的命令行工具

网页正文提取实战:从URL到干净Markdown的命令行工具

1. rea 的定位:从网页 URL 到本地 Markdown 的一站式工具前两个月整理个人知识库的时候,我经常干一件事:把网上看到的好文章存到本地。试过浏览器收藏夹,时间一长全是死链;试过截图,检索和引用都不方便&…

2026/10/13 7:37:09 阅读更多 →
SpringBoot+Vue打造装饰工程管理系统:完整实战解析

SpringBoot+Vue打造装饰工程管理系统:完整实战解析

做装饰工程项目管理的系统,很多老牌软件公司都停留在单体架构时代,界面老旧、流程僵硬,项目经理宁可自己拉Excel表格也不愿意用。而新团队上来就搞微服务分布式,对一家中小型装饰公司来说,根本就是杀鸡用牛刀&#xff…

2026/10/13 7:36:08 阅读更多 →

日新闻

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

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

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

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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →