为角色的大腿、手臂、小肚子增加“肉感物理”:肉随动作自然滞后摆动, 类似胸部/臀部物理的手感。不修改角色数据文件,不改骨骼缩放, 尽量保持角色卡片原本的体型。
- 三个部位独立调参:Thigh(大腿)、Arm(手臂)、Belly(小肚子)
- 两套物理系统可切换:弹簧系统(日常跟手)与链式系统(跳舞增强)
- 默认简单 UI 只需调 强度 / 柔软度 / 动作响应 三项,完整参数可在高级模式展开
- 每根肉感骨骼独立控制:开关、振幅(Amp)、旋转(Rot)、 旋转计算(RC,默认开启)、XYZ 轴冻结
- Dance response(0~5):增强 VMD 跳舞抖动,弹簧/链式共用同一倍数
- 参数实时可调,随角色卡自动保存(GUID 不变,旧卡数据兼容)
- 新角色默认使用从实际常用参数提炼的部位独立基线,支持保存/加载 XML 预设
- 一键
Clear shape还原卡片原始体型 - 面板带输入屏蔽,不会点击穿透到游戏视角
- 把压缩包里的
BepInEx\plugins\ThighPhysicsController\整个文件夹 覆盖到游戏根目录的BepInEx\plugins\下(同名文件夹直接合并)。 - 启动
CharaStudio.exe(或Koikatu.exe)。 - 加载任意角色卡,按
Insert打开面板。
插件文件夹与 DLL 沿用
ThighPhysicsController名称是兼容性考虑; 插件显示名与游戏内面板标题统一为英文Flesh Physics Controller。
Insert:开关面板。- 面板顶部选择角色,中部用
Thigh / Arm / Belly切换部位。 Thigh physics enabled(或 Arm/Belly):该部位物理总开关,默认开启。- 所有滑条拖动实时生效,改动会随角色卡自动保存。
面板默认只显示三个手感参数:
强度 Strength:控制当前物理模式的整体作用量;柔软度 Softness:一次联动阻尼、惯性、回弹、刚性和频率,并按大腿、手臂、 小肚子使用不同曲线;动作响应 Motion response:控制走动、转身和舞蹈动作传给肉感骨骼的幅度。
简单 UI 还提供整套身体预设,一次应用到大腿、手臂和小肚子:
稳定日常 Spring:明确切到弹簧,较紧、幅度较小,适合日常和首次使用;常用自然 Chain:明确切到链式,采用用户常用参数,也是新角色默认;舞蹈增强 Chain:明确切到链式,使用柔软端点与更高动作响应,适合 VMD 大动作。
需要逐骨 Amp、RC、XYZ 轴或直接编辑求解器参数时,再勾选 Advanced 高级。
面板里有一个开关:
舞蹈链式模式(关闭 = 日常弹簧模式)
- 不勾选 = 弹簧系统;
- 勾选 = 链式系统(新角色常用基线默认)。
两个系统拥有完全独立的参数集,互不串扰:
- 弹簧系统:使用上方的
Weight / Gravity+Bone Thigh flesh (shared)参数区 (Damping / Elasticity / Stiffness / Inert),每骨参数用Bones; - 链式系统:使用
Chain mode parameters参数区,每骨参数用ChainBones。
| 参数 | 范围 | 弹簧基线 | 链式基线(大腿/手臂/小肚子) | 作用 |
|---|---|---|---|---|
| Weight | 0 ~ 1 | 0.8 / 0.7 / 0.7 | 0.9 / 0.7 / 0.7 | 肉感整体强度 |
| Gravity | -0.2 ~ 0.2 | 0.05 | 0.05 | 下垂感,正数向下垂 |
| Damping | 0 ~ 1 | 0.18 | 0.04 / 0.05 / 0.30 | 运动阻尼,越大越安静 |
| Elasticity | 0 ~ 1 | 0.10 | 0.05 / 0.25 / 0.25 | 弹性回中力度 |
| Stiffness | 0 ~ 1 | 0.12 | 0.85 / 0.90 / 0.90 | 刚性/长度保持 |
| Inert | 0 ~ 1 | 0.35 | 0.80 / 0.80 / 0.40 | 惯性滞后,越大甩得越明显 |
| Dance response | 0 ~ 5 | 1 | 1 | 舞蹈/动作响应倍数(两系统统一) |
| Jitter freq | 0 ~ 2.5 | 1 | 0.20 / 0.15 / 1.00 | 抖动频率:越高回弹越快、抖动越密;0 为完全自由 |
| Motion smooth | 0.05 ~ 0.5 | 0.25 | — | 弹簧响应平滑:越小越柔、越不抖 |
每根骨(Per-bone: Amp / Rot / RC / Axis):
Amp:该骨摆动幅度;Rot:非 RC 骨骼的平滑旋转幅度(默认 0.25);RC:RotCalc,让骨骼朝下一根肉感骨方向瞄准旋转(默认开启);X / Y / Z:对应轴的振幅,设 0 等于冻结该轴,也可以输入 0.5 做半衰减。
- 旧版附带的
Soft / Realistic / Exaggerated已从发布包移除;旧 XML 仍可手动读取; - 简单 UI 的
稳定 / 自然 / 舞蹈是当前受测试保护的推荐预设; Save preset:输入名字保存(自动补.xml,不会写出预设目录);Load preset:加载列表中选中的预设;Load from file...:从外部任意位置加载 XML 预设;Clear shape (restore card defaults):一键还原卡片原始体型;Reset to defaults:把当前部位参数恢复为插件默认值。
BepInEx\config\codex.koikatumanager.thighphysicscontroller.cfg
Window key:面板快捷键(默认 Insert);Auto apply on load:角色加载时自动应用(默认 true);Force enable:即使卡片禁用了物理也强制开启(默认 true);Remember per-character settings:按角色记忆本次会话的参数, 同场景同名同性别角色自动同步(默认 true);Auto fix spring drift:弹簧模式后台慢速纠偏,把跳舞中误固化的基准 拉回卡片原始姿态,防止大腿越跳越变形(默认 true);Log flesh physics:每 2 秒输出一次物理偏移日志(调试用);Dump skeleton bones:启动时转储骨骼层级(调试用)。
- 角色列表按 女性角色 / 男性角色 分组显示(
#序号 名字), 同名男女不会再混在一起; - 选中角色按实例记忆,场景里增删角色不会跳到另一个人身上;
- 参数按“名字 + 性别 + 性格”记忆(本次游戏会话内),换人/换场景再回来 会恢复上次的手感,而不是恢复默认或重新读 XML;
- 同场景里同名同性别角色自动共享同一套参数:设置一次,其他同名角色同步生效;
- 角色卡保存时参数仍会写回卡片;记忆只在本会话有效,重启游戏后从卡片/默认值开始。
弹簧系统把每根肉感骨当成一个“粒子”:父关节一动,粒子按父关节的 加速度、角速度和基准位移获得滞后速度,再由弹簧拉回基准位置。
特点:跟手、响应快,抖动频率高、细节细碎,适合日常走路、转身、挥手、 H 场景这类自然动作;需要这种感觉时可在简单 UI 关闭链式模式。
主要参数:Weight(整体强度)、Gravity(下垂)、Damping(阻尼)、
Elasticity(回中)、Stiffness(刚性)、Inert(惯性),
加上每骨 Amp / Rot / RC / Axis。
链式系统移植自游戏 DynamicBone_Ver02 的粒子链算法:根粒子锁定在锚点骨骼上, 子粒子逐个做弹簧 + 长度约束,锚点的位移和旋转驱动整条链滞后。
特点:低频、滞后明显、拖尾长,动作幅度越大越有“肉甩起来”的感觉, 专门用于 VMD 跳舞增强。
链式有独立的参数集(Chain mode parameters)和独立的每骨参数(ChainBones),
不占用弹簧滑条。实现上带有几项保护:
- 长度约束收紧(Stiffness=1 保持原骨长),不再出现“橡皮泥”式拉伸;
- 锚点位移限幅 0.30m,避免其它插件(如 BPC)放大骨盆运动时把链拉飞;
- 每帧按当前骨骼姿态刷新静止方向/长度,兼容 KKABMX 的骨骼缩放;
- 小肚子链刻意排除了
cf_s_waist02结构骨,跳舞时不会撕皮肤/身体消失。
| 对比项 | 弹簧系统 | 链式系统 |
|---|---|---|
| 物理模型 | 单粒子弹簧回中 | 链式粒子 + 长度约束 |
| 参数集 | 共享参数 + Bones |
Chain 参数 + ChainBones(独立) |
| 驱动来源 | 父关节加速度 / 角速度 / 位移 | 锚点位移 / 锚点角速度 |
| 手感 | 高频跟手、细节细碎 | 低频大幅拖尾 |
| 适合场景 | 日常动作、自然写实 | VMD 跳舞、大幅摆动 |
| 舞蹈响应 | 统一倍数(默认 1=1x) | 统一倍数(参考系数 0.000384) |
| 每骨控制 | Bones(Amp/Rot/RC/Axis) |
ChainBones(Amp/Rot/RC/Axis) |
| 兼容性 | 常规 | ABMX 每帧刷新 + 锚点限幅 |
- 想要“自然一点、随时跟手”:用弹簧系统;
- 想要“跳舞时明显甩肉、拖尾”:用链式系统,并把 Dance response 开到 1~3;
- 两者可以随时切换,参数各自保留,不会互相覆盖。
按上文“安装”完成部署 → 启动 CharaStudio → 加载角色卡 → 按 Insert。
如果面板显示 No characters loaded,先在工作室里加载一个角色。
- 确认三个部位的物理开关已勾选;
- 日常先点
稳定日常 Spring,VMD 大动作先点舞蹈增强 Chain,想恢复常用默认点常用自然 Chain; - 若仍需微调,选择对应部位,先调
强度到合适幅度; - 再调
柔软度:向右更滞后、更松软,向左更快停、更紧实; - 最后用
动作响应微调动作传给肉感骨骼的幅度。
- 勾选链式:低频、拖尾明显,当前常用基线与 VMD 舞蹈优先;
- 关闭链式:响应更快,适合想要细碎跟手的日常动作;
- 切换时插件会先清除旧模式形变,再以当前角色姿态重新初始化;
- 只有简单参数无法解决某根骨或某个轴的问题时,才打开高级模式。
Per-bone: Amp / Rot / RC / Axis (0 = freeze)区域列出该部位所有肉感骨;- 勾选某根骨后调
Amp控制摆动幅度;X/Y/Z 任一设 0 表示该轴冻结; - 想让骨骼朝下一根肉感骨方向旋转:
RC默认已勾上,取消即关闭; - 不勾 RC 时,
Rot滑条提供基于偏移的平滑旋转(默认 0.25)。
- 调好参数后,在 Presets 区输入名字(例如
MyDance.xml),点Save preset; - 下次点
Load preset,或从外部Load from file...载入; - 想回到卡片原始体型:点
Clear shape (restore card defaults)。
- 面板没反应:确认角色已加载、部位开关已打开;
查看
output_log.txt是否有Flesh physics initialized; - 跳舞不抖:确认
Dance response> 0;链式效果比弹簧明显; - 身体消失/皮肤撕裂:确认小肚子链不含
cf_s_waist02(0.8.0 起已排除); 如出现,点Clear shape后重新Apply now; - 开调试日志:把配置里
Log flesh physics设为 true, 每 2 秒会输出Flesh physics [骨骼名]: applied=... mag=... rot=..., 链式模式输出chain applied=... anchor=... amp=...。
- 简单 UI 把容易误解的反向勾选框改为
日常弹簧 Spring / 舞蹈链式 Chain两个 明确模式按钮;三个整套预设的按钮名也直接标明会使用的求解器; 稳定日常现在真正切换到 Spring;常用自然和舞蹈增强使用 Chain。 Stable 三部位实机门禁已验证为 Spring,零重置、零重锚;- 回归脚本支持指定角色卡与标签,新增跨卡体型矩阵门禁,已覆盖两张女性卡和一张 Bulky 男性卡的 Chain,以及女性/男性 Spring。
- 两种求解器都已通过五档柔软度和 30/60/高帧率回归;简单柔软度从紧到软保持 可解释的单调响应,不再需要用户手动配平一组底层参数;
- Spring 修复硬档伪振动:阻尼不再被内部截到 0.20,动态围绕重力平衡点积分, 简单映射不会把旧频率参数推入注能区;
- 统一异常、瞬移、禁用与重锚状态复位,减少重复代码和残留状态。
Jitter freq下限从 0.2 放开到 0(弹簧/链式、卡片与预设读取同步), 想要更自由、更“甩”的手感可以把频率调到 0~0.2。
- 小肚子链移除
cf_s_spine03(上段脊柱,刚性骨,不应抖动),只保留cf_s_waist01;链式模式新增单粒子链支持,小肚子在弹簧/链式下都能正常摆动; - 小肚子每骨参数区现在只有
waist01一行。
- 修复部件切换失效:Thigh/Arm/Belly 改用显式按钮,避免面板停在错误部位 (选小肚子却显示手臂骨骼名的症状即由此引起);
- 每骨参数区标题标注当前模式(Spring/Chain);
- 小肚子链固定为
cf_s_waist01 + cf_s_spine03(spine03 是上段脊柱, 视觉上接近肩背,但属于小肚子链的一部分,不是肩臂骨)。
- 开放新参数并真实接入物理(随卡片/预设保存):
- 弹簧:
Jitter freq(抖动频率,缩放弹簧回弹速度与弹性回中)、Motion smooth(响应平滑,控制加速度/角速度滤波,越小越柔); - 链式:
Jitter freq(抖动频率,缩放刚度/弹性修正);
- 弹簧:
- 卡片数据版本升至 55(旧卡缺失字段自动用新默认值,GUID 不变)。
- RC(RotCalc)默认全开:新建参数与三档代码预设的每骨 RC 默认都为 true (弹簧与链式一致),旧卡已存值不受影响;
- 修复“关闭后腿部仍变形/清除无效”:部位开关关闭时物理立即恢复骨骼姿态; 链式模式下禁用的骨骼位置+旋转完全复位;移除物理前先复位骨骼, 避免重新启用后把变形姿态当“原始姿态”固化;
- 链式 RC 不再旋转已禁用的骨骼,避免关掉某根骨后它仍被上/下一根骨带动;
- 弹簧模式防积累:重锚检测改为父空间局部判定(父骨旋转不再把偏移固化进基准), RC 改为基准旋转 + ±12° 限幅(消除跳舞反馈扭曲),并内置后台慢速纠偏 (检测到基准偏移持续 2 秒且无外部改写时,以 0.03m/s 量级拉回卡片姿态), 正常抖动不受影响,可在配置中关闭;
- 完整历史见包内
CHANGELOG.md。
- Dance response 上限从 3 放开到 5(UI、卡片读取、预设读取三处同步),默认仍 1;
- 弹簧减抖(0.8.5 当时实现):默认 Weight 0.8→0.7、Damping 0.03→0.12、Inert 0.35→0.30; 加速度平滑 0.45→0.25、X/Z 增益 1.5→1.25、驱动系数 0.0003→0.00025、 当时的弹簧速度阻尼下限为 0.8;当前版本已由 0.8.10.0 的完整阻尼映射替代;
- 链式增强:默认 Weight 0.7、Damping 0.30、Inert 0.40;舞蹈驱动系数 0.000384→0.0006,切向限幅 0.03→0.05、速度限幅 0.16→0.22, Dance response 调到 2~5 时拖尾更明显;
- 多角色场景:角色列表按女性/男性分组显示;选中按实例记忆,增删角色不串人,
点击行直接切换(不再用选择网格);
参数按“名字+性别+性格”会话内记忆,同名同性别角色自动同步;
OnReload尊重maintainState,场景刷新/换装不再强制重置参数; - 兼容:移除 KKAPI 最低版本限制(
[BepInDependency("marco.kkapi")]), 低版本 KKAPI 环境也能加载。
- 插件显示名与游戏内面板标题统一为英文
Flesh Physics Controller(GUID 不变,旧卡兼容);文件对话框、配置描述、日志前缀同步统一; - Dance response 在弹簧/链式之间统一倍数:默认参数下 1=1x、2=2x、3=3x, 调 Weight/Inert 时两种模式按同一公式缩放,默认手感不变;
- README 重写:新增使用方法、弹簧/链式对比与分步教程。
- GUID:
codex.koikatumanager.thighphysicscontroller(不可变) - 版本:0.8.11.0
- 显示名:Flesh Physics Controller
- 卡片数据版本:56
- 依赖:KKAPI
marco.kkapi(不限制最低版本) - Harmony 补丁仅用于输入屏蔽:
Input.GetAxis / GetAxisRaw / GetMouseButton / GetMouseButtonDown / GetMouseButtonUp
- 0.8.7.0 起不再在内存或新卡/新预设中写入旧版未使用字段;旧卡/旧 XML 中的
CollisionRadius等额外数据会被安全忽略。 - 链式模式下
Rot与RC均生效:非 RC 骨骼用 Rot 做平滑旋转, RC 骨骼优先瞄准。 - 内部类名/程序集名/插件目录沿用
ThighPhysicsController,仅为了兼容安装路径。 - 角色参数记忆仅限本次游戏会话;跨重启请保存卡片或使用预设 XML。