ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

自由学习记录(229)

自由学习记录(229)

​

Cascadeur 2025.2 把可编辑的轨迹切线分为:

Translation Trajectory

Direction Trajectory

Pelvis Main

Chest Main

Hand Main

Neck Main

Foot Main

Head Main

Toe Main

UpperArm Main

LowerArm Main、Calf Main

这也说明并非严格只有五个点。Toe(脚趾)也支持 Translation Tangents;部分 Additional、Directional Point 同样可以支持。

​

Add一次会创建一整组 Prototype Rig Elements:

└─ Proto Rigid Body:截图中看到的椭球,用于后续生成物理刚体。

└─ Proto Box Controller:用于生成 Box Controller。

└─ Proto Point Controllers: └─ Main、Direction、Additional 三种控制点。

它们目前都是原型对象,要点击下方的Generate rig才会生成正式的 Rig。Rigging Tools / Elements in Rig Mode

圈出的设置对应关系是:

设置

实际控制

Axis = Z

Additional Point 沿 Z 轴放置

Space = Local

使用 Joint 的局部坐标轴

Offset = 40

Additional Point 距离 Main Point 的距离

Add

创建整套 Prototype Rig Elements

为什么你只注意到椭球?

因为 Outliner 默认隐藏 Prototype 内部对象。你可以打开 Outliner 右上角的菜单,启用Show prototype inner objects,查看里面的 Point Controllers。Elements in Rig Mode

https://news.google.com/rss/headlines/section/topic/TECHNOLOGY?hl=en-US&gl=US&ceid=US:en

https://news.google.com/rss/headlines/section/topic/BUSINESS?hl=en-US&gl=US&ceid=US:en

https://news.google.com/rss/headlines/section/topic/SCIENCE?hl=en-US&gl=US&ceid=US:en

记得的推荐应该是 Cascadeur 官方关于 Box Controller 替代 Rigid Body 的建议:

└ 躯干、主要肢体等有明显质量的部分,通常使用 Rigid Body。

└ 手指、头发、尾巴的细小关节、辅助骨骼等,可以使用 Box Controller,避免给每个关节都建立 Rigid Body。

“尝试次数”就是程序找位置、检查位置的次数,不是最终树木数量。例如尝试 100 次,其中 40 次位置不合适,就最多留下 60 棵;

动作中的具体效果合适的关系只用轨迹留痕会怎样
武器附魔,剑刃始终发亮跟随剑已经移开,亮光还留在旧位置,无法持续描述当前剑刃
挥剑时出现一道弧光留痕这正是留痕擅长的:显示挥动路径
挥得越快,火星越密;停手后停止产生速度驱动发射固定发射会在静止时继续堆积,快慢变化也不明显
剑上甩出的火星继续飞走脱离运动火星只停在路径上,缺少被甩出去的惯性
手心蓄力,能量一直聚在手上跟随+局部向内运动手一移动就拖出一串,聚集感会被破坏
火焰挥剑 ├ 剑刃上的亮边:跟随,让人知道当前哪里带着能量 ├ 挥过的短弧光:留痕,让人读出挥动方向和范围 └ 甩出的火星:速度驱动发射+脱离运动,让人感到速度和惯性

主体本身是否需要持续发亮?快速动作是否应该多产生一点东西?有没有东西应该甩出去?

下载的 brown_mud_02 泥土材质 └ Diffuse.jpg:颜色 └ nor_gl.png:法线 └ arm.png:环境遮蔽、粗糙度、金属度 └ Displacement.png:原本就提供的灰度高度图 ↓ 将数据整理到一张 RGBA 贴图 TerrainMask_Metallic_AO_Height_Smoothness.png └ R:金属度 └ G:环境遮蔽 AO └ B:Displacement.png 的高度 └ A:光滑度,即 1 − 粗糙度

现在想象:你斜着看这板巧克力,视线正好从沟槽上方穿进去。

你的眼睛 👁 ╲ ╲ ╲ ① 到达最高参考面,这里是沟槽,还没碰到东西 ╲ ╲ ② 继续往里看 ╲ ● ③ 碰到沟槽底部或侧面

你真正看见的,是③ 的颜色,不是视线刚到参考面时① 的颜色。

视差算法就在模拟这个寻找过程。

但 Unity 里的 Terrain 仍然是一层原来的地面,没有真的建出这些巧克力块。Shader 每画一个像素,就拿高度图做几次查询:

“沿这条视线再走一点。这里有多高?碰到了吗?还没有就继续。碰到了,就去那个位置取颜色。”

于是,它把原本要在①取的颜色,换成了③的颜色。法线等材质数据也跟着换到③采样,画面就有了沟槽深进去的感觉。

为什么斜着看更明显?

正着看: 斜着看: 👁 👁 │ ╲ ① ① │ ╲ ③ ③ ①③上下基本对齐 ①③在地面上的位置错开 采样偏移很小 采样偏移更明显

你刚才把深度从0 调到 0.06 米,相当于告诉 Shader:

“这份高低说明书描述的沟槽,按最多约 6 厘米的深度范围去寻找交点。”

当前像素 └ 朝屏幕中心取 32 次样本 ├ 靠近原位置的样本偏重蓝色 ├ 中间的样本偏重绿色 └ 更靠近中心的样本偏重红色 └ 分通道累加、归一化,再与原画面混合
采样位置 = 当前 UV +(屏幕中心 UV − 当前 UV) ×(样本序号 / 32) × 当前强度

因此它同时产生两种现象:

  • 径向模糊:沿径向取了多个位置并混合,轮廓被拉开。
  • 色散:RGB 通道主要来自不同位置,轮廓边缘出现彩色错位

Terrain 有根据视点调整地形网格细节的机制,Pixel Error控制简化程度,也支持实例化绘制。Terrain 原生草地、细节和树木有相应的距离、细节或公告牌设置。所以,Hierarchy 里只有一个 Terrain,并不等于内部没有分区和细节管理。

Rigid Body 太多会让角色的质量分布和 AutoPhysics 行为更难控制,不只是增加计算量。比如给每根手指骨骼都赋予不合理的质量,角色的 Center of Mass 就可能发生偏移。Rigid Bodies / AutoPhysics

为什么 Unity 不让 Add Override 自动运行自定义效果?

这里确实有历史上的设计争议。

2022 年,Unity Discussions 上一位名为 FronkonGames 的插件开发者遇到了与你几乎一样的问题:他已经把自定义后处理效果做成 Renderer Feature,接着希望把它直接移进 Volume。

结果他发现:继承VolumeComponent,甚至实现IPostProcessComponent,都不会让 URP 自动执行自己的 Shader。

其他开发者解释,仍然需要 Renderer Feature 实际执行渲染,并从VolumeManager.instance.stack读取参数。

FronkonGames 对这种限制表示失望,因为他的目的是制作方便其他开发者使用的 Asset Store 插件。Custom Post Processing Volume. - Render Pipelines

这不是你误解了设计,而是 Unity 当时确实没有把自定义后处理的参数注册与算法执行统一成一个自动化接口。

之后 Unity 6 提供了创建自定义后处理的模板,但模板生成的仍然是彼此配合的 Renderer Feature 和 Volume Component,而不是一个 Volume Component 包办渲染。Create a custom post-processing effect with Volume support in URP • Unity Editor

有趣的是,Unity 的 URP 更新记录还明确提到,曾经特意把 Renderer Feature List 的 UI 重新设计得更接近 Volume Profile UI。它们在界面上越来越相似,底层职责却依然不同。Changelog | Universal RP

层级

要决定什么

典型方案

① Rotation Representation

用什么数据表示旋转

Euler / Quaternion

② Two-point Interpolation

两个朝向之间怎样计算

Slerp / NLerp

③ Multi-keyframe Curve

多个关键帧怎样组成连续曲线

Piecewise Slerp / Circular Blending / Squad

④ Pose Blending

多套动画姿势怎样混合

Weighted Blend / Additive Blend 等

  • UE使用两个 Pose 之间插值:Slerp、NLerp 最常见。

  • 多个 Keyframe 形成连续旋转曲线:Squad、Quaternion Spline、Cubic Interpolation。

  • 多个动画 Pose 同时混合:Weighted Quaternion Blending、Additive Rotation、Log/Exp Blending 等。

rationale

某项决定背后的理由和推理依据。与单纯的 reason 不同,rationale 往往强调一套能够解释和支持决定的论证。

为什么明明有 Mocap,还要手工做?

最能说明问题的是《Mortal Shell》的开发者观点:他们想要控制的不只是角色挥剑的路径,而是剑在哪一刻加速、停顿、命中,以及玩家怎样感受到重量。用 Keyframe 修改这些时间关系,可能比清理和重新调整 Mocap 更快。

