自由学习记录(194)

People of Note = 音乐剧式回合制 RPG。

a turn-based RPG set in a world with music as its very lifeblood

一个回合制 RPG,设定在一个"音乐就是生命血液"的世界里

DSLR = digital single-lens reflex camera

shutter speed = 快门速度

影响运动模糊、进光时间。快门慢,画面更容易亮,也会产生拖影/长曝光效果。

aperture = 光圈

影响进光量和景深。光圈大,背景更容易虚化;光圈小,前后都更清楚。

ISO = 感光度

影响亮度和噪点。ISO 高,画面更亮,但真实相机里噪点也可能更多。

white balance = 白平衡

控制画面偏冷还是偏暖。比如让白色在不同光源下仍然看起来像白色。

exposure comp settings = 曝光补偿设置

在自动/半自动曝光逻辑上,让画面整体更亮或更暗。

long-exposure effect = 长曝光效果

模拟真实相机长时间曝光时出现的视觉效果,比如车灯拉成光轨、水流变丝滑、移动物体留下残影。

that I believe is the first of its kind in Unreal

= 我认为这是 Unreal 里同类中的第一个。

不是说 Unreal 第一次有相机,也不是说 Unreal 不能做长曝光;他说的是他做的这个 游戏内可控的长曝光模拟效果,他认为在 Unreal 项目里比较首创。

console porting 里的 console 是:

游戏主机 / 家用游戏机平台

比如 PlayStation、Xbox、Nintendo Switch 这类。

porting 是:

移植

所以 console porting = 主机平台移植,意思是把原本可能主要在 PC / Unreal 开发环境里运行的游戏,适配到主机平台上。

UEFN 確實很像一個 Fortnite 專用版 UE / 類 Ark DevKit 。它不是完整自由的 Unreal Engine,而是被綁定到 Fortnite 規則、Fortnite 發布管道、Fortnite 玩家入口、Fortnite 資產與審核系統裡的創作工具。Epic 官方也把 UEFN 定義為「用來設計、開發並直接發布遊戲到 Fortnite 的 PC 應用」。Epic Games Developers

但它和 Ark DevKit 的本質差異在這裡:

Ark DevKit 是「某個遊戲的 Mod 工具鏈」。它的中心仍然是 Ark。你做的是 Ark 這個遊戲的內容擴展、地圖、模組、玩法修改。它像是:一個已存在遊戲開放了部分編輯權限。

UEFN/Fortnite 的方向是「把 Fortnite 變成內容平台」。它的中心不再只是 Battle Royale,而是 Discover、Creator Portal、島嶼發布、玩家流量、 engagement payout、Verse、IP 資產、商務、跨平台運行。官方說 UEFN 給你的是 build、launch、grow your game in Fortnite;Fortnite 開發者頁也明確說可以用 UEFN、Verse、Creative 工具在 PC、mobile、console 上 build、launch、publish games in Fortnite。Epic Games Store+1

所以你的困惑來自兩個視角衝突:

玩家視角:Fortnite = 一個遊戲。

創作者視角:Fortnite = 一個可以發布作品的容器。

Epic 戰略視角:Fortnite = 下一代遊戲/社交/品牌/IP/創作者經濟的平台入口。

跨遊戲的數位資產互通,是元宇宙敘事裡的一個技術/商業功能;元宇宙是更大的容器概念。

Metaverse / 元宇宙 說的是「這些互通世界共同形成的持續性空間」。

它不只是資產流通,還包括玩家身份、社交關係、內容發布、經濟系統、世界入口、平台治理、伺服器運行、內容審核、IP 授權、支付分潤。

Epic 真正想要的是把 Fortnite 變成某種「遊戲世界瀏覽器」。The Verge 對 2025 年 Unity/Fortnite 合作的報導也把它描述成 Fortnite 逐步成為 social and gaming hub,讓不同開發者的遊戲能在 Fortnite 裡被發現與參與經濟系統。

