add:live2d增加可切换的男性角色

This commit is contained in:
rainv123
2026-01-30 17:59:06 +08:00
parent e3088f4410
commit ba2749430f
52 changed files with 20497 additions and 29 deletions
+338 -20
View File
@@ -12,7 +12,42 @@ class Live2DManager {
this.audioContext = null;
this.analyser = null;
this.dataArray = null;
this.lastEmotionActionTime = null; // 上次情绪触发动作的时间
this.lastEmotionActionTime = null;
this.currentModelName = null;
// 模型特定配置
this.modelConfig = {
'hiyori_pro_zh': {
mouthParam: 'ParamMouthOpenY',
mouthAmplitude: 1.0,
mouthThresholds: { low: 0.3, high: 0.7 },
motionMap: {
'FlickUp': 'FlickUp',
'FlickDown': 'FlickDown',
'Tap': 'Tap',
'Tap@Body': 'Tap@Body',
'Flick': 'Flick',
'Flick@Body': 'Flick@Body'
}
},
'natori_pro_zh': {
mouthParam: 'ParamMouthOpenY',
mouthAmplitude: 1.0,
mouthThresholds: { low: 0.1, high: 0.4 },
mouthFormParam: 'ParamMouthForm',
mouthFormAmplitude: 1.0,
mouthForm2Param: 'ParamMouthForm2',
mouthForm2Amplitude: 0.8,
motionMap: {
'FlickUp': 'FlickUp',
'FlickDown': 'Flick@Body',
'Tap': 'Tap',
'Tap@Body': 'Tap@Head',
'Flick': 'Tap',
'Flick@Body': 'Flick@Body'
}
}
};
// 情绪到动作的映射
this.emotionToActionMap = {
@@ -67,10 +102,33 @@ class Live2DManager {
const currentPath = window.location.pathname;
const lastSlashIndex = currentPath.lastIndexOf('/');
const basePath = currentPath.substring(0, lastSlashIndex + 1);
const modelPath = basePath + 'hiyori_pro_zh/runtime/hiyori_pro_t11.model3.json';
// 从 localStorage 读取上次选择的模型,如果没有则使用默认
const savedModelName = localStorage.getItem('live2dModel') || 'hiyori_pro_zh';
const modelFileMap = {
'hiyori_pro_zh': 'hiyori_pro_t11.model3.json',
'natori_pro_zh': 'natori_pro_t06.model3.json'
};
const modelFileName = modelFileMap[savedModelName] || 'hiyori_pro_t11.model3.json';
const modelPath = basePath + 'resources/' + savedModelName + '/runtime/' + modelFileName;
this.live2dModel = await PIXI.live2d.Live2DModel.from(modelPath);
this.live2dApp.stage.addChild(this.live2dModel);
// 保存当前模型名称
this.currentModelName = savedModelName;
// 更新下拉框显示
const modelSelect = document.getElementById('live2dModelSelect');
if (modelSelect) {
modelSelect.value = savedModelName;
}
// 设置模型特定的嘴部参数名
if (this.modelConfig[savedModelName]) {
this.mouthParam = this.modelConfig[savedModelName].mouthParam || 'ParamMouthOpenY';
}
// 设置模型属性
this.live2dModel.scale.set(0.33);
this.live2dModel.x = (window.innerWidth - this.live2dModel.width) * 0.5;
@@ -364,33 +422,88 @@ class Live2DManager {
if (internal && internal.coreModel) {
const coreModel = internal.coreModel;
// 获取音频分贝值
let mouthValue = 0;
let mouthOpenY = 0;
let mouthForm = 0;
let mouthForm2 = 0;
let average = 0;
if (this.analyser && this.dataArray) {
this.analyser.getByteFrequencyData(this.dataArray);
average = this.dataArray.reduce((a, b) => a + b) / this.dataArray.length;
// 优化音量映射函数,使中等音量范围变化更明显
// 使用S形曲线函数,在中等音量范围有更好的响应
const normalizedVolume = average / 255;
// S形曲线:在0.3-0.7范围内有最大的斜率(变化最明显)
if (normalizedVolume < 0.3) {
// 低音量:缓慢增长
mouthValue = Math.pow(normalizedVolume / 0.3, 1.5) * 0.3;
} else if (normalizedVolume < 0.7) {
// 中等音量:线性增长,变化最明显
mouthValue = 0.3 + (normalizedVolume - 0.3) / 0.4 * 0.5;
} else {
// 高音量:缓慢接近最大值
mouthValue = 0.8 + Math.pow((normalizedVolume - 0.7) / 0.3, 1.2) * 0.2;
// 获取模型特定的阈值
let lowThreshold = 0.3;
let highThreshold = 0.7;
if (this.currentModelName && this.modelConfig[this.currentModelName]) {
lowThreshold = this.modelConfig[this.currentModelName].mouthThresholds?.low || 0.3;
highThreshold = this.modelConfig[this.currentModelName].mouthThresholds?.high || 0.7;
}
// 确保嘴部参数在0-1范围内
mouthValue = Math.min(Math.max(mouthValue, 0), 1);
// 使用模型特定的阈值进行映射
let minOpenY = 0.1;
if (this.currentModelName && this.modelConfig[this.currentModelName]) {
minOpenY = this.modelConfig[this.currentModelName].mouthMinOpenY || 0.1;
}
if (normalizedVolume < lowThreshold) {
mouthOpenY = minOpenY + Math.pow(normalizedVolume / lowThreshold, 1.5) * (0.4 - minOpenY);
} else if (normalizedVolume < highThreshold) {
mouthOpenY = 0.4 + (normalizedVolume - lowThreshold) / (highThreshold - lowThreshold) * 0.4;
} else {
mouthOpenY = 0.8 + Math.pow((normalizedVolume - highThreshold) / (1 - highThreshold), 1.2) * 0.2;
}
// 应用模型特定的嘴部开合幅度
let amplitudeMultiplier = 1.0;
let maxOpenY = 2.5;
if (this.currentModelName && this.modelConfig[this.currentModelName]) {
amplitudeMultiplier = this.modelConfig[this.currentModelName].mouthAmplitude;
maxOpenY = this.modelConfig[this.currentModelName].maxOpenY || 2.5;
}
mouthOpenY = mouthOpenY * amplitudeMultiplier;
mouthOpenY = Math.min(Math.max(mouthOpenY, 0), maxOpenY);
// 计算嘴型参数(仅对支持嘴型变化的模型)
if (this.currentModelName && this.modelConfig[this.currentModelName]?.mouthFormParam) {
const config = this.modelConfig[this.currentModelName];
const formAmplitude = config.mouthFormAmplitude || 0.5;
const form2Amplitude = config.mouthForm2Amplitude || 0;
// 嘴型随音量变化:
// 低音量:嘴型偏"一"字(负值)
// 高音量:嘴型偏"o"字(正值)
// 音量=0时:嘴型=0(自然状态)
mouthForm = (normalizedVolume - 0.5) * 2 * formAmplitude;
mouthForm = Math.max(-formAmplitude, Math.min(formAmplitude, mouthForm));
// 第二嘴型参数(natori特有)
if (config.mouthForm2Param) {
mouthForm2 = (normalizedVolume - 0.3) * 2 * form2Amplitude;
mouthForm2 = Math.max(-form2Amplitude, Math.min(form2Amplitude, mouthForm2));
}
}
// 调试日志:输出嘴部参数
console.log(`[Live2D] 模型: ${this.currentModelName || 'unknown'}, 音量: ${average?.toFixed(0)}, OpenY: ${mouthOpenY.toFixed(3)}, Form: ${mouthForm.toFixed(3)}, Form2: ${mouthForm2.toFixed(3)}`);
}
coreModel.setParameterValueById(this.mouthParam, mouthValue);
// 设置嘴部开合参数
coreModel.setParameterValueById(this.mouthParam, mouthOpenY);
// 设置嘴型参数(仅对支持嘴型变化的模型)
if (this.currentModelName && this.modelConfig[this.currentModelName]?.mouthFormParam) {
const config = this.modelConfig[this.currentModelName];
const formParam = config.mouthFormParam;
coreModel.setParameterValueById(formParam, mouthForm);
// 设置第二嘴型参数(natori特有)
if (config.mouthForm2Param) {
coreModel.setParameterValueById(config.mouthForm2Param, mouthForm2);
}
}
coreModel.update();
}
this.mouthAnimationId = requestAnimationFrame(() => this.animateMouth());
@@ -473,12 +586,129 @@ class Live2DManager {
motion(name) {
try {
if (!this.live2dModel) return;
this.live2dModel.motion(name);
// 根据当前模型获取对应的动作名称
let actualMotionName = name;
if (this.currentModelName && this.modelConfig[this.currentModelName]) {
const motionMap = this.modelConfig[this.currentModelName].motionMap;
actualMotionName = motionMap[name] || name;
}
this.live2dModel.motion(actualMotionName);
} catch (error) {
console.error('触发动作失败:', error);
}
}
/**
* 设置模型交互事件
*/
setupModelInteractions() {
if (!this.live2dModel) return;
this.live2dModel.interactive = true;
this.live2dModel.on('doublehit', (args) => {
const area = Array.isArray(args) ? args[0] : args;
if (area === 'Body') {
this.motion('Flick@Body');
} else if (area === 'Head' || area === 'Face') {
this.motion('Flick');
}
const app = window.chatApp;
const payload = JSON.stringify({ type: 'live2d', event: 'doublehit', area });
if (app && app.dataChannel && app.dataChannel.readyState === 'open') {
app.dataChannel.send(payload);
}
});
this.live2dModel.on('singlehit', (args) => {
const area = Array.isArray(args) ? args[0] : args;
if (area === 'Body') {
this.motion('Tap@Body');
} else if (area === 'Head' || area === 'Face') {
this.motion('Tap');
}
const app = window.chatApp;
const payload = JSON.stringify({ type: 'live2d', event: 'singlehit', area });
if (app && app.dataChannel && app.dataChannel.readyState === 'open') {
app.dataChannel.send(payload);
}
});
this.live2dModel.on('swipe', (args) => {
const area = Array.isArray(args) ? args[0] : args;
const dir = Array.isArray(args) ? args[1] : undefined;
if (area === 'Body') {
if (dir === 'up') {
this.motion('FlickUp');
} else if (dir === 'down') {
this.motion('FlickDown');
}
}
const app = window.chatApp;
const payload = JSON.stringify({ type: 'live2d', event: 'swipe', area, dir });
if (app && app.dataChannel && app.dataChannel.readyState === 'open') {
app.dataChannel.send(payload);
}
});
this.live2dModel.on('pointerdown', (event) => {
try {
const global = event.data.global;
const bounds = this.live2dModel.getBounds();
if (!bounds || !bounds.contains(global.x, global.y)) return;
const relX = (global.x - bounds.x) / (bounds.width || 1);
const relY = (global.y - bounds.y) / (bounds.height || 1);
let area = '';
if (relX >= 0.4 && relX <= 0.6) {
if (relY <= 0.15) {
area = 'Head';
} else if (relY >= 0.7) {
area = 'Body';
}
}
if (!area) return;
const now = Date.now();
const dt = now - (this._lastClickTime || 0);
const dx = global.x - (this._lastClickPos?.x || 0);
const dy = global.y - (this._lastClickPos?.y || 0);
const dist = Math.hypot(dx, dy);
if (this._lastClickTime && dt <= this._doubleClickMs && dist <= this._doubleClickDist) {
if (this._singleClickTimer) {
clearTimeout(this._singleClickTimer);
this._singleClickTimer = null;
}
this.live2dModel.emit('doublehit', area);
this._lastClickTime = null;
this._lastClickPos = null;
} else {
this._lastClickTime = now;
this._lastClickPos = { x: global.x, y: global.y };
this._singleClickTimer = setTimeout(() => {
this._singleClickTimer = null;
this.live2dModel.emit('singlehit', area);
}, this._doubleClickMs);
}
} catch (e) {
console.warn('pointerdown 处理出错:', e);
}
});
}
/**
* 清理资源
*/
@@ -500,6 +730,94 @@ class Live2DManager {
}
this.live2dModel = null;
}
/**
* 切换 Live2D 模型
* @param {string} modelName - 模型目录名称,如 'hiyori_pro_zh'、'natori_pro_zh'
* @returns {Promise<boolean>} - 切换是否成功
*/
async switchModel(modelName) {
try {
// 获取模型文件名映射
const modelFileMap = {
'hiyori_pro_zh': 'hiyori_pro_t11.model3.json',
'natori_pro_zh': 'natori_pro_t06.model3.json',
'chitose': 'chitose.model3.json',
'haru_greeter_pro_jp': 'haru_greeter_t05.model3.json'
};
const modelFileName = modelFileMap[modelName];
if (!modelFileName) {
console.error('未知的模型名称:', modelName);
return false;
}
// 获取基础路径
const currentPath = window.location.pathname;
const lastSlashIndex = currentPath.lastIndexOf('/');
const basePath = currentPath.substring(0, lastSlashIndex + 1);
const modelPath = basePath + 'resources/' + modelName + '/runtime/' + modelFileName;
// 如果已存在模型,先移除
if (this.live2dModel) {
this.live2dApp.stage.removeChild(this.live2dModel);
this.live2dModel.destroy();
this.live2dModel = null;
}
// 显示加载状态
const app = window.chatApp;
if (app) {
app.setModelLoadingStatus(true);
}
// 加载新模型
this.live2dModel = await PIXI.live2d.Live2DModel.from(modelPath);
this.live2dApp.stage.addChild(this.live2dModel);
// 设置模型属性
this.live2dModel.scale.set(0.33);
this.live2dModel.x = (window.innerWidth - this.live2dModel.width) * 0.5;
this.live2dModel.y = -50;
// 重新绑定交互事件
this.setupModelInteractions();
// 隐藏加载状态
if (app) {
app.setModelLoadingStatus(false);
}
// 保存当前模型名称
this.currentModelName = modelName;
// 设置模型特定的嘴部参数名
if (this.modelConfig[modelName]) {
this.mouthParam = this.modelConfig[modelName].mouthParam || 'ParamMouthOpenY';
}
// 保存到 localStorage
localStorage.setItem('live2dModel', modelName);
// 更新下拉框显示
const modelSelect = document.getElementById('live2dModelSelect');
if (modelSelect) {
modelSelect.value = modelName;
}
console.log('模型切换成功:', modelName);
return true;
} catch (error) {
console.error('切换模型失败:', error);
const app = window.chatApp;
if (app) {
app.setModelLoadingStatus(false);
}
return false;
}
}
}
// 导出全局实例
+46 -1
View File
@@ -11,7 +11,7 @@ class UIController {
this.visualizerCanvas = null;
this.visualizerContext = null;
this.audioStatsTimer = null;
this.currentBackgroundIndex = 0;
this.currentBackgroundIndex = localStorage.getItem('backgroundIndex') ? parseInt(localStorage.getItem('backgroundIndex')) : 0;
this.backgroundImages = ['1.png', '2.png', '3.png'];
// Bind methods
@@ -20,6 +20,7 @@ class UIController {
this.updateDialButton = this.updateDialButton.bind(this);
this.addChatMessage = this.addChatMessage.bind(this);
this.switchBackground = this.switchBackground.bind(this);
this.switchLive2DModel = this.switchLive2DModel.bind(this);
this.showModal = this.showModal.bind(this);
this.hideModal = this.hideModal.bind(this);
this.switchTab = this.switchTab.bind(this);
@@ -51,6 +52,12 @@ class UIController {
// Initialize status display
this.updateConnectionUI(false);
// Apply saved background
const backgroundContainer = document.querySelector('.background-container');
if (backgroundContainer) {
backgroundContainer.style.backgroundImage = `url('./images/${this.backgroundImages[this.currentBackgroundIndex]}')`;
}
this.updateDialButton(false);
console.log('UIController init completed');
@@ -82,6 +89,14 @@ class UIController {
backgroundBtn.addEventListener('click', this.switchBackground);
}
// Model switch button
const switchModelBtn = document.getElementById('switchModelBtn');
if (switchModelBtn) {
switchModelBtn.addEventListener('click', () => {
this.switchLive2DModel();
});
}
// Dial button
const dialBtn = document.getElementById('dialBtn');
if (dialBtn) {
@@ -324,6 +339,36 @@ class UIController {
if (backgroundContainer) {
backgroundContainer.style.backgroundImage = `url('./images/${this.backgroundImages[this.currentBackgroundIndex]}')`;
}
localStorage.setItem('backgroundIndex', this.currentBackgroundIndex);
}
// Switch Live2D model
switchLive2DModel() {
const modelSelect = document.getElementById('live2dModelSelect');
if (!modelSelect) {
console.error('模型选择下拉框不存在');
return;
}
const selectedModel = modelSelect.value;
const app = window.chatApp;
if (app && app.live2dManager) {
app.live2dManager.switchModel(selectedModel)
.then(success => {
if (success) {
this.addChatMessage(`已切换到模型: ${selectedModel}`, false);
} else {
this.addChatMessage('模型切换失败', false);
}
})
.catch(error => {
console.error('模型切换错误:', error);
this.addChatMessage('模型切换出错', false);
});
} else {
this.addChatMessage('Live2D管理器未初始化', false);
}
}
// Show modal
@@ -0,0 +1,79 @@
============================================================
示例模型
名执 尽 - PRO
============================================================
 该示例可用于学习商用的游戏和App中常用到的手臂切换等难度较高的制作方法。
 该模型角色由画师先崎真琴设计。
 模型的手臂通过渐变实现不同部件间的切换,这种制作方法经常应用于商用的游戏和App中。
 通过该模型,可以学习部件的切换来实现更丰富的动画。
 另外,可以通过Cubism3 Viewer (for OW)来查看嵌入式文件组的动画,了解完整的工作流程中使用到的数据结构。
------------------------------
素材使用许可
------------------------------
 普通用户以及小规模企业在同意授权协议的情况下可用于商业用途。
 中/大规模的企业只能用于非公开的内部试用。
 在使用该素材时,请确认以下的【无偿提供素材使用授权协议】中的“授权类型”、“Live2D原创角色”等的相关内容,
 并必须接受【Live2D Cubism 示例模型的使用授权要求】中的利用条件。
 有关许可证的更多信息,请参阅以下页面。
 https://www.live2d.com/zh-CHS/download/sample-data/
------------------------------
创作者
------------------------------
 插画:先崎 真琴【http://senzakimakoto.com/】
 配音:小野友树【https://web.onoyuki.com/】
 (※配音数据的发布为限定发布,已于2018/06/04结束。)
 模型:Live2D
------------------------------
素材内容
------------------------------
 模型文件(cmo3) ※包含物理模拟的设定
 表情动画文件(can3)
 基本动画文件(can3)
 嵌入文件组(runtime文件夹)
・模型数据(moc3)
・表情数据(exp3.json)
・动作数据(motion3.json)
・模型设定文件(model3.json)
・姿势设定文件(pose3.json)
・物理模拟设定文件(physics3.json)
・辅助显示的文件(cdi3.json)
------------------------------
更新记录
------------------------------
 ※配音数据的发布已于2018/06/04结束。
【cmo3】
 natori_pro_t06.cmo3
 2021年6月10日 公开
【can3】
 natori_pro_exp_t03.can3
 2021年6月10日 公开
【can3】
 natori_pro_motions_t03.can3
 2021年6月10日 公开
@@ -0,0 +1,120 @@
{
"Type": "Live2D Expression",
"Parameters": [
{
"Id": "ParamEyeLOpen",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeLSmile",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeLForm",
"Value": -2,
"Blend": "Add"
},
{
"Id": "ParamEyeROpen",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeRSmile",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeRForm",
"Value": -2,
"Blend": "Add"
},
{
"Id": "ParamEyeBallForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLY",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRY",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLX",
"Value": 0.3,
"Blend": "Add"
},
{
"Id": "ParamBrowRX",
"Value": 0.3,
"Blend": "Add"
},
{
"Id": "ParamBrowLAngle",
"Value": -0.4,
"Blend": "Add"
},
{
"Id": "ParamBrowRAngle",
"Value": -0.4,
"Blend": "Add"
},
{
"Id": "ParamBrowLForm",
"Value": -1,
"Blend": "Add"
},
{
"Id": "ParamBrowLForm2",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRForm",
"Value": -1,
"Blend": "Add"
},
{
"Id": "ParamBrowRForm2",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamTeethOn",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamCheek",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGlassUD",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassWhite",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassHighlight",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassHighlightMove",
"Value": 0,
"Blend": "Add"
}
]
}
@@ -0,0 +1,120 @@
{
"Type": "Live2D Expression",
"Parameters": [
{
"Id": "ParamEyeLOpen",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeLSmile",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeLForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeROpen",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeRSmile",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeRForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeBallForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLY",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRY",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLX",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRX",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLAngle",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRAngle",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLForm",
"Value": -1,
"Blend": "Add"
},
{
"Id": "ParamBrowLForm2",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRForm",
"Value": -1,
"Blend": "Add"
},
{
"Id": "ParamBrowRForm2",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamTeethOn",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamCheek",
"Value": 1,
"Blend": "Add"
},
{
"Id": "ParamGlassUD",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassWhite",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassHighlight",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassHighlightMove",
"Value": 0,
"Blend": "Add"
}
]
}
@@ -0,0 +1,120 @@
{
"Type": "Live2D Expression",
"Parameters": [
{
"Id": "ParamEyeLOpen",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeLSmile",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeLForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeROpen",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeRSmile",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeRForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeBallForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLY",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRY",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLX",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRX",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLAngle",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRAngle",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLForm2",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRForm2",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamTeethOn",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamCheek",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGlassUD",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassWhite",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassHighlight",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassHighlightMove",
"Value": 0,
"Blend": "Add"
}
]
}
@@ -0,0 +1,120 @@
{
"Type": "Live2D Expression",
"Parameters": [
{
"Id": "ParamEyeLOpen",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeLSmile",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeLForm",
"Value": -2,
"Blend": "Add"
},
{
"Id": "ParamEyeROpen",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeRSmile",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeRForm",
"Value": -2,
"Blend": "Add"
},
{
"Id": "ParamEyeBallForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLY",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRY",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLX",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRX",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLAngle",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRAngle",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLForm",
"Value": -1,
"Blend": "Add"
},
{
"Id": "ParamBrowLForm2",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRForm",
"Value": -1,
"Blend": "Add"
},
{
"Id": "ParamBrowRForm2",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamTeethOn",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamCheek",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGlassUD",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassWhite",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassHighlight",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassHighlightMove",
"Value": 0,
"Blend": "Add"
}
]
}
@@ -0,0 +1,120 @@
{
"Type": "Live2D Expression",
"Parameters": [
{
"Id": "ParamEyeLOpen",
"Value": -1,
"Blend": "Add"
},
{
"Id": "ParamEyeLSmile",
"Value": 1,
"Blend": "Add"
},
{
"Id": "ParamEyeLForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeROpen",
"Value": -1,
"Blend": "Add"
},
{
"Id": "ParamEyeRSmile",
"Value": 1,
"Blend": "Add"
},
{
"Id": "ParamEyeRForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeBallForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLY",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRY",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLX",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRX",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLAngle",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRAngle",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLForm",
"Value": 1,
"Blend": "Add"
},
{
"Id": "ParamBrowLForm2",
"Value": 1,
"Blend": "Add"
},
{
"Id": "ParamBrowRForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRForm2",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamTeethOn",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamCheek",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGlassUD",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassWhite",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassHighlight",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassHighlightMove",
"Value": 0,
"Blend": "Add"
}
]
}
@@ -0,0 +1,120 @@
{
"Type": "Live2D Expression",
"Parameters": [
{
"Id": "ParamEyeLOpen",
"Value": 0.3,
"Blend": "Add"
},
{
"Id": "ParamEyeLSmile",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeLForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeROpen",
"Value": 0.3,
"Blend": "Add"
},
{
"Id": "ParamEyeRSmile",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeRForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeBallForm",
"Value": -1,
"Blend": "Add"
},
{
"Id": "ParamBrowLY",
"Value": 0.2,
"Blend": "Add"
},
{
"Id": "ParamBrowRY",
"Value": 0.2,
"Blend": "Add"
},
{
"Id": "ParamBrowLX",
"Value": -0.1,
"Blend": "Add"
},
{
"Id": "ParamBrowRX",
"Value": -0.1,
"Blend": "Add"
},
{
"Id": "ParamBrowLAngle",
"Value": 0.1,
"Blend": "Add"
},
{
"Id": "ParamBrowRAngle",
"Value": 0.1,
"Blend": "Add"
},
{
"Id": "ParamBrowLForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLForm2",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRForm2",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamTeethOn",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamCheek",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGlassUD",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassWhite",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassHighlight",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassHighlightMove",
"Value": 0,
"Blend": "Add"
}
]
}
@@ -0,0 +1,120 @@
{
"Type": "Live2D Expression",
"Parameters": [
{
"Id": "ParamEyeLOpen",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeLSmile",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeLForm",
"Value": 3,
"Blend": "Add"
},
{
"Id": "ParamEyeROpen",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeRSmile",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeRForm",
"Value": 3,
"Blend": "Add"
},
{
"Id": "ParamEyeBallForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLY",
"Value": -0.1,
"Blend": "Add"
},
{
"Id": "ParamBrowRY",
"Value": -0.1,
"Blend": "Add"
},
{
"Id": "ParamBrowLX",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRX",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLAngle",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRAngle",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLForm2",
"Value": 1,
"Blend": "Add"
},
{
"Id": "ParamBrowRForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRForm2",
"Value": 1,
"Blend": "Add"
},
{
"Id": "ParamTeethOn",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamCheek",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGlassUD",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassWhite",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassHighlight",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassHighlightMove",
"Value": 0,
"Blend": "Add"
}
]
}
@@ -0,0 +1,120 @@
{
"Type": "Live2D Expression",
"Parameters": [
{
"Id": "ParamEyeLOpen",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeLSmile",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeLForm",
"Value": 1,
"Blend": "Add"
},
{
"Id": "ParamEyeROpen",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeRSmile",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeRForm",
"Value": 1,
"Blend": "Add"
},
{
"Id": "ParamEyeBallForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLY",
"Value": 0.1,
"Blend": "Add"
},
{
"Id": "ParamBrowRY",
"Value": 0.1,
"Blend": "Add"
},
{
"Id": "ParamBrowLX",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRX",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLAngle",
"Value": 0.1,
"Blend": "Add"
},
{
"Id": "ParamBrowRAngle",
"Value": 0.1,
"Blend": "Add"
},
{
"Id": "ParamBrowLForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLForm2",
"Value": 1,
"Blend": "Add"
},
{
"Id": "ParamBrowRForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRForm2",
"Value": 1,
"Blend": "Add"
},
{
"Id": "ParamTeethOn",
"Value": 1,
"Blend": "Add"
},
{
"Id": "ParamCheek",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGlassUD",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassWhite",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassHighlight",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassHighlightMove",
"Value": 0,
"Blend": "Add"
}
]
}
@@ -0,0 +1,120 @@
{
"Type": "Live2D Expression",
"Parameters": [
{
"Id": "ParamEyeLOpen",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeLSmile",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeLForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeROpen",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeRSmile",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeRForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeBallForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLY",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRY",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLX",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRX",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLAngle",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRAngle",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLForm",
"Value": -1,
"Blend": "Add"
},
{
"Id": "ParamBrowLForm2",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRForm",
"Value": -1,
"Blend": "Add"
},
{
"Id": "ParamBrowRForm2",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamTeethOn",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamCheek",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGlassUD",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassWhite",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassHighlight",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassHighlightMove",
"Value": 0,
"Blend": "Add"
}
]
}
@@ -0,0 +1,120 @@
{
"Type": "Live2D Expression",
"Parameters": [
{
"Id": "ParamEyeLOpen",
"Value": 0.2,
"Blend": "Add"
},
{
"Id": "ParamEyeLSmile",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeLForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeROpen",
"Value": 0.2,
"Blend": "Add"
},
{
"Id": "ParamEyeRSmile",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeRForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeBallForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLY",
"Value": 0.2,
"Blend": "Add"
},
{
"Id": "ParamBrowRY",
"Value": 0.2,
"Blend": "Add"
},
{
"Id": "ParamBrowLX",
"Value": -0.1,
"Blend": "Add"
},
{
"Id": "ParamBrowRX",
"Value": -0.1,
"Blend": "Add"
},
{
"Id": "ParamBrowLAngle",
"Value": 0.1,
"Blend": "Add"
},
{
"Id": "ParamBrowRAngle",
"Value": 0.1,
"Blend": "Add"
},
{
"Id": "ParamBrowLForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLForm2",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRForm2",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamTeethOn",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamCheek",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGlassUD",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassWhite",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassHighlight",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassHighlightMove",
"Value": 0,
"Blend": "Add"
}
]
}
@@ -0,0 +1,120 @@
{
"Type": "Live2D Expression",
"Parameters": [
{
"Id": "ParamEyeLOpen",
"Value": -1,
"Blend": "Add"
},
{
"Id": "ParamEyeLSmile",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeLForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeROpen",
"Value": -1,
"Blend": "Add"
},
{
"Id": "ParamEyeRSmile",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeRForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamEyeBallForm",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLY",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRY",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLX",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRX",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLAngle",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRAngle",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowLForm",
"Value": 1,
"Blend": "Add"
},
{
"Id": "ParamBrowLForm2",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamBrowRForm",
"Value": 1,
"Blend": "Add"
},
{
"Id": "ParamBrowRForm2",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamTeethOn",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamCheek",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGlassUD",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassWhite",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassHighlight",
"Value": 0,
"Blend": "Add"
},
{
"Id": "ParamGrassHighlightMove",
"Value": 0,
"Blend": "Add"
}
]
}
@@ -0,0 +1,44 @@
{
"Type": "Live2D Pose",
"FadeInTime": 0.2,
"Groups": [
[
{
"Id": "PartArmAL",
"Link": []
},
{
"Id": "PartArmCL",
"Link": []
},
{
"Id": "PartArmDL",
"Link": []
}
],
[
{
"Id": "PartArmAR",
"Link": []
},
{
"Id": "PartArmBR",
"Link": []
},
{
"Id": "PartArmER",
"Link": []
}
],
[
{
"Id": "PartWatchA",
"Link": []
},
{
"Id": "PartWatchB",
"Link": []
}
]
]
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 MiB

@@ -0,0 +1,711 @@
{
"Version": 3,
"Parameters": [
{
"Id": "ParamAngleX",
"GroupId": "",
"Name": "角度 X"
},
{
"Id": "ParamAngleY",
"GroupId": "",
"Name": "角度 Y"
},
{
"Id": "ParamAngleZ",
"GroupId": "",
"Name": "角度 Z"
},
{
"Id": "ParamEyeLOpen",
"GroupId": "ParamGroupExpression",
"Name": "左眼 开闭"
},
{
"Id": "ParamEyeLSmile",
"GroupId": "ParamGroupExpression",
"Name": "左眼 微笑"
},
{
"Id": "ParamEyeLForm",
"GroupId": "ParamGroupExpression",
"Name": "左眼 变形"
},
{
"Id": "ParamEyeROpen",
"GroupId": "ParamGroupExpression",
"Name": "右眼 开闭"
},
{
"Id": "ParamEyeRSmile",
"GroupId": "ParamGroupExpression",
"Name": "右眼 微笑"
},
{
"Id": "ParamEyeRForm",
"GroupId": "ParamGroupExpression",
"Name": "右眼 变形"
},
{
"Id": "ParamEyeBallX",
"GroupId": "ParamGroupExpression",
"Name": "眼珠 X"
},
{
"Id": "ParamEyeBallY",
"GroupId": "ParamGroupExpression",
"Name": "眼珠 Y"
},
{
"Id": "ParamEyeBallForm",
"GroupId": "ParamGroupExpression",
"Name": "眼珠 缩放"
},
{
"Id": "ParamBrowLY",
"GroupId": "ParamGroupExpression",
"Name": "左眉 上下"
},
{
"Id": "ParamBrowRY",
"GroupId": "ParamGroupExpression",
"Name": "右眉 上下"
},
{
"Id": "ParamBrowLX",
"GroupId": "ParamGroupExpression",
"Name": "左眉 左右"
},
{
"Id": "ParamBrowRX",
"GroupId": "ParamGroupExpression",
"Name": "右眉 左右"
},
{
"Id": "ParamBrowLAngle",
"GroupId": "ParamGroupExpression",
"Name": "左眉 角度"
},
{
"Id": "ParamBrowRAngle",
"GroupId": "ParamGroupExpression",
"Name": "右眉 角度"
},
{
"Id": "ParamBrowLForm",
"GroupId": "ParamGroupExpression",
"Name": "左眉 变形"
},
{
"Id": "ParamBrowLForm2",
"GroupId": "ParamGroupExpression",
"Name": "左眉 变形2"
},
{
"Id": "ParamBrowRForm",
"GroupId": "ParamGroupExpression",
"Name": "右眉 变形"
},
{
"Id": "ParamBrowRForm2",
"GroupId": "ParamGroupExpression",
"Name": "右眉 变形2"
},
{
"Id": "ParamMouthForm",
"GroupId": "ParamGroupExpression",
"Name": "嘴 变形"
},
{
"Id": "ParamMouthOpenY",
"GroupId": "ParamGroupExpression",
"Name": "嘴 开闭"
},
{
"Id": "ParamMouthForm2",
"GroupId": "ParamGroupExpression",
"Name": "嘴 变形2"
},
{
"Id": "ParamTeethOn",
"GroupId": "ParamGroupExpression",
"Name": "牙齿的显示"
},
{
"Id": "ParamCheek",
"GroupId": "ParamGroupExpression",
"Name": "害羞"
},
{
"Id": "ParamGlassUD",
"GroupId": "ParamGroupExpression",
"Name": "眼镜 上下"
},
{
"Id": "ParamGrassWhite",
"GroupId": "ParamGroupExpression",
"Name": "镜片 白"
},
{
"Id": "ParamGrassHighlight",
"GroupId": "ParamGroupExpression",
"Name": "镜片 反光显示"
},
{
"Id": "ParamGrassHighlightMove",
"GroupId": "ParamGroupExpression",
"Name": "镜片 反光移动"
},
{
"Id": "ParamBodyAngleX",
"GroupId": "ParamGroupBody",
"Name": "身体的旋转 X"
},
{
"Id": "ParamBodyAngleY",
"GroupId": "ParamGroupBody",
"Name": "身体的旋转 Y"
},
{
"Id": "ParamBodyAngleZ",
"GroupId": "ParamGroupBody",
"Name": "身体的旋转 Z"
},
{
"Id": "ParamWaistAngleZ",
"GroupId": "ParamGroupBody",
"Name": "腰的旋转 Z"
},
{
"Id": "ParamBodyPosition",
"GroupId": "ParamGroupBody",
"Name": "身体的前后"
},
{
"Id": "ParamBreath",
"GroupId": "ParamGroupBody",
"Name": "呼吸"
},
{
"Id": "ParamLeftShoulderUp",
"GroupId": "ParamGroupBody",
"Name": "左肩的上下"
},
{
"Id": "ParamRightShoulderUp",
"GroupId": "ParamGroupBody",
"Name": "右肩的上下"
},
{
"Id": "ParamAllX",
"GroupId": "ParamGroup",
"Name": "整体的移动 X"
},
{
"Id": "ParamAllY",
"GroupId": "ParamGroup",
"Name": "整体的移动 Y"
},
{
"Id": "ParamAllRotate",
"GroupId": "ParamGroup",
"Name": "整体的旋转"
},
{
"Id": "ParamHairFront",
"GroupId": "ParamGroupSway",
"Name": "头发摇动 前"
},
{
"Id": "ParamHairSide",
"GroupId": "ParamGroupSway",
"Name": "头发摇动 侧"
},
{
"Id": "ParamHairBack",
"GroupId": "ParamGroupSway",
"Name": "头发摇动 后"
},
{
"Id": "ParamHairFrontFuwa",
"GroupId": "ParamGroupSway",
"Name": "前发 蓬松"
},
{
"Id": "ParamHairSideFuwa",
"GroupId": "ParamGroupSway",
"Name": "侧发 蓬松"
},
{
"Id": "ParamHairBackFuwa",
"GroupId": "ParamGroupSway",
"Name": "后发 蓬松"
},
{
"Id": "ParamJacket",
"GroupId": "ParamGroupSway",
"Name": "燕尾的摇动"
},
{
"Id": "ParamChainWaist",
"GroupId": "ParamGroupSway",
"Name": "表链A的摇动"
},
{
"Id": "ParamWatchSwingA1",
"GroupId": "ParamGroupSway",
"Name": "怀表A 摇动1"
},
{
"Id": "ParamWatchSwingA2",
"GroupId": "ParamGroupSway",
"Name": "怀表A 摇动2"
},
{
"Id": "ParamWatchBChain",
"GroupId": "ParamGroupSway",
"Name": "怀表B 表链的摇动"
},
{
"Id": "ParamWatchAX",
"GroupId": "ParamGroup8",
"Name": "怀表A 横向旋转"
},
{
"Id": "ParamWatchBSwitch",
"GroupId": "ParamGroup9",
"Name": "怀表B 开关"
},
{
"Id": "ParamWatchBOpen",
"GroupId": "ParamGroup9",
"Name": "怀表B 表盖的开闭"
},
{
"Id": "ParamWatchBOpen2",
"GroupId": "ParamGroup9",
"Name": "怀表B 表盘的开闭"
},
{
"Id": "ParamWatchBX",
"GroupId": "ParamGroup9",
"Name": "怀表B 横向旋转"
},
{
"Id": "ParamWatchBRoll",
"GroupId": "ParamGroup9",
"Name": "怀表B 旋转"
},
{
"Id": "ParamWatchBLR",
"GroupId": "ParamGroup9",
"Name": "怀表B 左右"
},
{
"Id": "ParamWatchBUD",
"GroupId": "ParamGroup9",
"Name": "怀表B 上下"
},
{
"Id": "ParamArmAL01",
"GroupId": "ParamGroup3",
"Name": "左手臂A 肩"
},
{
"Id": "ParamArmAL02",
"GroupId": "ParamGroup3",
"Name": "左肩A 手肘旋转"
},
{
"Id": "ParamArmAL03",
"GroupId": "ParamGroup3",
"Name": "左手臂A 手腕"
},
{
"Id": "ParamArmAL04",
"GroupId": "ParamGroup3",
"Name": "左手臂A 前臂的前后"
},
{
"Id": "ParamArmAR01",
"GroupId": "ParamGroup2",
"Name": "右手臂A 肩的旋转"
},
{
"Id": "ParamArmAR02",
"GroupId": "ParamGroup2",
"Name": "右手臂A 手肘的旋转"
},
{
"Id": "ParamArmAR03",
"GroupId": "ParamGroup2",
"Name": "右手臂A 手腕的旋转"
},
{
"Id": "ParamArmAR04",
"GroupId": "ParamGroup2",
"Name": "右手臂A 前臂的前后"
},
{
"Id": "ParamArmBR01",
"GroupId": "ParamGroup4",
"Name": "右手臂B 肩的旋转"
},
{
"Id": "ParamArmBR02",
"GroupId": "ParamGroup4",
"Name": "右手臂B 手肘的旋转"
},
{
"Id": "ParamArmBR03",
"GroupId": "ParamGroup4",
"Name": "右手臂B 手腕的旋转"
},
{
"Id": "ParamArmBRHand01",
"GroupId": "ParamGroup4",
"Name": "右手01 显示"
},
{
"Id": "ParamArmBRHand01Roll",
"GroupId": "ParamGroup4",
"Name": "右手01 手指弯曲"
},
{
"Id": "ParamArmBRHand05",
"GroupId": "ParamGroup4",
"Name": "右手05 显示"
},
{
"Id": "ParamArmBRHand05Roll1",
"GroupId": "ParamGroup4",
"Name": "右手05 手指弯曲1"
},
{
"Id": "ParamArmBRHand05Roll2",
"GroupId": "ParamGroup4",
"Name": "右手05 手指弯曲2"
},
{
"Id": "ParamArmBRHand05Roll3",
"GroupId": "ParamGroup4",
"Name": "右手05 手指弯曲3"
},
{
"Id": "ParamArmCR01",
"GroupId": "ParamGroup5",
"Name": "左手臂C 肩的旋转"
},
{
"Id": "ParamArmCR02",
"GroupId": "ParamGroup5",
"Name": "左手臂C 手肘的旋转"
},
{
"Id": "ParamArmCR03",
"GroupId": "ParamGroup5",
"Name": "左手臂C 手腕的旋转"
},
{
"Id": "ParamArmCLHandRoll1",
"GroupId": "ParamGroup5",
"Name": "左手C 手指弯曲1"
},
{
"Id": "ParamArmDL01",
"GroupId": "ParamGroup6",
"Name": "左手臂D 肩的旋转"
},
{
"Id": "ParamArmDL02",
"GroupId": "ParamGroup6",
"Name": "左手臂D 手肘的旋转"
},
{
"Id": "ParamArmDL03",
"GroupId": "ParamGroup6",
"Name": "左手臂D 手腕的旋转"
},
{
"Id": "ParamArmDLHand03Roll",
"GroupId": "ParamGroup6",
"Name": "左手03 手指弯曲"
},
{
"Id": "ParamArmER01",
"GroupId": "ParamGroup7",
"Name": "右手臂E 肩的旋转"
},
{
"Id": "ParamArmER02",
"GroupId": "ParamGroup7",
"Name": "右手臂E 手肘的旋转"
},
{
"Id": "ParamArmER03",
"GroupId": "ParamGroup7",
"Name": "右手臂E 手腕的旋转"
},
{
"Id": "ParamArmER04",
"GroupId": "ParamGroup7",
"Name": "右手臂E 上臂的长度"
},
{
"Id": "ParamArmERHand04",
"GroupId": "ParamGroup7",
"Name": "右手04 显示"
},
{
"Id": "ParamArmERHand04Roll1",
"GroupId": "ParamGroup7",
"Name": "右手04 手指弯曲1"
},
{
"Id": "ParamArmERHand04Roll2",
"GroupId": "ParamGroup7",
"Name": "右手04 手指弯曲2"
},
{
"Id": "ParamArmERHand06",
"GroupId": "ParamGroup7",
"Name": "右手06 显示"
},
{
"Id": "ParamArmERHand06Roll1",
"GroupId": "ParamGroup7",
"Name": "右手06 手指弯曲1"
},
{
"Id": "ParamArmERHand06Roll2",
"GroupId": "ParamGroup7",
"Name": "右手06 手指弯曲2"
}
],
"ParameterGroups": [
{
"Id": "ParamGroupExpression",
"GroupId": "",
"Name": "表情"
},
{
"Id": "ParamGroupBody",
"GroupId": "",
"Name": "身体"
},
{
"Id": "ParamGroup",
"GroupId": "",
"Name": "整体移动"
},
{
"Id": "ParamGroupSway",
"GroupId": "",
"Name": "摇动"
},
{
"Id": "ParamGroup8",
"GroupId": "",
"Name": "怀表A"
},
{
"Id": "ParamGroup9",
"GroupId": "",
"Name": "怀表B"
},
{
"Id": "ParamGroup3",
"GroupId": "",
"Name": "左手臂A"
},
{
"Id": "ParamGroup2",
"GroupId": "",
"Name": "右手臂A"
},
{
"Id": "ParamGroup4",
"GroupId": "",
"Name": "右手臂B"
},
{
"Id": "ParamGroup5",
"GroupId": "",
"Name": "左手臂C"
},
{
"Id": "ParamGroup6",
"GroupId": "",
"Name": "左手臂D"
},
{
"Id": "ParamGroup7",
"GroupId": "",
"Name": "右手臂E"
}
],
"Parts": [
{
"Id": "PartCredit",
"Name": "名牌"
},
{
"Id": "PartCore",
"Name": "CORE"
},
{
"Id": "PartGlass",
"Name": "眼镜"
},
{
"Id": "PartWatchA",
"Name": "怀表A"
},
{
"Id": "PartWatchB",
"Name": "怀表B"
},
{
"Id": "PartHairFront",
"Name": "前发"
},
{
"Id": "PartHead",
"Name": "头"
},
{
"Id": "PartUpperBody",
"Name": "上半身"
},
{
"Id": "PartHairBack",
"Name": "后发"
},
{
"Id": "PartLowerBody",
"Name": "下半身"
},
{
"Id": "PartArmAL",
"Name": "左手臂A"
},
{
"Id": "PartArmAR",
"Name": "右手臂A"
},
{
"Id": "PartArmBR",
"Name": "右手臂B"
},
{
"Id": "PartArmCL",
"Name": "左手臂C"
},
{
"Id": "PartArmDL",
"Name": "左手臂D"
},
{
"Id": "PartArmER",
"Name": "右手臂E"
},
{
"Id": "PartEyeBlow",
"Name": "眉毛"
},
{
"Id": "PartEyeR",
"Name": "右眼"
},
{
"Id": "PartEyeL",
"Name": "左眼"
},
{
"Id": "PartHairLine",
"Name": "发际线"
},
{
"Id": "PartHairShadow",
"Name": "头发阴影"
},
{
"Id": "PartNose",
"Name": "鼻子"
},
{
"Id": "PartMouth",
"Name": "嘴"
},
{
"Id": "PartJacket",
"Name": "燕尾服"
},
{
"Id": "PartArmALFore",
"Name": "左手臂A 前臂"
},
{
"Id": "PartArmARFore",
"Name": "右手臂A 前臂"
},
{
"Id": "PartHand11",
"Name": "手套_1"
},
{
"Id": "PartHand51",
"Name": "手套_5"
},
{
"Id": "PartHand21",
"Name": "手套_2"
},
{
"Id": "PartHand31",
"Name": "手套_3"
},
{
"Id": "PartHand41",
"Name": "手套_4"
},
{
"Id": "PartHand61",
"Name": "手套_6"
}
],
"CombinedParameters": [
[
"ParamAngleX",
"ParamAngleY"
],
[
"ParamEyeBallX",
"ParamEyeBallY"
],
[
"ParamMouthForm",
"ParamMouthOpenY"
],
[
"ParamBodyAngleX",
"ParamBodyAngleY"
],
[
"ParamLeftShoulderUp",
"ParamRightShoulderUp"
],
[
"ParamAllX",
"ParamAllY"
],
[
"ParamWatchSwingA1",
"ParamWatchSwingA2"
],
[
"ParamWatchBLR",
"ParamWatchBUD"
]
]
}
@@ -0,0 +1,123 @@
{
"Version": 3,
"FileReferences": {
"Moc": "natori_pro_t06.moc3",
"Textures": [
"natori_pro_t06.4096/texture_00.png"
],
"Physics": "natori_pro_t06.physics3.json",
"Pose": "natori.pose3.json",
"DisplayInfo": "natori_pro_t06.cdi3.json",
"Expressions": [
{
"Name": "Angry",
"File": "exp/Angry.exp3.json"
},
{
"Name": "Blushing",
"File": "exp/Blushing.exp3.json"
},
{
"Name": "Normal",
"File": "exp/Normal.exp3.json"
},
{
"Name": "Sad",
"File": "exp/Sad.exp3.json"
},
{
"Name": "Smile",
"File": "exp/Smile.exp3.json"
},
{
"Name": "Surprised",
"File": "exp/Surprised.exp3.json"
},
{
"Name": "exp_01",
"File": "exp/exp_01.exp3.json"
},
{
"Name": "exp_02",
"File": "exp/exp_02.exp3.json"
},
{
"Name": "exp_03",
"File": "exp/exp_03.exp3.json"
},
{
"Name": "exp_04",
"File": "exp/exp_04.exp3.json"
},
{
"Name": "exp_05",
"File": "exp/exp_05.exp3.json"
}
],
"Motions": {
"Idle": [
{
"File": "motions/mtn_00.motion3.json"
},
{
"File": "motions/mtn_01.motion3.json"
},
{
"File": "motions/mtn_02.motion3.json"
}
],
"Tap": [
{
"File": "motions/mtn_03.motion3.json"
}
],
"FlickUp@Head": [
{
"File": "motions/mtn_04.motion3.json"
}
],
"Flick@Body": [
{
"File": "motions/mtn_05.motion3.json"
}
],
"FlickDown@Body": [
{
"File": "motions/mtn_06.motion3.json"
}
],
"Tap@Head": [
{
"File": "motions/mtn_07.motion3.json"
}
]
}
},
"Groups": [
{
"Target": "Parameter",
"Name": "LipSync",
"Ids": [
"ParamMouthOpenY"
]
},
{
"Target": "Parameter",
"Name": "EyeBlink",
"Ids": [
"ParamEyeLOpen",
"ParamEyeROpen"
]
}
],
"HitAreas": [
{
"Id": "HitAreaHead",
"Name": ""
},
{
"Id": "HitAreaBody",
"Name": ""
}
]
}
@@ -0,0 +1,966 @@
{
"Version": 3,
"Meta": {
"PhysicsSettingCount": 11,
"TotalInputCount": 34,
"TotalOutputCount": 12,
"VertexCount": 23,
"EffectiveForces": {
"Gravity": {
"X": 0,
"Y": -1
},
"Wind": {
"X": 0,
"Y": 0
}
},
"PhysicsDictionary": [
{
"Id": "PhysicsSetting1",
"Name": "前髪 揺れ"
},
{
"Id": "PhysicsSetting2",
"Name": "横髪 揺れ"
},
{
"Id": "PhysicsSetting3",
"Name": "後ろ髪 揺れ"
},
{
"Id": "PhysicsSetting4",
"Name": "前髪ふわ"
},
{
"Id": "PhysicsSetting5",
"Name": "横髪ふわ"
},
{
"Id": "PhysicsSetting6",
"Name": "後ろ髪ふわ"
},
{
"Id": "PhysicsSetting7",
"Name": "燕尾揺れ"
},
{
"Id": "PhysicsSetting8",
"Name": "懐中時計腰 揺れ"
},
{
"Id": "PhysicsSetting9",
"Name": "腰のチェーン揺れ"
},
{
"Id": "PhysicsSetting10",
"Name": "懐中時計腰 横回転"
},
{
"Id": "PhysicsSetting11",
"Name": "懐中時計B チェーン揺れ"
}
]
},
"PhysicsSettings": [
{
"Id": "PhysicsSetting1",
"Input": [
{
"Source": {
"Target": "Parameter",
"Id": "ParamAngleX"
},
"Weight": 60,
"Type": "X",
"Reflect": false
},
{
"Source": {
"Target": "Parameter",
"Id": "ParamAngleZ"
},
"Weight": 60,
"Type": "Angle",
"Reflect": false
},
{
"Source": {
"Target": "Parameter",
"Id": "ParamBodyAngleX"
},
"Weight": 40,
"Type": "X",
"Reflect": false
},
{
"Source": {
"Target": "Parameter",
"Id": "ParamBodyAngleZ"
},
"Weight": 40,
"Type": "Angle",
"Reflect": false
}
],
"Output": [
{
"Destination": {
"Target": "Parameter",
"Id": "ParamHairFront"
},
"VertexIndex": 1,
"Scale": 1.824,
"Weight": 100,
"Type": "Angle",
"Reflect": false
}
],
"Vertices": [
{
"Position": {
"X": 0,
"Y": 0
},
"Mobility": 1,
"Delay": 1,
"Acceleration": 1,
"Radius": 0
},
{
"Position": {
"X": 0,
"Y": 12.7
},
"Mobility": 0.95,
"Delay": 0.9,
"Acceleration": 1,
"Radius": 12.7
}
],
"Normalization": {
"Position": {
"Minimum": -10,
"Default": 0,
"Maximum": 10
},
"Angle": {
"Minimum": -10,
"Default": 0,
"Maximum": 10
}
}
},
{
"Id": "PhysicsSetting2",
"Input": [
{
"Source": {
"Target": "Parameter",
"Id": "ParamAngleX"
},
"Weight": 60,
"Type": "X",
"Reflect": false
},
{
"Source": {
"Target": "Parameter",
"Id": "ParamAngleZ"
},
"Weight": 60,
"Type": "Angle",
"Reflect": false
},
{
"Source": {
"Target": "Parameter",
"Id": "ParamBodyAngleX"
},
"Weight": 40,
"Type": "X",
"Reflect": false
},
{
"Source": {
"Target": "Parameter",
"Id": "ParamBodyAngleZ"
},
"Weight": 40,
"Type": "Angle",
"Reflect": false
}
],
"Output": [
{
"Destination": {
"Target": "Parameter",
"Id": "ParamHairSide"
},
"VertexIndex": 1,
"Scale": 2,
"Weight": 100,
"Type": "Angle",
"Reflect": false
}
],
"Vertices": [
{
"Position": {
"X": 0,
"Y": 0
},
"Mobility": 1,
"Delay": 1,
"Acceleration": 1,
"Radius": 0
},
{
"Position": {
"X": 0,
"Y": 18.2
},
"Mobility": 0.95,
"Delay": 0.9,
"Acceleration": 1,
"Radius": 18.2
}
],
"Normalization": {
"Position": {
"Minimum": -10,
"Default": 0,
"Maximum": 10
},
"Angle": {
"Minimum": -10,
"Default": 0,
"Maximum": 10
}
}
},
{
"Id": "PhysicsSetting3",
"Input": [
{
"Source": {
"Target": "Parameter",
"Id": "ParamAngleX"
},
"Weight": 60,
"Type": "X",
"Reflect": false
},
{
"Source": {
"Target": "Parameter",
"Id": "ParamAngleZ"
},
"Weight": 60,
"Type": "Angle",
"Reflect": false
},
{
"Source": {
"Target": "Parameter",
"Id": "ParamBodyAngleX"
},
"Weight": 40,
"Type": "X",
"Reflect": false
},
{
"Source": {
"Target": "Parameter",
"Id": "ParamBodyAngleZ"
},
"Weight": 40,
"Type": "Angle",
"Reflect": false
}
],
"Output": [
{
"Destination": {
"Target": "Parameter",
"Id": "ParamHairBack"
},
"VertexIndex": 1,
"Scale": 2,
"Weight": 100,
"Type": "Angle",
"Reflect": false
}
],
"Vertices": [
{
"Position": {
"X": 0,
"Y": 0
},
"Mobility": 1,
"Delay": 1,
"Acceleration": 1,
"Radius": 0
},
{
"Position": {
"X": 0,
"Y": 14.3
},
"Mobility": 1,
"Delay": 0.9,
"Acceleration": 1.42,
"Radius": 14.3
}
],
"Normalization": {
"Position": {
"Minimum": -10,
"Default": 0,
"Maximum": 10
},
"Angle": {
"Minimum": -10,
"Default": 0,
"Maximum": 10
}
}
},
{
"Id": "PhysicsSetting4",
"Input": [
{
"Source": {
"Target": "Parameter",
"Id": "ParamAngleY"
},
"Weight": 35,
"Type": "X",
"Reflect": false
},
{
"Source": {
"Target": "Parameter",
"Id": "ParamBodyAngleY"
},
"Weight": 30,
"Type": "X",
"Reflect": false
},
{
"Source": {
"Target": "Parameter",
"Id": "ParamBodyPosition"
},
"Weight": 35,
"Type": "X",
"Reflect": true
}
],
"Output": [
{
"Destination": {
"Target": "Parameter",
"Id": "ParamHairFrontFuwa"
},
"VertexIndex": 1,
"Scale": 3,
"Weight": 100,
"Type": "Angle",
"Reflect": true
}
],
"Vertices": [
{
"Position": {
"X": 0,
"Y": 0
},
"Mobility": 1,
"Delay": 1,
"Acceleration": 1,
"Radius": 0
},
{
"Position": {
"X": 0,
"Y": 11.9
},
"Mobility": 0.79,
"Delay": 0.9,
"Acceleration": 1,
"Radius": 11.9
}
],
"Normalization": {
"Position": {
"Minimum": -10,
"Default": 0,
"Maximum": 10
},
"Angle": {
"Minimum": -10,
"Default": 0,
"Maximum": 10
}
}
},
{
"Id": "PhysicsSetting5",
"Input": [
{
"Source": {
"Target": "Parameter",
"Id": "ParamAngleY"
},
"Weight": 35,
"Type": "X",
"Reflect": false
},
{
"Source": {
"Target": "Parameter",
"Id": "ParamBodyAngleY"
},
"Weight": 30,
"Type": "X",
"Reflect": false
},
{
"Source": {
"Target": "Parameter",
"Id": "ParamBodyPosition"
},
"Weight": 35,
"Type": "X",
"Reflect": true
}
],
"Output": [
{
"Destination": {
"Target": "Parameter",
"Id": "ParamHairSideFuwa"
},
"VertexIndex": 1,
"Scale": 3.5,
"Weight": 100,
"Type": "Angle",
"Reflect": true
}
],
"Vertices": [
{
"Position": {
"X": 0,
"Y": 0
},
"Mobility": 1,
"Delay": 1,
"Acceleration": 1,
"Radius": 0
},
{
"Position": {
"X": 0,
"Y": 14.3
},
"Mobility": 0.79,
"Delay": 0.9,
"Acceleration": 1.1,
"Radius": 14.3
}
],
"Normalization": {
"Position": {
"Minimum": -10,
"Default": 0,
"Maximum": 10
},
"Angle": {
"Minimum": -10,
"Default": 0,
"Maximum": 10
}
}
},
{
"Id": "PhysicsSetting6",
"Input": [
{
"Source": {
"Target": "Parameter",
"Id": "ParamAngleY"
},
"Weight": 35,
"Type": "X",
"Reflect": false
},
{
"Source": {
"Target": "Parameter",
"Id": "ParamBodyAngleY"
},
"Weight": 30,
"Type": "X",
"Reflect": false
},
{
"Source": {
"Target": "Parameter",
"Id": "ParamBodyPosition"
},
"Weight": 35,
"Type": "X",
"Reflect": true
}
],
"Output": [
{
"Destination": {
"Target": "Parameter",
"Id": "ParamHairBackFuwa"
},
"VertexIndex": 1,
"Scale": 5,
"Weight": 100,
"Type": "Angle",
"Reflect": true
}
],
"Vertices": [
{
"Position": {
"X": 0,
"Y": 0
},
"Mobility": 1,
"Delay": 1,
"Acceleration": 1,
"Radius": 0
},
{
"Position": {
"X": 0,
"Y": 11.3
},
"Mobility": 0.79,
"Delay": 0.9,
"Acceleration": 1.16,
"Radius": 11.3
}
],
"Normalization": {
"Position": {
"Minimum": -10,
"Default": 0,
"Maximum": 10
},
"Angle": {
"Minimum": -10,
"Default": 0,
"Maximum": 10
}
}
},
{
"Id": "PhysicsSetting7",
"Input": [
{
"Source": {
"Target": "Parameter",
"Id": "ParamBodyAngleX"
},
"Weight": 100,
"Type": "X",
"Reflect": false
},
{
"Source": {
"Target": "Parameter",
"Id": "ParamBodyAngleZ"
},
"Weight": 70,
"Type": "Angle",
"Reflect": false
},
{
"Source": {
"Target": "Parameter",
"Id": "ParamWaistAngleZ"
},
"Weight": 30,
"Type": "Angle",
"Reflect": false
}
],
"Output": [
{
"Destination": {
"Target": "Parameter",
"Id": "ParamJacket"
},
"VertexIndex": 1,
"Scale": 1,
"Weight": 100,
"Type": "Angle",
"Reflect": false
}
],
"Vertices": [
{
"Position": {
"X": 0,
"Y": 0
},
"Mobility": 1,
"Delay": 1,
"Acceleration": 1,
"Radius": 0
},
{
"Position": {
"X": 0,
"Y": 31.9
},
"Mobility": 0.95,
"Delay": 0.8,
"Acceleration": 0.8,
"Radius": 31.9
}
],
"Normalization": {
"Position": {
"Minimum": -10,
"Default": 0,
"Maximum": 10
},
"Angle": {
"Minimum": -10,
"Default": 0,
"Maximum": 10
}
}
},
{
"Id": "PhysicsSetting8",
"Input": [
{
"Source": {
"Target": "Parameter",
"Id": "ParamBodyAngleX"
},
"Weight": 100,
"Type": "X",
"Reflect": false
},
{
"Source": {
"Target": "Parameter",
"Id": "ParamBodyAngleZ"
},
"Weight": 70,
"Type": "Angle",
"Reflect": false
},
{
"Source": {
"Target": "Parameter",
"Id": "ParamWaistAngleZ"
},
"Weight": 30,
"Type": "Angle",
"Reflect": false
}
],
"Output": [
{
"Destination": {
"Target": "Parameter",
"Id": "ParamWatchSwingA1"
},
"VertexIndex": 1,
"Scale": 1,
"Weight": 100,
"Type": "Angle",
"Reflect": false
},
{
"Destination": {
"Target": "Parameter",
"Id": "ParamWatchSwingA2"
},
"VertexIndex": 2,
"Scale": 1,
"Weight": 100,
"Type": "Angle",
"Reflect": false
}
],
"Vertices": [
{
"Position": {
"X": 0,
"Y": 0
},
"Mobility": 1,
"Delay": 1,
"Acceleration": 1,
"Radius": 0
},
{
"Position": {
"X": 0,
"Y": 15.4
},
"Mobility": 0.95,
"Delay": 1,
"Acceleration": 0.8,
"Radius": 15.4
},
{
"Position": {
"X": 0,
"Y": 31.9
},
"Mobility": 0.9,
"Delay": 1,
"Acceleration": 0.6,
"Radius": 16.5
}
],
"Normalization": {
"Position": {
"Minimum": -10,
"Default": 0,
"Maximum": 10
},
"Angle": {
"Minimum": -10,
"Default": 0,
"Maximum": 10
}
}
},
{
"Id": "PhysicsSetting9",
"Input": [
{
"Source": {
"Target": "Parameter",
"Id": "ParamBodyAngleX"
},
"Weight": 100,
"Type": "X",
"Reflect": false
},
{
"Source": {
"Target": "Parameter",
"Id": "ParamBodyAngleZ"
},
"Weight": 70,
"Type": "Angle",
"Reflect": false
},
{
"Source": {
"Target": "Parameter",
"Id": "ParamWaistAngleZ"
},
"Weight": 30,
"Type": "Angle",
"Reflect": false
}
],
"Output": [
{
"Destination": {
"Target": "Parameter",
"Id": "ParamChainWaist"
},
"VertexIndex": 1,
"Scale": 1,
"Weight": 100,
"Type": "Angle",
"Reflect": false
}
],
"Vertices": [
{
"Position": {
"X": 0,
"Y": 0
},
"Mobility": 1,
"Delay": 1,
"Acceleration": 1,
"Radius": 0
},
{
"Position": {
"X": 0,
"Y": 11.6
},
"Mobility": 0.95,
"Delay": 1,
"Acceleration": 1,
"Radius": 11.6
}
],
"Normalization": {
"Position": {
"Minimum": -10,
"Default": 0,
"Maximum": 10
},
"Angle": {
"Minimum": -10,
"Default": 0,
"Maximum": 10
}
}
},
{
"Id": "PhysicsSetting10",
"Input": [
{
"Source": {
"Target": "Parameter",
"Id": "ParamBodyAngleX"
},
"Weight": 100,
"Type": "X",
"Reflect": false
},
{
"Source": {
"Target": "Parameter",
"Id": "ParamBodyAngleZ"
},
"Weight": 70,
"Type": "Angle",
"Reflect": false
},
{
"Source": {
"Target": "Parameter",
"Id": "ParamWaistAngleZ"
},
"Weight": 30,
"Type": "Angle",
"Reflect": false
}
],
"Output": [
{
"Destination": {
"Target": "Parameter",
"Id": "ParamWatchAX"
},
"VertexIndex": 1,
"Scale": 2,
"Weight": 100,
"Type": "Angle",
"Reflect": false
}
],
"Vertices": [
{
"Position": {
"X": 0,
"Y": 0
},
"Mobility": 1,
"Delay": 1,
"Acceleration": 1,
"Radius": 0
},
{
"Position": {
"X": 0,
"Y": 72.1
},
"Mobility": 0.95,
"Delay": 1,
"Acceleration": 0.2,
"Radius": 72.1
}
],
"Normalization": {
"Position": {
"Minimum": -10,
"Default": 0,
"Maximum": 10
},
"Angle": {
"Minimum": -10,
"Default": 0,
"Maximum": 10
}
}
},
{
"Id": "PhysicsSetting11",
"Input": [
{
"Source": {
"Target": "Parameter",
"Id": "ParamArmBR03"
},
"Weight": 100,
"Type": "X",
"Reflect": false
}
],
"Output": [
{
"Destination": {
"Target": "Parameter",
"Id": "ParamWatchBChain"
},
"VertexIndex": 1,
"Scale": 2,
"Weight": 100,
"Type": "Angle",
"Reflect": false
}
],
"Vertices": [
{
"Position": {
"X": 0,
"Y": 0
},
"Mobility": 1,
"Delay": 1,
"Acceleration": 1,
"Radius": 0
},
{
"Position": {
"X": 0,
"Y": 13.1
},
"Mobility": 0.95,
"Delay": 1,
"Acceleration": 0.66,
"Radius": 13.1
}
],
"Normalization": {
"Position": {
"Minimum": -10,
"Default": 0,
"Maximum": 10
},
"Angle": {
"Minimum": -10,
"Default": 0,
"Maximum": 10
}
}
}
]
}
+39 -8
View File
@@ -87,14 +87,6 @@
<span class="btn-text">设置</span>
</button>
<button class="control-btn" id="backgroundBtn" title="切换背景">
<svg class="btn-icon" viewBox="0 0 24 24" fill="currentColor">
<path
d="M12,18A6,6 0 0,1 6,12C6,11 6.25,10.03 6.7,9.2L5.24,7.74C4.46,8.97 4,10.43 4,12A8,8 0 0,0 12,20V23L16,19L12,15V18M12,4V1L8,5L12,9V6A6,6 0 0,1 18,12C18,13 17.75,13.97 17.3,14.8L18.76,16.26C19.54,15.03 20,13.57 20,12A8,8 0 0,0 12,4Z" />
</svg>
<span class="btn-text">背景</span>
</button>
<button class="control-btn dial-btn" id="dialBtn" title="拨号">
<svg class="btn-icon" viewBox="0 0 24 24" fill="currentColor">
<path
@@ -124,6 +116,7 @@
<div class="settings-tabs">
<button class="tab-btn active" data-tab="device">设备配置</button>
<button class="tab-btn" data-tab="mcp">MCP工具</button>
<button class="tab-btn" data-tab="other">其他</button>
</div>
<div class="tab-content active" id="deviceTab">
@@ -186,6 +179,44 @@
</div>
</div>
</div>
<div class="tab-content" id="otherTab">
<div class="other-settings-panel">
<div class="control-panel">
<div class="config-row">
<div class="config-item">
<label>选择模型:</label>
<select id="live2dModelSelect" class="model-select">
<option value="hiyori_pro_zh">hiyori (春日)</option>
<option value="natori_pro_zh">natori (名取)</option>
</select>
</div>
</div>
<div class="config-row">
<div class="config-item">
<label></label>
<button class="control-btn" id="switchModelBtn" title="切换模型">
<svg class="btn-icon" viewBox="0 0 24 24" fill="currentColor">
<path
d="M12,18A6,6 0 0,1 6,12C6,11 6.25,10.03 6.7,9.2L5.24,7.74C4.46,8.97 4,10.43 4,12A8,8 0 0,0 12,20V23L16,19L12,15V18M12,4V1L8,5L12,9V6A6,6 0 0,1 18,12C18,13 17.75,13.97 17.3,14.8L18.76,16.26C19.54,15.03 20,13.57 20,12A8,8 0 0,0 12,4Z" />
</svg>
<span class="btn-text">切换模型</span>
</button>
</div>
<div class="config-item">
<label></label>
<button class="control-btn" id="backgroundBtn" title="切换背景">
<svg class="btn-icon" viewBox="0 0 24 24" fill="currentColor">
<path
d="M12,18A6,6 0 0,1 6,12C6,11 6.25,10.03 6.7,9.2L5.24,7.74C4.46,8.97 4,10.43 4,12A8,8 0 0,0 12,20V23L16,19L12,15V18M12,4V1L8,5L12,9V6A6,6 0 0,1 18,12C18,13 17.75,13.97 17.3,14.8L18.76,16.26C19.54,15.03 20,13.57 20,12A8,8 0 0,0 12,4Z" />
</svg>
<span class="btn-text">切换背景</span>
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>