From a8454b4a449c2aab82a7ced47ab80aa8e1635965 Mon Sep 17 00:00:00 2001 From: Lilia_Chen Date: Mon, 21 Jul 2025 12:17:06 +0100 Subject: [PATCH] feat(stage-ui): VRM model setting page: FOV and Rotation (#307) --------- Co-authored-by: Neko --- packages/i18n/src/locales/en/settings.yaml | 4 +- .../i18n/src/locales/zh-Hans/settings.yaml | 4 +- .../Scenarios/Settings/ModelSettings/VRM.vue | 230 ++++++++++++------ .../stage-ui/src/components/Scenes/VRM.vue | 86 +++++-- .../src/components/Scenes/VRM/Model.vue | 79 ++++-- .../components/Scenes/VRM/OrbitControls.vue | 47 ++++ .../src/components/Scenes/VRM/index.ts | 1 + packages/stage-ui/src/composables/vrm/core.ts | 29 ++- packages/stage-ui/src/stores/vrm.ts | 17 +- 9 files changed, 362 insertions(+), 135 deletions(-) create mode 100644 packages/stage-ui/src/components/Scenes/VRM/OrbitControls.vue diff --git a/packages/i18n/src/locales/en/settings.yaml b/packages/i18n/src/locales/en/settings.yaml index 8af7636fd..c792f3240 100644 --- a/packages/i18n/src/locales/en/settings.yaml +++ b/packages/i18n/src/locales/en/settings.yaml @@ -562,8 +562,10 @@ vrm: title: Scale And Position scale: Scale x: X Offset - y: Y Offset + 'y': Y Offset z: Z Offset + fov: FOV (degree) + rotation-y: Rotation (Y-axis) switch-to-vrm: title: Switch to Live2D Avatar? change-to-vrm: Click here to switch to the Live2D avatar setting diff --git a/packages/i18n/src/locales/zh-Hans/settings.yaml b/packages/i18n/src/locales/zh-Hans/settings.yaml index 787406b68..c08b53358 100644 --- a/packages/i18n/src/locales/zh-Hans/settings.yaml +++ b/packages/i18n/src/locales/zh-Hans/settings.yaml @@ -538,8 +538,10 @@ vrm: title: 缩放与位置 scale: 缩放 x: X轴偏移 - y: Y 轴偏移 + 'y': Y 轴偏移 z: Z轴偏移 + fov: 视角调整(度) + rotation-y: 模型朝向(Y轴旋转) switch-to-vrm: title: 想切换至Live2D虚拟形象? change-to-vrm: 切换至Live2D虚拟形象设定页面 diff --git a/packages/stage-ui/src/components/Scenarios/Settings/ModelSettings/VRM.vue b/packages/stage-ui/src/components/Scenarios/Settings/ModelSettings/VRM.vue index bd0174e28..2b63670bb 100644 --- a/packages/stage-ui/src/components/Scenarios/Settings/ModelSettings/VRM.vue +++ b/packages/stage-ui/src/components/Scenarios/Settings/ModelSettings/VRM.vue @@ -31,9 +31,11 @@ const { loadSource, loadingModel, modelUrl, - scale, modelSize, modelOffset, + cameraFOV, + selectedModel, + modelRotationY, } = storeToRefs(vrm) const localModelUrl = ref(modelUrl.value) @@ -42,8 +44,28 @@ modelFileDialog.onChange((files) => { modelFile.value = files[0] loadSource.value = 'file' loadingModel.value = true + localModelUrl.value = '' } }) + +function urlUploadClick() { + modelUrl.value = localModelUrl.value + // same URL will let the loader be lazy and forgot to reset loading state + // If the loading state is still true, then the URL input will be locked + if (modelUrl.value === selectedModel.value) { + console.warn('Model URL is the same as the selected model, no need to reload.') + return + } + // Can't let the default model URL be reentered into the loader, otherwise it will still be too lazy to reset the loading state + if (!modelUrl.value && selectedModel.value === vrm.defaultModelUrl) { + localModelUrl.value = vrm.defaultModelUrl + return + } + // Only when real different URL is entered, then the loader will be triggered + loadSource.value = 'url' + loadingModel.value = true + localModelUrl.value = selectedModel.value +} { - -
- -
- - -
-
-
- - + + + + + +
diff --git a/packages/stage-ui/src/components/Scenes/VRM.vue b/packages/stage-ui/src/components/Scenes/VRM.vue index 9dffa057e..e21b192fc 100644 --- a/packages/stage-ui/src/components/Scenes/VRM.vue +++ b/packages/stage-ui/src/components/Scenes/VRM.vue @@ -1,34 +1,68 @@ diff --git a/packages/stage-ui/src/components/Scenes/VRM/Model.vue b/packages/stage-ui/src/components/Scenes/VRM/Model.vue index 25536e6e1..1a8631f95 100644 --- a/packages/stage-ui/src/components/Scenes/VRM/Model.vue +++ b/packages/stage-ui/src/components/Scenes/VRM/Model.vue @@ -1,12 +1,12 @@