在 Epic Games Store 買某個第三方遊戲,獲得 Fortnite 物品。這是 Epic 現在推的重點,目的是讓 EGS 的購買行為和 Fortnite 的身份/外觀系統綁起來。Epic 官方的「Gift-with-Purchase」頁面也列出這類購買後可獲得 Fortnite 物品的活動。

未來的開發者既可以用 UE6 製作傳統的 3A 獨立大作,也能同時讓這些內容無縫接入元宇宙生態。

《Rocket League》(火箭聯盟)可以粗暴理解成:用火箭車踢足球的競技遊戲

它的基本玩法是:

兩隊玩家各自開一台可以加速、跳躍、飛起來的車,在一個封閉球場裡撞一顆巨大足球,把球打進對方球門。官方自己稱它是 "arcade-style soccer and vehicular mayhem",也就是街機足球 + 車輛混戰。

公開報導指向 Rocket League 會成為第一個被拿來展示/轉向 Unreal Engine 6 的 Epic 遊戲案例,而不是 Fortnite。原因很合理:Rocket League 現在技術底座很老,長期仍基於 Unreal Engine 3,所以它需要一次大遷移;拿它做 UE6 示範,比拿已經升到 UE5 的 Fortnite 更有「代際轉換」意義。

Epic 多遊戲生態整合層 :部分是。

Rocket League 本身有車、外觀、競技、跨平台帳號、live-service 經濟,這些都適合被納入 Epic 的大平台生態。它可以成為 Epic 測試「一個既有大型遊戲如何被新版引擎、外觀經濟、Fortnite 生態、帳號系統重新連接」的案例。

Open Metaverse 完整落地層 :還不是。

完整 Open Metaverse 應該意味著跨遊戲身份、資產、商務、發布、社交、治理都能互通。現在 Rocket League 更像是「第一個 UE6 化的代表遊戲」,不是「第一個完整開放元宇宙世界」。目前更明確的 Open Metaverse 落地信號反而是 Epic × Unity 合作:Unity 遊戲將能進 Fortnite,並參與 Fortnite Creator Economy;Unity 商務平台也會支援 Unreal Engine。這才更直接對應「不同引擎、不同開發者、同一入口、同一經濟系統」的互通方向。

單機老遊戲重製 = 把舊內容用新技術重新做一遍。
Rocket League 遷移 = 把一個仍在運轉的線上經濟體、競技體系、外觀資產庫,搬到 Epic 下一代技術棧裡。

所以它和生態有關,不是因為「換 UE6」這件事本身神聖,而是因為它會測試幾個生態級問題。

舊資產如何繼續活下去。Rocket League 有大量車身、輪胎、貼花、尾焰、特效、品牌聯動物品。如果遷移到新 UE 後,這些資產能被保留、升級、標準化,那就說明 Epic 有能力把老遊戲的資產庫轉成新平台可承認的資產系統。這和未來跨遊戲資產互通直接相關。

玩家身份和經濟如何不斷裂。你不是重開一個新遊戲,而是要讓玩家的庫存、排名、帳號、購買歷史、賽季進度、好友關係盡量延續。這就是平台能力,不是普通重製能力。

「樂高積木城堡」對應的是 Fortnite 生態裡的 LEGO Islands / LEGO Fortnite / UEFN LEGO 工具 。Epic 和 LEGO Group 有長期合作,LEGO 官方在 2023 年宣布《LEGO Fortnite》上線,並說雙方會把大量實體 LEGO 元件做成 digital twins,提供給 Fortnite 生態中的 UEFN 和 Fortnite Creative 創作者使用。LEGO Store

所以它和 Fortnite 的關係不是「Fortnite 裡剛好有個像樂高的材質包」,而是:

Fortnite 主程式 = 玩家入口。
LEGO Fortnite = Fortnite 裡的一組 LEGO 主題遊戲/體驗。
UEFN / Fortnite Creative = 創作者做 LEGO 島嶼的工具。
LEGO Brick Editor = 在 UEFN 裡一塊一塊搭 LEGO 的工具。

α 测试通常由用户或潜在用户在开发方控制的环境下进行。β 测试才更接近真实用户环境。

センター