而 Mocap 的优势恰好是另一回事。

它能非常高效地捕获真实人体复杂的关节协调、重量转移和微小动作。尤其是常规 Locomotion,一位演员连续跑动、急停、转向,可以一次录制大量互相关联的数据。

Vanessa Ruffra 的制作经验也提到,Locomotion 恰好是 Mocap 特别有优势的地方;但是手指、Foot Sliding、动作衔接、Root Motion 和 Gameplay Timing 仍然需要动画师调整。Keyframe or Mocap ?

2023 年有一位自称 Microsoft 员工、家人在 ZeniMax 从事动画工作的开发者解释过另一项原因:临时增加一个挥斧动作,重新安排演员、动捕棚和技术人员可能反而比动画师直接 Keyframe 更麻烦。AAA game animators has mocap completely replaced key frame animations?

2026 年的开源项目 github.com/Fusion-Fix/ResidentEvilClassicTrilogy.FusionFix 就是很好的反例。

它给经典《Resident Evil》增加屏幕相对移动,同时保留原来的 Tank Controls。

但是团队不得不处理一个问题:

角色正在按 W 穿过走廊,Camera 突然切换到反方向。如果立即根据新 Camera 重新解释 W,角色就可能掉头走回去,甚至在 Camera 切换边界反复折返。

项目采取的策略之一是:当玩家持续保持原有输入时,暂时保留原移动朝向,直到玩家松开或者明显改变输入。GitHub - Fusion-Fix/ResidentEvilClassicTrilogy.FusionFix

(MoverComponent.cpp 第 249–265 行)

  • 如果你没调用 Set Primary Visual Component,Mover 会自己找:先在胶囊的直接子级里找第一个 Mesh,找不到再在整个角色身上随便找一个。
  • 所以你蓝图里那个节点其实可以不放,CharacterMesh 本来就会被自动选中。
  • 第 269 行还规定,外观组件不能和胶囊是同一个组件。

第 1694 行:Root Motion 要先借 Mesh 的骨骼,把动画里的位移换算成世界坐标。

以角色拥有一个 Inventory 对象为例:

旧:Virtual Dispatch

Replication System

ReplicateSubobjects()

执行用户代码

Inventory UObject

新:Registration

Replication System

Registered List

登记哪些对象参与

Inventory UObject

旧路径的思想是:复制系统调用你的虚函数,让你的代码决定这次如何复制子对象。

新路径则是:你先告诉引擎哪些子对象参与复制,引擎便可以集中管理它们。

这与 UE 的 Mass、Mover、Render Dependency Graph 所体现的结构变化有共通之处:把原先隐含在调用过程中的信息提前显式交给系统。

标记 dirty:transform 一变,Mesh 就会调 MarkRenderTransformDirty,并被记进 UWorld 的 end-of-frame 列表。

​

一个 Component 可以是 Subobject;普通的 UObject 也可以是 Subobject。

​

为什么网络系统后来采用了 Subobject 这个词?

因为 UE 的网络系统最初主要围绕Actor工作。

后来开发者需要让 Actor 内部的其他 UObject 也能够独立复制属性。例如角色的 Inventory、武器状态、技能实例。

这些对象并不一定需要成为 Actor,甚至不一定需要成为 ActorComponent。

于是网络系统增加了这样的能力:

让某个 UObject 通过所属 Actor 的网络通道参与复制。

这就是Replicated Subobject。

UE 5.8 官方文档也区分了两种情况:

  • Default Subobject:通常在构造函数中创建,服务器和客户端创建 Actor 时各自已有对应实例。

  • Dynamic Subobject:服务器运行期间创建;在符合复制条件时,客户端可以通过接收到的网络数据创建对应实例。

Replicating UObjects in Unreal Engine | Unreal Engine 5.8 Documentation

Replication 这个术语并不是 Epic 为游戏发明的,而是沿用了当时分布式系统(Distributed Systems)的既有词汇。 Unreal Networking Architecture

区别发生在数据进入网络系统之前。

在对象数量较少时足够灵活,而且特别符合当年 UE 的 Actor-Centric Architecture。

但随着世界越来越大,出现了一个矛盾:

网络系统想一次处理许多对象、提前筛选和安排工作;Gameplay 代码却把复制对象的选择过程隐藏在各个虚函数里。

节点,变量,属性也能被 Iris 复用

