Ниже все найденные параметры этой модели из [natori_pro_t06.cdi3.json](/home/alex/projects/face/420/model/natori_pro_en_face/natori_pro_t06.cdi3.json). В [natori_pro_t06.model3.json](/home/alex/projects/face/420/model/natori_pro_en_face/natori_pro_t06.model3.json) официально помечены только группы `LipSync -> ParamMouthOpenY` и `EyeBlink -> ParamEyeLOpen`, `ParamEyeROpen`. **Голова и взгляд** - `ParamAngleX` — поворот головы по X, влево-вправо. - `ParamAngleY` — поворот головы по Y, вверх-вниз. - `ParamAngleZ` — наклон головы. - `ParamEyeBallX` — направление зрачков по X. - `ParamEyeBallY` — направление зрачков по Y. - `ParamEyeBallForm` — форма/сжатие глазного яблока. **Глаза** - `ParamEyeLOpen` — открытие левого глаза. - `ParamEyeLSmile` — улыбка левым глазом. - `ParamEyeLForm` — деформация формы левого глаза. - `ParamEyeROpen` — открытие правого глаза. - `ParamEyeRSmile` — улыбка правым глазом. - `ParamEyeRForm` — деформация формы правого глаза. **Брови** - `ParamBrowLY` — положение левой брови по Y. - `ParamBrowRY` — положение правой брови по Y. - `ParamBrowLX` — положение левой брови по X. - `ParamBrowRX` — положение правой брови по X. - `ParamBrowLAngle` — угол левой брови. - `ParamBrowRAngle` — угол правой брови. - `ParamBrowLForm` — форма левой брови. - `ParamBrowLForm2` — дополнительная форма левой брови. - `ParamBrowRForm` — форма правой брови. - `ParamBrowRForm2` — дополнительная форма правой брови. **Рот и лицо** - `ParamMouthOpenY` — открытие рта. Это штатный `LipSync` параметр модели. - `ParamMouthForm` — форма рта. - `ParamMouthForm2` — дополнительная форма рта. - `ParamTeethOn` — показ зубов. - `ParamCheek` — румянец/щеки. **Очки** - `ParamGlassUD` — положение очков по Y. - `ParamGrassWhite` — белая часть/засветка очков. - `ParamGrassHighlight` — отображение блика очков. - `ParamGrassHighlightMove` — движение блика очков. **Тело и дыхание** - `ParamBodyAngleX` — поворот тела по X. - `ParamBodyAngleY` — поворот тела по Y. - `ParamBodyAngleZ` — поворот тела по Z. - `ParamWaistAngleZ` — вращение талии по Z. - `ParamBodyPosition` — подача корпуса вперед-назад. - `ParamBreath` — дыхание. - `ParamLeftShoulderUp` — подъём левого плеча. - `ParamRightShoulderUp` — подъём правого плеча. **Общее смещение** - `ParamAllX` — общее смещение модели по X. - `ParamAllY` — общее смещение модели по Y. - `ParamAllRotate` — общий поворот модели. **Волосы** - `ParamHairFront` — движение передних волос. - `ParamHairSide` — движение боковых волос. - `ParamHairBack` — движение задних волос. - `ParamHairFrontFuwa` — пушистость передних волос. - `ParamHairSideFuwa` — пушистость боковых волос. - `ParamHairBackFuwa` — пушистость задних волос. **Одежда и аксессуары** - `ParamJacket` — движение полы/части куртки. - `ParamChainWaist` — движение цепочки на поясе. - `ParamWatchSwingA1` — движение часов A 1. - `ParamWatchSwingA2` — движение часов A 2. - `ParamWatchBChain` — движение цепочки часов B. - `ParamWatchAX` — поперечный поворот часов A. - `ParamWatchBSwitch` — переключатель часов B. - `ParamWatchBOpen` — открытие крышки часов B. - `ParamWatchBOpen2` — открытие внутренней части часов B. - `ParamWatchBX` — поперечный поворот часов B. - `ParamWatchBRoll` — вращение часов B. - `ParamWatchBLR` — часы B left-right. - `ParamWatchBUD` — часы B up-down. **Руки и кисти** - `ParamArmAL01` — левая рука A, плечо. - `ParamArmAL02` — левая рука A, локоть. - `ParamArmAL03` — левая рука A, запястье. - `ParamArmAL04` — левая рука A, предплечье вперед-назад. - `ParamArmAR01` — левая рука A, поворот плеча. - `ParamArmAR02` — левая рука A, поворот локтя. - `ParamArmAR03` — левая рука A, поворот запястья. - `ParamArmAR04` — левая рука A, предплечье вперед-назад. - `ParamArmBR01` — правая рука B, поворот плеча. - `ParamArmBR02` — правая рука B, поворот локтя. - `ParamArmBR03` — правая рука B, поворот запястья. - `ParamArmBRHand01` — показ пальца/кисти R 01. - `ParamArmBRHand01Roll` — сгиб пальца R 01. - `ParamArmBRHand05` — показ кисти/пальца R 05. - `ParamArmBRHand05Roll1` — сгиб пальца R 05, сустав 1. - `ParamArmBRHand05Roll2` — сгиб пальца R 05, сустав 2. - `ParamArmBRHand05Roll3` — сгиб пальца R 05, сустав 3. - `ParamArmCR01` — левая рука C, поворот плеча. - `ParamArmCR02` — левая рука C, поворот локтя. - `ParamArmCR03` — левая рука C, поворот запястья. - `ParamArmCLHandRoll1` — левая рука C, сгиб пальца. - `ParamArmDL01` — левая рука D, поворот плеча. - `ParamArmDL02` — левая рука D, поворот локтя. - `ParamArmDL03` — левая рука D, поворот запястья. - `ParamArmDLHand03Roll` — левая кисть, сгиб пальца 03. - `ParamArmER01` — правая рука E, плечо/локоть. - `ParamArmER02` — правая рука E, поворот локтя. - `ParamArmER03` — правая рука E, поворот запястья. - `ParamArmER04` — длина правой руки E. - `ParamArmERHand04` — правая кисть/палец 04. - `ParamArmERHand04Roll1` — сгиб пальца 04, сустав 1. - `ParamArmERHand04Roll2` — сгиб пальца 04, сустав 2. - `ParamArmERHand06` — правая кисть/палец 06. - `ParamArmERHand06Roll1` — сгиб пальца 06, сустав 1. - `ParamArmERHand06Roll2` — сгиб пальца 06, сустав 2. Для твоих текущих задач самые полезные параметры обычно такие: - `ParamAngleX`, `ParamAngleY`, `ParamAngleZ` - `ParamEyeBallX`, `ParamEyeBallY` - `ParamEyeLOpen`, `ParamEyeROpen` - `ParamMouthOpenY`, `ParamMouthForm`, `ParamMouthForm2`, `ParamTeethOn` - `ParamBodyAngleX`, `ParamBodyAngleY`, `ParamBodyAngleZ` - `ParamBreath` Если хочешь, следующим сообщением могу дать готовую “шпаргалку” именно по диапазонам и практическому применению этих параметров для JS-анимации. Вот короткая практическая шпаргалка по самым полезным параметрам этой модели для JS-анимации. **Поворот и взгляд** - `ParamAngleX`: обычно `-30..30` Использовать для поворота головы влево-вправо. - `ParamAngleY`: обычно `-30..30` Для наклона головы вверх-вниз. - `ParamAngleZ`: обычно `-30..30` Для наклона головы вбок. - `ParamEyeBallX`: обычно `-1..1` Для движения зрачков по горизонтали. - `ParamEyeBallY`: обычно `-1..1` Для движения зрачков по вертикали. **Глаза** - `ParamEyeLOpen`, `ParamEyeROpen`: обычно `0..1` `1` открыто, `0` закрыто. Подходит для моргания. - `ParamEyeLSmile`, `ParamEyeRSmile`: обычно `0..1` Для улыбающихся глаз. - `ParamEyeLForm`, `ParamEyeRForm`: обычно `-1..1` Для более тонкой деформации формы глаз. **Рот** - `ParamMouthOpenY`: обычно `0..1` Основной параметр lip sync. - `ParamMouthForm`: обычно `-1..1` Форма рта: растянутый/округлый, зависит от рига. - `ParamMouthForm2`: обычно `-1..1` или мягко `0..1` Дополнительная форма, лучше добавлять осторожно. - `ParamTeethOn`: обычно `0..1` Часто удобно использовать как переключатель: `0` или `1`. Практика для lip sync: ```js ParamMouthOpenY = open; ParamTeethOn = open > 0.2 ? 1 : 0; ParamMouthForm = form; ParamMouthForm2 = open * 0.2; ``` **Брови** - `ParamBrowLY`, `ParamBrowRY`: обычно `-1..1` Поднять/опустить брови. - `ParamBrowLAngle`, `ParamBrowRAngle`: обычно `-1..1` Делают выражение более злым/удивлённым. - `ParamBrowLForm`, `ParamBrowRForm`: обычно `-1..1` Тонкая форма эмоции. **Тело** - `ParamBodyAngleX`, `ParamBodyAngleY`, `ParamBodyAngleZ`: обычно слабее головы Хорошо использовать примерно в `30-50%` от головы. Пример: ```js bodyX = headX * 0.3; bodyY = headY * 0.3; bodyZ = headZ * 0.2; ``` **Дыхание** - `ParamBreath`: часто `0..1` Можно качать синусом: ```js const breath = (Math.sin(time * 2) + 1) * 0.5; ``` **Общее смещение** - `ParamAllX`, `ParamAllY`: небольшие значения, лучше очень осторожно - `ParamAllRotate`: маленькие значения Полезно для лёгкого “живого” дрейфа модели. **Волосы и аксессуары** - `ParamHairFront`, `ParamHairSide`, `ParamHairBack` - `ParamHairFrontFuwa`, `ParamHairSideFuwa`, `ParamHairBackFuwa` Лучше использовать с очень маленькой амплитудой и плавностью. - Часы, цепочки, куртка: только для спецанимаций, не для базового трекинга. **Рекомендации по использованию** - Не дёргай много параметров сразу с полной амплитудой. - Для головы и тела всегда делай тело слабее головы. - Для рта разделяй: - громкость -> `ParamMouthOpenY` - спектр/форма -> `ParamMouthForm` - порог открытия -> `ParamTeethOn` - Все быстрые сигналы сглаживай. Хороший базовый набор для “живой” модели: - `ParamAngleX` - `ParamAngleY` - `ParamEyeBallX` - `ParamEyeBallY` - `ParamMouthOpenY` - `ParamMouthForm` - `ParamTeethOn` - `ParamBreath` - `ParamBodyAngleX` - `ParamBodyAngleY` Если хочешь, следующим сообщением я могу сделать тебе готовую таблицу именно в формате: `параметр -> безопасный диапазон -> для чего использовать -> пример формулы`. **Шпаргалка** `ParamAngleX` -> `-30..30` -> поворот головы влево-вправо -> `headX = pointerX * 30` `ParamAngleY` -> `-30..30` -> поворот головы вверх-вниз -> `headY = pointerY * 30` `ParamAngleZ` -> `-30..30` -> наклон головы -> `headZ = pointerX * -10` `ParamEyeBallX` -> `-1..1` -> взгляд по горизонтали -> `eyeX = pointerX` `ParamEyeBallY` -> `-1..1` -> взгляд по вертикали -> `eyeY = pointerY` `ParamEyeLOpen` -> `0..1` -> открытие левого глаза -> `blinkL = isBlink ? 0 : 1` `ParamEyeROpen` -> `0..1` -> открытие правого глаза -> `blinkR = isBlink ? 0 : 1` `ParamEyeLSmile` -> `0..1` -> улыбка левым глазом -> `eyeSmile = smile * 0.7` `ParamEyeRSmile` -> `0..1` -> улыбка правым глазом -> `eyeSmile = smile * 0.7` `ParamEyeLForm` -> `-1..1` -> форма левого глаза -> `eyeForm = emotion` `ParamEyeRForm` -> `-1..1` -> форма правого глаза -> `eyeForm = emotion` `ParamBrowLY` -> `-1..1` -> поднять/опустить левую бровь -> `browY = surprise * 0.8 - sad * 0.5` `ParamBrowRY` -> `-1..1` -> поднять/опустить правую бровь -> `browY = surprise * 0.8 - sad * 0.5` `ParamBrowLAngle` -> `-1..1` -> угол левой брови -> `browAngle = angry * 0.8` `ParamBrowRAngle` -> `-1..1` -> угол правой брови -> `browAngle = angry * 0.8` `ParamBrowLForm` -> `-1..1` -> форма левой брови -> `browForm = emotion` `ParamBrowRForm` -> `-1..1` -> форма правой брови -> `browForm = emotion` `ParamBrowLForm2` -> `-1..1` -> доп. форма левой брови -> `browForm2 = emotion * 0.5` `ParamBrowRForm2` -> `-1..1` -> доп. форма правой брови -> `browForm2 = emotion * 0.5` `ParamMouthOpenY` -> `0..1` -> открытие рта, основной lip sync -> `mouthOpen = audioLevel` `ParamMouthForm` -> `-1..1` -> форма рта, округлый/растянутый -> `mouthForm = spectralBrightness * 1.2 - 0.6` `ParamMouthForm2` -> `-1..1` или мягко `0..0.5` -> дополнительная форма рта -> `mouthForm2 = mouthOpen * 0.25` `ParamTeethOn` -> `0..1` -> показ зубов -> `teeth = mouthOpen > 0.2 ? 1 : 0` `ParamCheek` -> `0..1` -> румянец/щеки -> `cheek = embarrassment` `ParamBodyAngleX` -> примерно `-10..10` -> поворот корпуса по X -> `bodyX = headX * 0.3` `ParamBodyAngleY` -> примерно `-10..10` -> поворот корпуса по Y -> `bodyY = headY * 0.3` `ParamBodyAngleZ` -> примерно `-10..10` -> наклон корпуса -> `bodyZ = headZ * 0.3` `ParamWaistAngleZ` -> примерно `-10..10` -> поворот талии -> `waistZ = sway * 0.5` `ParamBodyPosition` -> зависит от рига, обычно маленькая амплитуда -> подача корпуса вперёд-назад -> `bodyPos = idleWave * 0.2` `ParamBreath` -> `0..1` -> дыхание -> `breath = (Math.sin(t * 2) + 1) / 2` `ParamLeftShoulderUp` -> `-1..1` -> левое плечо вверх-вниз -> `shoulderL = breath * 0.2` `ParamRightShoulderUp` -> `-1..1` -> правое плечо вверх-вниз -> `shoulderR = breath * 0.2` `ParamAllX` -> маленькая амплитуда -> общее смещение по X -> `allX = idleSwayX * 0.1` `ParamAllY` -> маленькая амплитуда -> общее смещение по Y -> `allY = idleSwayY * 0.1` `ParamAllRotate` -> маленькая амплитуда -> общий поворот -> `allRotate = idleRotate * 0.1` `ParamHairFront` -> маленькая амплитуда -> движение передних волос -> `hairFront = headX * 0.1` `ParamHairSide` -> маленькая амплитуда -> движение боковых волос -> `hairSide = headX * 0.1` `ParamHairBack` -> маленькая амплитуда -> движение задних волос -> `hairBack = bodyY * 0.1` `ParamHairFrontFuwa` -> `0..1` или малая амплитуда -> пушистость передних волос -> `hairFuwa = idle * 0.1` `ParamHairSideFuwa` -> `0..1` или малая амплитуда -> пушистость боковых волос -> `hairFuwa = idle * 0.1` `ParamHairBackFuwa` -> `0..1` или малая амплитуда -> пушистость задних волос -> `hairFuwa = idle * 0.1` **Практические наборы** Для pointer tracking: - `ParamAngleX` - `ParamAngleY` - `ParamEyeBallX` - `ParamEyeBallY` - `ParamBodyAngleX` - `ParamBodyAngleY` Для lip sync: - `ParamMouthOpenY` - `ParamMouthForm` - `ParamMouthForm2` - `ParamTeethOn` Для idle: - `ParamBreath` - `ParamBodyPosition` - `ParamAllY` - `ParamHairFrontFuwa` - `ParamHairSideFuwa` Если хочешь, следующим сообщением могу сделать ещё более полезную вещь: готовый JS preset “idle + pointer tracking + blink + lipsync” именно для этой модели. Ниже хороший базовый preset именно для этой модели: idle + pointer tracking + blink + lipsync const state = { pointerX: 0, pointerY: 0, blink: 1, lipOpen: 0, lipForm: 0, teeth: 0, }; window.addEventListener("pointermove", (e) => { state.pointerX = (e.clientX / window.innerWidth - 0.5) * 2; state.pointerY = (e.clientY / window.innerHeight - 0.5) * 2; }); function clamp(value, min, max) { return Math.max(min, Math.min(max, value)); } function setParam(coreModel, id, value) { coreModel.setParameterValueById(id, value); } function installModelPreset(app, model) { let nextBlinkAt = performance.now() + 1500; let blinkStartAt = 0; let blinking = false; app.ticker.add(() => { const now = performance.now() / 1000; const coreModel = model.internalModel.coreModel; const px = clamp(state.pointerX, -1, 1); const py = clamp(state.pointerY, -1, 1); const headX = px * 28; const headY = -py * 20; const headZ = -px * 8; const bodyX = headX * 0.25; const bodyY = headY * 0.15; const bodyZ = headZ * 0.2; const breath = (Math.sin(now * 2.2) + 1) * 0.5; const idleY = Math.sin(now * 1.4) * 0.08; const hairFuwa = (Math.sin(now * 1.7) + 1) * 0.5 * 0.12; if (!blinking && performance.now() >= nextBlinkAt) { blinking = true; blinkStartAt = performance.now(); nextBlinkAt = performance.now() + 2500 + Math.random() * 2500; } if (blinking) { const t = (performance.now() - blinkStartAt) / 180; if (t >= 1) { blinking = false; state.blink = 1; } else { state.blink = t < 0.5 ? 1 - t * 2 : (t - 0.5) * 2; } } setParam(coreModel, "ParamAngleX", headX); setParam(coreModel, "ParamAngleY", headY); setParam(coreModel, "ParamAngleZ", headZ); setParam(coreModel, "ParamEyeBallX", px); setParam(coreModel, "ParamEyeBallY", -py); setParam(coreModel, "ParamBodyAngleX", bodyX); setParam(coreModel, "ParamBodyAngleY", bodyY); setParam(coreModel, "ParamBodyAngleZ", bodyZ); setParam(coreModel, "ParamEyeLOpen", state.blink); setParam(coreModel, "ParamEyeROpen", state.blink); setParam(coreModel, "ParamBreath", breath); setParam(coreModel, "ParamAllY", idleY); setParam(coreModel, "ParamHairFrontFuwa", hairFuwa); setParam(coreModel, "ParamHairSideFuwa", hairFuwa * 0.9); setParam(coreModel, "ParamHairBackFuwa", hairFuwa * 0.7); setParam(coreModel, "ParamMouthOpenY", clamp(state.lipOpen, 0, 1)); setParam(coreModel, "ParamMouthForm", clamp(state.lipForm, -1, 1)); setParam(coreModel, "ParamMouthForm2", clamp(state.lipOpen * 0.25, 0, 1)); setParam(coreModel, "ParamTeethOn", state.teeth ? 1 : 0); }); } Как использовать: в pointermove уже заполняется state.pointerX/Y из lipsync.js обновляй: state.lipOpen = window.live2dState.lipSyncValue; state.lipForm = window.live2dState.lipSyncForm; state.teeth = window.live2dState.lipSyncValue > 0.2 ? 1 : 0; после загрузки модели вызови: installModelPreset(app, model); Если хочешь, я могу следующим сообщением сразу адаптировать этот preset именно под твой текущий live2d.js.