center。MMD 里常见的中心骨,通常控制躯干整体位置,位置大概在骨盆/身体中心附近。

真正能在重定向里修改骨骼姿势的是 IK Retargeter 的 Retarget Pose Edit Mode

还在 Asset Settings 模式。这个模式只是设置 Source IK Rig、Target IK Rig、Preview Mesh、Offset、Root Lock 等资产参数,不是姿势编辑模式。

当前 Retargeter/IK Rig 配置处在不稳定状态,你一移动骨骼触发重算,UE 访问到异常骨骼数据或空 root,于是直接崩

IK Retargeter could not find source root bone

这不是普通警告。它说明 Retargeter 在运行时找不到 Source 侧的 Retarget Root。IK Retargeter 的正常前提是:Source IK Rig 和 Target IK Rig 都要有 Retarget Root,并且 Retargeter 要绑定这两个 IK Rig。官方的 IK Retargeter 流程也是先定义 Source/Target IK Rig,再进入 Edit Retarget Pose 做姿势校准。Epic Games Developers+1

你一移动骨骼时,系统会重新计算 Retarget Pose、chain mapping、root transform、post-process animation blueprint。现在 source root 为空,target 又是 MMD/PMX 这种带 全ての親 / 操作中心 / センター / IK親 / IK 的非 UE 标准骨架,崩溃概率就会变高。

不让 Manny 的后处理蓝图、Control Rig、IK 修正逻辑参与。Post Process ABP 会在预览阶段继续改 pose,你移动骨骼时它也可能参与求值,增加崩溃面。

打开 Manny/Mannequin 的 Source IK Rig。不要在 Retargeter 里修,去源 IK Rig 资产里修。Hierarchy 里选 Manny 的 root/pelvis。一般 UE Manny 有 rootpelvis 两层:如果官方 IK Rig 已经有 root 设置,沿用官方资产;如果你自己建的 IK Rig,通常先选 pelvisroot 测试,但必须保证它被设置成 Retarget Root。设置后保存。

WWDC26 是 Apple 的 2026 年 Worldwide Developers Conference,中文通常叫「苹果全球开发者大会」。

它不是普通发布会,而是 Apple 每年给开发者看的核心大会,主要公布下一代系统、开发工具、API、框架和平台方向。2026 年的 WWDC26 时间是 2026 年 6 月 8 日到 6 月 12 日 ,线上免费举行,开幕当天 Apple Park 也有线下特别活动。Apple Developer+1

对普通用户来说,WWDC26 重点通常是:

iOS、iPadOS、macOS、watchOS、tvOS、visionOS 的新版本;

Apple Intelligence / Siri / AI 功能的更新;

开发者工具,比如 Xcode、Swift、App Store、SDK、框架变化;

可能但不保证会有硬件发布。

对股民来说,WWDC26 的重点不是「今天卖了多少 iPhone」,而是看 Apple 有没有拿出能让市场相信的 AI 路线。Reuters 也提到,Apple 这次会展示平台更新、AI 进展和新的软件/开发者工具;背景是市场一直质疑 Apple 在 AI 上落后,尤其是 Siri 升级延迟。Reuters

所以 WWDC26 对 AAPL 股价的意义大概是:

如果 Apple 展示出可信的 AI、Siri、开发者生态升级,市场可能重新给 Apple AI 叙事估值。

外包适合做:

兼容性测试:大量手机、显卡、系统版本、分辨率。

重复性功能测试:安装、登录、支付、升级、卸载、基础流程。

本地化测试:多语言 UI 溢出、翻译上下文、文化问题。

Playtest 招募:找一批真实玩家玩,收集反馈。

压力/规模测试:多人房间、服务器负载、网络波动。

回归测试执行:按测试用例反复跑。

所以在 UE 项目里,工作对话可能是:

"技能距离是 0~1000cm,测一个 500 的正常值,再测 1000、1001。负距离理论上不会出现,但数据表里也加个非法值检查。"

这句话背后的测试术语就是:

500:有效等价类代表值。

1000:边界值。

1001:无效等价类代表值。