哪些其他节点会出现类似图标?

Client Only — Cosmetic

Add to Viewport、Remove Mapping Context、Clear All Mappings等。

对应BlueprintCosmetic,主要标记不需要 Dedicated Server 执行的功能。

Server Only — Authority

例如Apply Damage。

对应BlueprintAuthorityOnly。提醒开发者这个函数要求 Network Authority,普通远程客户端不能靠直接调用它修改服务器权威状态。

Latent — 延迟完成

例如Delay、某些异步加载节点。

标记执行可能在稍后继续,不属于客户端/服务器的权限分类。

Motion Matching​天然地支持多线程。

Inbetweening and Motion Generation (formerly known asRoot Motion) have been trained on larger datasets, resulting in better output.
Also,Inbetweeningnow passes styles between keys.

- Applying it to all frames marks the interpolation in green, while applying it only to keyframes does not.

也可以按住Alt再把变量拖进图表,

Proxy Asset声明上下文数据类型为ABP_Manny,然后动画蓝图持有Proxy Table引用,供Evaluate Proxy在运行时解析。

标准化怎么解决

Pose Search Schema 里有Normalization Group(归一化组)这个属性。

官方说明:

If set, all the channels of the same class with the same cardinality, and the same Normalization Group, will be normalized together.
For example, in a locomotion database of a character holding a weapon, containing non-mirrable animations, you may still want to normalize left foot and right foot positions and velocity.⁠Docs.unrealengine

具体机制:

  1. 你给左脚 Position、右脚 Position(以及对应的 Velocity)设置同一个 Normalization Group 名字。
  2. 构建 Database 索引时,系统把这些通道的数据合并计算均值和标准差。
  3. 用这个共同的统计量去做标准化(Normalize against its deviation)。
  4. 这样左右两边被放到同一尺度上,不会因为某一侧原始波动范围小就被自动压低影响力。

SchemaCardinality(每个 pose 要存储和比较的 float 数量)Schema 每个 pose 的特征维度数量

UPROPERTY(Transient)):不序列化(不存进 .uasset)。

学术研究的对应关系(可引用)

⁠Acm

UE 的默认 Trajectory + 双脚 Pose 配置本质上是对这一思路的工程实现,只是采样点数量和 Flags 可灵活调整,因此实际 SchemaCardinality 会围绕这个量级浮动。

Pose Search Schema资产的Debug分类>Additional Debug Channels

Inject Additional Debug Channels

官方说明(bInjectAdditionalDebugChannels):

If bInjectAdditionalDebugChannels is true, channels will be asked to inject additional channels into this schema.
the original intent is to add UPoseSearchFeatureChannel_Position(s) to help with the complexity of the debug drawing (the database will have all the necessary positions to draw lines at the right location and time).⁠Dev.epicgames

Draw Inject Additional Debug Channels

官方说明(bDrawInjectAdditionalDebugChannels):

If bDrawInjectAdditionalDebugChannels is true, all the channels added for debug purposes with bInjectAdditionalDebugChannels (as well as all those channels with an associated zero weight) will be drawn.⁠Dev.epicgames

Sampling Time Channel 的官方描述确实很简略,我帮你拆清楚。

官方原文:

This channel is mainly for debug purposes toaugment the features data with the sampling time(default weight is set to zero to be irrelevant during searches).

每个被索引的 pose 在 Database 里都有一个对应的采样时间(Sampling Time),也就是这个 pose 在原始动画序列里的时间点(比如 0.33 秒、1.25 秒等)。

Sampling Time Channel 会把这个时间值**直接写进特征向量(feature vector)**里,作为额外的一个维度。

和 “Sample Time Offset” 的区别

不要和各个 Channel 上的Sample Time Offset搞混:

  • Sample Time Offset是“相对于当前采样点,再往前/往后偏移多少秒去采样骨骼数据”(比如脚在未来 0.1 秒的位置)
  • Sampling Time Channel是把“当前这个 pose 自己的绝对采样时间”存进特征数据里

Addressables 最终是在内容构建(content build)时通过 Scriptable Build Pipeline 打成 AssetBundle,>>Addressables Settings 里注册过的资产>>想打破硬引用>>>用uid达成软引用,