非法负数:异常输入 / 防御性测试。

他们更可能说:

"等级范围 1~90,正常值测一个,0 和 91 也测一下。"

而不是说:

"请覆盖一个有效等价类和两个无效等价类。"

他们会说:

"这个输入分三类:合法、太小、太大。"

而不是说:

"这里有一个 valid partition 和两个 invalid partitions。"

所以答案是:概念会用,术语不一定天天挂在嘴边。

超大企业,例如金融、电信、车载、医疗、政企软件,可能会更重流程。它们可能采用规模化敏捷框架。SAFe 官方定位就是帮助组织成为 Lean Enterprise、获得 Business Agility;IBM 对 SAFe 的解释也提到大型企业用 Agile Release Trains 协调多个小团队朝共同目标工作。Scaled Agile Framework+1

所以行业不同,答案不同:

公司类型 更像什么
互联网 App / SaaS Agile + CI/CD + DevOps/SRE
大型游戏公司 里程碑制 + X式迭代 + 独立 QA + 内容管线
金融/政企/医疗 W/V + 审批合规 + 自动化测试 + 部分敏捷
底层系统/芯片/车载 V/W 更重,验证更严格
超大多团队平台 SAFe/自研规模化敏捷 + Release Train
创业公司 粗糙 X 模型,快速做、快速测、快速改

静态测试:不运行程序,通过阅读、审查、分析发现问题。

这就是白盒测试的语言。资料里的设计题要求画控制流图,并按语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖设计用例,

决策表的价值是:

把一堆 if/else 组合摊平,让你知道每种业务规则有没有测试。

但公司里它不是废话,它解决的是一个管理问题:

一个 Bug 从被发现到被真正解决,中间有很多状态。如果没有状态,就没人知道它现在到底归谁管。

比如 QA 发现一个问题:

"角色闪避后偶尔无法攻击。"

如果没有生命周期,可能会变成:

测试说:我报了。

开发说:我没看到。

主程说:这不是我的模块。

策划说:这可能是设计。

测试说:修了吗?

开发说:我本地好了。

上线后又炸。

所以缺陷生命周期的真实作用是建立责任流转。

更完整的生命周期是:

New 新建 :测试发现问题,提交。
Confirmed 已确认 :确认这确实是 Bug,不是误报。
Assigned 已分配 :分给具体开发。
In Progress 修复中 :开发正在处理。
Fixed 已修复 :开发提交修复。
Ready for Test 待验证 :测试准备复测。
Verified 已验证 :测试确认修复有效。
Closed 关闭 :这个 Bug 生命周期结束。
Reopened 重新打开 :复测失败或后续又出现。
Rejected 拒绝 :不是 Bug。
Deferred 延期:是 Bug,但本版本不修。

Bug 不是一个人的记忆,而是团队资产。

QA:新角色大招后镜头无法恢复。

状态:New。

技术负责人确认:是 CameraManager 状态没有清理。

状态:Confirmed。

分配给玩法程序。

状态:Assigned。

开发修复并提交。

状态:Fixed。

QA 用同一测试用例复测。

状态:Verified。

再跑相关回归:切角色、死亡、过场、传送后镜头都正常。

状态:Closed。

如果修复后发现"死亡后镜头仍然卡住",就 Reopened。

1. 需求来了

例子:技能释放必须满足"有目标、距离足够、能量足够、角色没被控制"。

2. 设计测试方法

用决策表列条件组合。

用等价类划分距离和能量输入。

用边界值测 SkillRange - 1SkillRangeSkillRange + 1

用覆盖标准确认每个条件 true/false 都测到。

3. 写测试用例

Case 1:全部满足,技能释放。

Case 2:无目标,释放失败。

Case 3:距离超出,释放失败。

Case 4:能量不足,释放失败。

Case 5:角色眩晕,释放失败。

Case 6:距离刚好等于最大范围,释放成功。

Case 7:距离超过 1cm,释放失败。

4. 执行测试

手工执行,或者自动化执行。

5. 发现缺陷

比如 Case 7 失败:超过 1cm 仍然能释放。

6. 缺陷进入生命周期

New → Confirmed → Assigned → Fixed → Verified → Closed。

7. 加入回归/自动化

以后每次改技能系统,都自动跑这些用例,防止再坏。

决策表确实可以理解成一种"覆盖表" ,但它覆盖的不是代码语句、代码路径,而是业务规则中的条件组合

决策表 = 黑盒测试里的条件组合覆盖工具。

這套框架讓你直接用 C++ 代碼來撰寫「預期行為」。它不是去錄製螢幕畫面,而是直接呼叫你寫的 Class 或 API,並驗證結果是否正確。

  • Describe(描述) :用來定義你要測試的對象或情境(例如:某個函式 Execute())。

  • It(它應該...):定義具體的預期結果。文件提到一個好習慣是以 "should"(應該)開頭。

呼應你的說法,它的撰寫結構看起來就像這樣直接寫在代碼檔案(通常副檔名為 .spec.cpp)裡:

cpp 复制代码
Describe("當玩家使用治癒藥水時", [this]()
{
    It("生命值應該要增加 50 點", [this]()
    {
        // 直接呼叫代碼 API
        Player->UseItem(HealingPotion);
        // 驗證結果
        TestEqual("生命值正確", Player->GetHealth(), 100);
    });
});

文件裡提到了幾個將測試直接寫在 API 層級的好處:

  • 不輕易出錯(Less Brittle):獨立的模擬軟體如果遇到 UI 介面改版、按鈕換位置,測試就會直接崩潰。但測試內部的 API 邏輯,只要公開的介面(Public API)沒變,測試就不會壞。

  • 自我文件化(Self-documenting) :因為用了 DescribeIt 的語意化結構,測試跑完後的報告讀起來就像人類的句子(例如:Execute() should return true when successful),不管誰來看都能一眼搞懂這段代碼的「規格」。

  • 獨立性高 :每一個 It 都是一個獨立的測試案例,失敗時能精準定位是哪行代碼、哪個邏輯出錯,而不是只告訴你「外部模擬點擊時卡住了」。

3. 它還支援哪些進階功能?

雖然是寫在代碼裡,但它為了模擬複雜的遊戲運行環境,提供了很強大的擴充:

  • BeforeEach / AfterEach:在每個測試開始前初始化資料(如生成一個玩家),結束後清理乾淨。

  • 非同步與延遲執行(Async / Latent) :遊戲裡很多行為需要跑好幾影格(Frame)或等待網路回傳(例如查詢資料庫)。它支援 LatentIt,可以等代碼執行完並呼叫 Done.Execute() 後才結束測試,這在處理多執行緒或需要時間的遊戲邏輯時非常方便。

  • Debug Log(被動記錄器) : 就像是飛機的「黑盒子」或行車紀錄器。它本身不會主動去測試 任何東西,只有當你啟動遊戲、實際去玩、觸發了某行代碼時,它才會在畫面上或日誌裡印出一行字(例如:"Player health is 100")。你必須用肉眼去檢查這些 Log 是不是你想要的。

  • Automation Spec(主動斷言檢查器) : 它是一個主動出擊的監測系統 。你不需要真的打開遊戲去玩,測試框架會自己模擬出代碼運行的環境,直接呼叫那個 API,並用 TestTrueTestEqual 這類「斷言(Assertion)」去強行驗證結果。如果結果不對,它會直接亮紅燈報警。

2. 為什麼說它是「深度 UE 綁定」?

你說得非常對,它確實是「深度 UE 綁定」。Web 開發(例如 JavaScript/Jest)的測試框架只能測試純粹的邏輯資料;但 UE 的 Automation Spec 除了能測試純 C++ 邏輯外,還深度整合了 Unreal Engine 的底層特性:

  • 影格與時間綁定(Latent Actions) :遊戲裡很多事情不會在 1 毫秒內結束(例如角色放技能、生成特效、UI 淡出)。UE 的 Spec 支援 LatentIt,可以讓測試代碼「等待幾個影格」或「等待特定秒數」後,再檢查 API 的狀態。

  • 執行緒與任務圖(Task Graph)綁定:它可以指定某個測試區塊要在遊戲主執行緒(Game Thread)跑,還是要在渲染執行緒、甚至後台異步執行緒(Render/Worker Thread)跑,這是一般網頁測試軟體做不到的。

  • 編輯器與遊戲世界綁定 :它可以命令引擎在後台偷偷生成一個虛擬的 UWorld、塞入幾個 AActor(例如怪物和玩家),讓它們互相施放技能,測試完後自動把這個虛擬世界銷毀,完全不著痕跡。