输入系统 ├ 配置层:GameInputActions.inputactions │ ├ Global │ │ ├ M:地图开关 │ │ ├ F:飞行切换 │ │ └ Continue:标题页继续 │ ├ Gameplay │ │ ├ 左键:移动、攻击、NPC 交互 │ │ ├ 右键/Esc:取消技能选目标 │ │ ├ 右键拖动/滚轮:相机旋转、缩放 │ │ ├ Shortcut1~6:技能/物品快捷栏 │ │ └ F5:保存 │ ├ Flight │ │ ├ WASD:移动 │ │ ├ Space/Ctrl:升降 │ │ ├ Shift:加速 │ │ └ 右键拖动:视角 │ └ UI │ ├ 指针、点击、滚轮、触摸 │ ├ 背包右键操作 │ └ 导航、确认、取消 │ ├ 管理层:运行时 Hierarchy 中的 GameInput 对象 │ ├ GameInputBootstrap:启停操作组、绑定 UI、释放输入资源 │ ├ GameInput:统一读取动作,判断当前允许哪些操作 │ └ WorldPointerInput:NPC 点击、NPC/敌人悬停光标 │ └ 执行层 ├ PlayerDir/PlayerAttack:移动、攻击、技能选目标 ├ PlayerExplorationFlight:飞行 ├ FollowPlayer:相机 ├ InputSystemUIInputModule:分发 UI 事件 └ 背包、装备、快捷栏:执行各自操作

所有基于 Unity AssetDatabase.GetDependencies 的工具的共同限制,不是 Hunter 独有的问题。

它会漏掉什么

  • 纯代码字符串加载:Resources.Load("Prefabs/XXX")、Addressables.LoadAssetAsync("key")、Shader.Find、Animator.LoadController 等。序列化依赖图里没有这些引用,工具会把它们标成未使用。

先建立排水网络,再生成与它匹配的地形。研究里已有先生成分层河网,再通过河流、地形片段的组合与雕刻形成地貌的方法;这支持“水系参与构造地形”的方向,但不能直接当作无限世界问题已经解决的证明。基于水文的地形生成研究

Procedural river drainage basins

你的情况在电影圈有现成的做法:导演大多不懂乐理,也要对作曲家提修改意见。先发第一条,是教导演怎么给音乐提意见的指南,出自 filmmakergenius.com 的课程"Working with a Film Composer"(我没找到署名作者,这一点要说明)。

原话:"describe the problem, not the solution."(描述问题,不要描述解法。)例子是不要说"add more strings"或"make it faster",而是说"this doesn't feel as tense as the scene needs"。理由是:指定解法常常误诊问题,还把作曲家框住。它还说要具体到时间点,"from 1:12 the energy drops when the scene should be building" 比 "I don't love the middle" 好,并且用"这段音乐该为场景做什么"的功能和情绪来说。(来源)

爱尔兰银幕作曲家协会(Screen Composers Guild of Ireland)的 PDF《Working with Composers》,面向导演。原话:"You don't have to be a music guru ... to communicate with your composer. If you are not a trained musician, the best way to express your vision is by using emotional action words, similarly to the ones you use with your actors."(不是音乐专家也能沟通,用像对演员那样的情绪动作词。)还有一句警告:如果你误用了一个在专业里意思不同的音乐术语,可能把整首曲子带偏。另外它建议先开"定位会议"(spotting session):导演和作曲家一起看完整的片子,逐段决定音乐在哪里进、哪里出、每一段要完成什么、观众该感觉到什么,像给音乐写一份剧本。(来源)

作曲家 Jamie Thierman 写的《A Director's Guide to Communicating with Composers》,2020 年。他在文中自称是"a composer",他的说法是:"composing for a director is complete mindreading"(替导演作曲完全靠读心)。他给的办法是用参考曲(temp,临时配乐)当对话工具,但要说清楚你喜欢参考曲的什么、不喜欢什么;"Use multiple temp music pieces for the same scene",给同一个场景放好几首风格相近的曲子,这样作曲家能找出它们的共同点,而不是被某一首"盖住";还有"NEVER LISTEN TO IT AGAIN"——用过一两次就别再听,免得爱上它,然后一遍遍说"make it more like the temp"。(来源)

例(用 v1 的诊断数据):在 1:11 以后(第 17 小节起),我期待开头那个"下行二度、小三度、二度"的小旋律还会以某种变形出现,但听到的只是全音音阶上上下下(+2 +2 +2 −2 −2 −2);到 1:43(第 25 小节)的高潮又是一个新旋律 E D G A,和开头没关系。所以后半段我觉得散了。

返回列表