速度極快(省去載入地圖的時間)

在正常開發中,如果你要測試「怪物會不會被牆壁擋住」,你得:打開 UE 編輯器 \\rightarrow 點擊 Play \\rightarrow 等待場景、UI、特效載入 \\rightarrow 把怪物拉到牆壁前 \\rightarrow 觀察結果。這可能要花上好幾十秒甚至幾分鐘。

但在 Automation Spec 裡,因為這個 UWorld 是純代碼在記憶體裡建立的,沒有圖形渲染、沒有沉重的地圖資產、沒有音效 。執行這整個測試可能只需要幾毫秒(0.001 秒)。你可以一秒鐘跑完幾百個這種世界級的測試。

自動化與持續整合(CI/CD)

因為這個過程不需要真的開起遊戲視窗,它可以在「命令列模式(Command Line)」下默默執行。這意味著你可以把它部署在公司的伺服器上。每天晚上半夜,伺服器會自動拉下最新的代碼,在後台瘋狂創建幾千個虛擬 UWorld 來測試各種戰鬥、技能、AI 邏輯,隔天早上直接把「亮紅燈」的錯誤報告寄給工程師。

解决的是一个宿主渲染差异问题:PMX/MMD 的材质系统不是 Blender 的节点材质系统。MMD 里一个材质通常由这些东西组成:

普通贴图:base texture / diffuse texture

toon texture:模拟卡通阴影阶梯

sphere texture:类似环境反射、MatCap、叠加高光的效果

材质参数:diffuse、specular、ambient、alpha、edge、double-sided 等

节点逻辑:在 MMD 里是固定渲染器解释,不是 Blender Shader Node Graph

但 Blender 5.1 里,材质主要通过节点表达。官方文档里 Principled BSDF 是一个把多层材质属性合到单个通用 shader 节点里的模型,可以表达大量常规材质。也就是说,Blender 的标准入口是 Material Output ← Principled BSDF ← 贴图/参数 这一套节点体系。

Subsurface:转换时给 Principled BSDF 的 Subsurface 一个值,通常用于皮肤半透感;你这里是 0,等于不加皮肤 SSS。

普通图形学的角色资产通常是:

Mesh 网格 → Material 材质 → Skeleton 骨架 → Skin Weight 蒙皮 → Animation 动画 → Renderer 渲染

MMD/PMX 角色多出来的特殊层是:

MMD Bone 语义 → IK 规则 → Morph 表情/材质变形 → Rigid Body 刚体 → Joint 物理约束 → Toon/Sphere 非 PBR 材质 → Helper/Temporary 转换对象

所以你看到的这些不是"一个模型的一部分"这么简单,而是 MMD 生态为了让角色在 MikuMikuDance 里直接跳舞、甩头发、飘裙子、动表情而设计的完整角色运行时结构。

Rigid Body 刚体

传统图形学里,刚体是物理模拟概念:一个不会变形的碰撞对象,有质量、碰撞形状、阻尼、摩擦、反弹等。MMD 的特殊点是:它不是为了真实物理,而是为了角色二次元表演服务。头发、裙摆、袖子、饰品通常不是布料模拟,而是一串串小刚体加约束。也就是用"很多小硬块 + 关节限制"伪装出柔软运动。

这和 UE/Unity 里的 Ragdoll、Physics Asset 很像,但 MMD 的目标更窄:让头发和裙子在舞蹈动画里便宜、稳定、可控地摆动。

Joint 约束

Joint 是刚体之间的限制关系。它规定两个刚体之间能不能拉开、能不能旋转、旋转角度范围是多少、有没有弹簧回弹。传统物理里这就是 constraint / joint solver。MMD 特殊点在于它大量用在头发、裙子、飘带上,而不是用真实布料网格求解。

mmd_tools 手册里还提到,Blender 和 MMD 的刚体碰撞组逻辑不同:Blender 更偏"哪些组互相碰撞",MMD 是"哪些组不碰撞的 mask"。mmd_tools 为了模拟 MMD 的非碰撞逻辑,会生成 temporary/ncc* 约束来禁用某些刚体之间的碰撞,因此会比 Blender 普通刚体模拟更慢。MMD & Blender Wiki

MMD 的设计目标更窄:它主要服务于"角色舞蹈模型"。它关心的是头发、裙子、胸部、袖子、飘带、身体这些部件之间怎么避免穿模、怎么保留二次元角色的表演稳定性。所以 PMX 里的刚体组逻辑很自然地变成:

"这个刚体属于某组;它不应该和哪些组发生碰撞?"

也就是排除表 。这对角色很方便,因为一个角色模型里常见需求是:裙子内部刚体彼此不要撞,头发链条内部不要互相炸,身体/腿/手和衣物要有选择地互动。很多时候,默认是"大家可以碰",然后局部标记"不许碰"。LearnMMD 对裙子物理的解释也是这种思路:某些裙子刚体设置成同一类非碰撞组,因此它们彼此不互动,但身体刚体不在它们的非碰撞排除里,所以腿碰到裙子时裙子仍会动。Learn MikuMikuDance

Blender 的设计目标更宽:它不是专门为了 MMD 角色物理做的,而是一个通用 DCC。刚体系统要服务积木、建筑倒塌、道具、碎片、机械、抽象动画、物理摆拍等。Blender 的 Rigid Body World 本质上是一个场景级物理世界,文档里也说它保存一组参与同一刚体模拟的对象,并提供统一设置。Blender Documentation 这种系统更倾向于问:

"这个对象参与哪些碰撞组?"

也就是包含表 / 允许表 。Blender 手册旧版说明中也把 Collision Groups 描述为把刚体碰撞分配到不同组,最多 20 组。Blender Documentation

这两个表达在数学上看似可以互相转换,但在软件工程上不是同一个东西。

假设有 16 或 20 个碰撞组。

MMD/PMX 的逻辑像这样:

对象 A 属于组 3。

A 的 mask 勾掉组 5、组 8。

意思是:A 不和 5、8 碰;其他默认可以碰。

Blender 的逻辑更像:

对象 A 被放入某些可碰撞组。

只有组关系允许时才参与碰撞。

看起来只是"取反"而已,但问题在于:MMD 的 mask 是每个刚体自己的排除关系;Blender 的碰撞组是物理系统提供的组过滤能力。两者不是同一粒度。

MMD 是"每个刚体携带一张黑名单"。

Blender 是"物理世界根据组来决定谁可能相互作用"。

这就像权限系统里:

MMD:默认允许,逐项 deny。

Blender:默认按组 allow。

通用 3D 动画/VFX/motion graphics 的人。

他们经常不是在维护一个"角色内部物理格式",而是在做一段效果:

一堆方块掉下来。

一面墙被撞碎。

一串机械零件互相铰接。

几个道具在桌面上滚动。

物体受风场、力场、动画关键帧、约束共同控制。

对这类用户来说,最自然的是:

"我先选一批对象,把它们加入模拟。"

"我再把某些对象设为 Active,某些设为 Passive。"

"我再用约束控制它们之间的关系。"

Blender 的刚体约束也正是这种通用物理/机械连接语义:Fixed、Point、Hinge、Slider、Piston、Generic、Generic Spring 等类型,都是面向"两个刚体之间如何连接/限制"的通用物理关系。Blender Documentation+1

第三类是做道具、机械、关卡原型、物理摆拍 的人。

他们通常关心的是对象作为"场景物体"的行为,而不是角色资产内部的 PMX mask 规则。比如:

门铰链。

吊灯摆动。

箱子堆叠。

机关滑轨。

弹簧连接。

小球碰撞。

破碎物件。

这种人群的习惯是"按对象/collection/约束组织场景"。Blender 的 collection 体系本来就是组织场景对象的核心工具,所以刚体世界也顺着这个体系走:把参与模拟的对象放进 RigidBodyWorld collection,把约束放进 Constraints collection。Blender Documentation

第四类是 Blender 传统用户,也就是先有场景对象,再给对象加物理 的人。

这和 MMD 的逻辑不同。

MMD/PMX 更像:

"这是一个角色模型文件。"

"角色里面已经有骨骼、刚体、joint、碰撞组 mask。"

"导入后应该保持角色内部物理关系。"

Blender 更像:

"这里有一堆 mesh object。"

"我给某些 object 加 rigid body。"

"我把它们放入某个 Rigid Body World。"

"它们作为场景对象参与模拟。"

所以 Blender 的 rigid body 不是先问"这个角色部件禁止和谁碰撞",而是先问"哪些对象进入这套模拟世界"。这更顺 Blender 用户对 scene / object / collection 的操作习惯。

第五类是Bullet/通用物理引擎思维的人

Blender 的刚体系统历史上基于 Bullet 物理。Bullet 这类通用物理引擎的常见抽象是:

collision object

collision shape

world

constraint

activation

filter group / filter mask

simulation step

这套语言服务的是"物理世界里有很多对象,逐步求解它们的运动和碰撞"。它不天然服务"角色模型内部的裙子/头发/身体排除表"。所以 Blender 的 UI 最终会更接近通用物理引擎的组织方式,而不是 PMX 的角色资产格式。

在 Blender 中使用 mmd_tools 外掛時,Separate by Materials(依材質分離模型)功能位於 3D 視圖的側邊欄(Sidebar)中。

你可以按照以下步驟找到它:

📌 尋找步驟

  1. 在 3D 視圖(3D Viewport)中,按下鍵盤上的 N打開右側的側邊欄。

  2. 在側邊欄的分頁標籤中,點選 MMD

  3. 找到 MMD ‣ Model Setup(模型設定)面板。

  4. 展開下方 的 Mesh(網格) 子項目,你就能看到 Separate by Materials 按鈕了。


💡 提示與注意事項

  • 使用前準備: 點擊該按鈕前,請先在場景或大綱視圖(Outliner)中選取你的 MMD 模型(通常是選取網格物件),否則該功能將無法對正確的物件作用。

  • 功能效果: 預設情況下,匯入的 MMD 模型是一個單一物件。點擊 Separate by Materials 後,外掛會自動將模型依不同的材質拆分成多個獨立的網格物件。

  • 如何復原: 如果之後你想把拆分好的網格重新合併回去,可以點擊同一個位置下方的 Join 按鈕。

相关推荐
叶~小兮2 小时前
Jenkins构建生产CICD环境学习笔记
笔记·学习·jenkins
zycoder.2 小时前
rabbitmq学习demo,包含普通消息,TTL+死信队列,topic交换机三种情况,以项目形式讲解
分布式·学习·rabbitmq
星夜夏空992 小时前
STM32单片机学习(34) —— ADC实验: ADC规则组配合DMA实现自动化转运
stm32·单片机·学习
Realdagongzai2 小时前
Linux 6.19.10 内核调度器算法详解
linux·学习·算法·spring·kernel
xxl大卡2 小时前
Redis完整详细学习笔记
redis·笔记·学习
星夜夏空992 小时前
FreeRTOS学习(1)——裸机开发与操作系统
单片机·嵌入式硬件·学习
Cat_Rocky3 小时前
CICD-Git简单学习 操作流程后续补
git·学习
weixin_550083153 小时前
基于知识图谱的python个性化学习路径推荐系统项目源码
人工智能·学习·知识图谱
魔法阵维护师3 小时前
从零开发游戏需要学习的c#模块,第二十七章(远程攻击 —— 发射子弹)
学习·游戏·c#