From 5a7ba56d6b745277f7b792a61408424d4c2c5578 Mon Sep 17 00:00:00 2001 From: gonnavis Date: Mon, 27 Feb 2023 14:00:53 +0800 Subject: [PATCH 01/13] Exported hard-coded springBone datas. --- src/components/Selector.jsx | 1 + src/library/VRMExporterv0.js | 5 +++-- src/library/download-utils.js | 1 + src/library/utils.js | 1 + 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/components/Selector.jsx b/src/components/Selector.jsx index 22995245..3a1a018a 100644 --- a/src/components/Selector.jsx +++ b/src/components/Selector.jsx @@ -281,6 +281,7 @@ export default function Selector({templateInfo, animationManager, blinkManager, const loadedModels = []; getAsArray(option?.item?.directory).map((modelDir, i) => { gltfLoader.loadAsync (baseDir + modelDir).then((mod) => { + // debugger // mark loadedModels[i] = mod; }) }) diff --git a/src/library/VRMExporterv0.js b/src/library/VRMExporterv0.js index fec08cac..7aa3b860 100644 --- a/src/library/VRMExporterv0.js +++ b/src/library/VRMExporterv0.js @@ -417,7 +417,8 @@ export default class VRMExporterv0 { //const outputVrmMeta = ToOutputVRMMeta(vrmMeta, icon, outputImages); const outputVrmMeta = vrmMeta; - //const outputSecondaryAnimation = toOutputSecondaryAnimation(springBone, nodeNames); + // const outputSecondaryAnimation = toOutputSecondaryAnimation(springBone, nodeNames); + const outputSecondaryAnimation = {"boneGroups":[{"bones":[45,49,51,53,55,57,60,62,64,67,70,72,74,76,78,81,83,85,88,90,92,94,97,99],"center":-1,"colliderGroups":[0,1,2],"dragForce":0.452,"gravityDir":{"x":0,"y":0,"z":0},"gravityPower":0,"hitRadius":0.02,"stiffiness":1},{"bones":[21],"center":-1,"colliderGroups":[],"dragForce":1,"gravityDir":{"x":0,"y":-1,"z":0},"gravityPower":0,"hitRadius":0.02,"stiffiness":3.32}],"colliderGroups":[{"colliders":[{"offset":{"x":-0.06999998,"y":-0.0544500351,"z":0.00253520347},"radius":0.05}],"node":24},{"colliders":[{"offset":{"x":-1.13197887e-8,"y":0.0599999428,"z":0.0395975038},"radius":0.04}],"node":44},{"colliders":[{"offset":{"x":0.07000001,"y":-0.0544500351,"z":0.002535183},"radius":0.05}],"node":101}]}; const bufferViews = []; bufferViews.push(...images.map((image) => ({ buffer: imageBitmap2png(image.imageBitmap), @@ -479,7 +480,7 @@ export default class VRMExporterv0 { materialProperties, humanoid: vrmHumanoid, meta: outputVrmMeta, - //secondaryAnimation: outputSecondaryAnimation, + secondaryAnimation: outputSecondaryAnimation, specVersion: "0.0" }, }, diff --git a/src/library/download-utils.js b/src/library/download-utils.js index 78023102..5cbc7123 100644 --- a/src/library/download-utils.js +++ b/src/library/download-utils.js @@ -181,6 +181,7 @@ function parseVRM (glbModel, avatar, isVrm0 = false){ skinnedMesh.skeleton.calculateInverses(); skinnedMesh.skeleton.computeBoneTexture(); skinnedMesh.skeleton.update(); + // debugger exporter.parse(vrmData, glbModel, (vrm) => { resolve(vrm) }) diff --git a/src/library/utils.js b/src/library/utils.js index 509eb894..01f38bc9 100644 --- a/src/library/utils.js +++ b/src/library/utils.js @@ -37,6 +37,7 @@ export async function loadModel(file, onProgress) { return new VRMLoaderPlugin(parser) }) return gltfLoader.loadAsync(file, onProgress).then((model) => { + // debugger const vrm = model.userData.vrm renameVRMBones(vrm) From db8f86087137caed0303c496cbe919c3f3ed56b8 Mon Sep 17 00:00:00 2001 From: gonnavis Date: Thu, 2 Mar 2023 23:02:22 +0800 Subject: [PATCH 02/13] Format. --- src/library/VRMExporterv0.js | 45 +++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/src/library/VRMExporterv0.js b/src/library/VRMExporterv0.js index 7aa3b860..f0ed6e62 100644 --- a/src/library/VRMExporterv0.js +++ b/src/library/VRMExporterv0.js @@ -418,7 +418,50 @@ export default class VRMExporterv0 { //const outputVrmMeta = ToOutputVRMMeta(vrmMeta, icon, outputImages); const outputVrmMeta = vrmMeta; // const outputSecondaryAnimation = toOutputSecondaryAnimation(springBone, nodeNames); - const outputSecondaryAnimation = {"boneGroups":[{"bones":[45,49,51,53,55,57,60,62,64,67,70,72,74,76,78,81,83,85,88,90,92,94,97,99],"center":-1,"colliderGroups":[0,1,2],"dragForce":0.452,"gravityDir":{"x":0,"y":0,"z":0},"gravityPower":0,"hitRadius":0.02,"stiffiness":1},{"bones":[21],"center":-1,"colliderGroups":[],"dragForce":1,"gravityDir":{"x":0,"y":-1,"z":0},"gravityPower":0,"hitRadius":0.02,"stiffiness":3.32}],"colliderGroups":[{"colliders":[{"offset":{"x":-0.06999998,"y":-0.0544500351,"z":0.00253520347},"radius":0.05}],"node":24},{"colliders":[{"offset":{"x":-1.13197887e-8,"y":0.0599999428,"z":0.0395975038},"radius":0.04}],"node":44},{"colliders":[{"offset":{"x":0.07000001,"y":-0.0544500351,"z":0.002535183},"radius":0.05}],"node":101}]}; + const outputSecondaryAnimation = { + "boneGroups": [ + { + "bones": [ 45, 49, 51, 53, 55, 57, 60, 62, 64, 67, 70, 72, 74, 76, 78, 81, 83, 85, 88, 90, 92, 94, 97, 99 ], + "center": -1, + "colliderGroups": [ 0, 1, 2 ], + "dragForce": 0.452, + "gravityDir": { "x": 0, "y": 0, "z": 0 }, + "gravityPower": 0, + "hitRadius": 0.02, + "stiffiness": 1 + }, + { + "bones": [ 21 ], + "center": -1, + "colliderGroups": [], + "dragForce": 1, + "gravityDir": { "x": 0, "y": -1, "z": 0 }, + "gravityPower": 0, + "hitRadius": 0.02, + "stiffiness": 3.32 + } + ], + "colliderGroups": [ + { + "colliders": [ + { "offset": { "x": -0.06999998, "y": -0.0544500351, "z": 0.00253520347 }, "radius": 0.05 } + ], + "node": 24 + }, + { + "colliders": [ + { "offset": { "x": -1.13197887e-8, "y": 0.0599999428, "z": 0.0395975038 }, "radius": 0.04 } + ], + "node": 44 + }, + { + "colliders": [ + { "offset": { "x": 0.07000001, "y": -0.0544500351, "z": 0.002535183 }, "radius": 0.05 } + ], + "node": 101 + } + ] + }; const bufferViews = []; bufferViews.push(...images.map((image) => ({ buffer: imageBitmap2png(image.imageBitmap), From a1af3aa425ec1e4887d5b3f455d45e42cfe499db Mon Sep 17 00:00:00 2001 From: gonnavis Date: Sat, 4 Mar 2023 21:18:15 +0800 Subject: [PATCH 03/13] ok!!!: Added correct springBone index. --- src/library/VRMExporterv0.js | 55 +++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/src/library/VRMExporterv0.js b/src/library/VRMExporterv0.js index f0ed6e62..ac9b8b51 100644 --- a/src/library/VRMExporterv0.js +++ b/src/library/VRMExporterv0.js @@ -418,10 +418,62 @@ export default class VRMExporterv0 { //const outputVrmMeta = ToOutputVRMMeta(vrmMeta, icon, outputImages); const outputVrmMeta = vrmMeta; // const outputSecondaryAnimation = toOutputSecondaryAnimation(springBone, nodeNames); + // const outputSecondaryAnimation = { + // "boneGroups": [ + // { + // "bones": [ 45, 49, 51, 53, 55, 57, 60, 62, 64, 67, 70, 72, 74, 76, 78, 81, 83, 85, 88, 90, 92, 94, 97, 99 ], + // "center": -1, + // "colliderGroups": [ 0, 1, 2 ], + // "dragForce": 0.452, + // "gravityDir": { "x": 0, "y": 0, "z": 0 }, + // "gravityPower": 0, + // "hitRadius": 0.02, + // "stiffiness": 1 + // }, + // { + // "bones": [ 21 ], + // "center": -1, + // "colliderGroups": [], + // "dragForce": 1, + // "gravityDir": { "x": 0, "y": -1, "z": 0 }, + // "gravityPower": 0, + // "hitRadius": 0.02, + // "stiffiness": 3.32 + // } + // ], + // "colliderGroups": [ + // { + // "colliders": [ + // { "offset": { "x": -0.06999998, "y": -0.0544500351, "z": 0.00253520347 }, "radius": 0.05 } + // ], + // "node": 24 + // }, + // { + // "colliders": [ + // { "offset": { "x": -1.13197887e-8, "y": 0.0599999428, "z": 0.0395975038 }, "radius": 0.04 } + // ], + // "node": 44 + // }, + // { + // "colliders": [ + // { "offset": { "x": 0.07000001, "y": -0.0544500351, "z": 0.002535183 }, "radius": 0.05 } + // ], + // "node": 101 + // } + // ] + // }; + + debugger + const bones = []; + nodes.forEach((node, i) => { + if(node.name === 'L_Hair5_Bang' || node.name === 'R_Hair5_Bang' || node.name === 'Hair5_Front_Bang') { + bones.push(i); + } + }); const outputSecondaryAnimation = { "boneGroups": [ { - "bones": [ 45, 49, 51, 53, 55, 57, 60, 62, 64, 67, 70, 72, 74, 76, 78, 81, 83, 85, 88, 90, 92, 94, 97, 99 ], + "bones": bones, "center": -1, "colliderGroups": [ 0, 1, 2 ], "dragForce": 0.452, @@ -462,6 +514,7 @@ export default class VRMExporterv0 { } ] }; + const bufferViews = []; bufferViews.push(...images.map((image) => ({ buffer: imageBitmap2png(image.imageBitmap), From f6ab658f91324484f119903ef4cadf70bd216153 Mon Sep 17 00:00:00 2001 From: gonnavis Date: Sun, 5 Mar 2023 18:48:04 +0800 Subject: [PATCH 04/13] Export all types of hair `springBone`s. --- src/library/VRMExporterv0.js | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/library/VRMExporterv0.js b/src/library/VRMExporterv0.js index ac9b8b51..c881cb26 100644 --- a/src/library/VRMExporterv0.js +++ b/src/library/VRMExporterv0.js @@ -464,16 +464,29 @@ export default class VRMExporterv0 { // }; debugger - const bones = []; - nodes.forEach((node, i) => { - if(node.name === 'L_Hair5_Bang' || node.name === 'R_Hair5_Bang' || node.name === 'Hair5_Front_Bang') { - bones.push(i); - } + const rootSpringBones = []; + const headBone = nodes.filter(node => node.name === 'head')[0]; + headBone.children.forEach(hairTypeGroup => { + if (hairTypeGroup.name === 'leftEye' || hairTypeGroup.name === 'rightEye') return; + hairTypeGroup.children.forEach(rootSpringBone => { // todo: performance: only export the hairTypeGroup of current selected hair. + for (let i = 0; i < nodes.length; i++) { + const node = nodes[i]; + if (node.name === rootSpringBone.name) { + rootSpringBones.push(i); + break; + } + } + }) }); + // nodes.forEach((node, i) => { + // if(node.name === 'L_Hair5_Bang' || node.name === 'R_Hair5_Bang' || node.name === 'Hair5_Front_Bang') { + // rootSpringBones.push(i); + // } + // }); const outputSecondaryAnimation = { "boneGroups": [ { - "bones": bones, + "bones": rootSpringBones, "center": -1, "colliderGroups": [ 0, 1, 2 ], "dragForce": 0.452, From 1bf272dd6ffa45329674b6783ec9610fa03a6a0c Mon Sep 17 00:00:00 2001 From: gonnavis Date: Mon, 6 Mar 2023 16:19:27 +0800 Subject: [PATCH 05/13] Exclude Jaw. --- src/library/VRMExporterv0.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/library/VRMExporterv0.js b/src/library/VRMExporterv0.js index c881cb26..e94aff29 100644 --- a/src/library/VRMExporterv0.js +++ b/src/library/VRMExporterv0.js @@ -467,7 +467,7 @@ export default class VRMExporterv0 { const rootSpringBones = []; const headBone = nodes.filter(node => node.name === 'head')[0]; headBone.children.forEach(hairTypeGroup => { - if (hairTypeGroup.name === 'leftEye' || hairTypeGroup.name === 'rightEye') return; + if (hairTypeGroup.name === 'leftEye' || hairTypeGroup.name === 'rightEye' || hairTypeGroup.name === 'Jaw') return; hairTypeGroup.children.forEach(rootSpringBone => { // todo: performance: only export the hairTypeGroup of current selected hair. for (let i = 0; i < nodes.length; i++) { const node = nodes[i]; From f740664a11dab51fec65cd8ab32840ecb5517bca Mon Sep 17 00:00:00 2001 From: gonnavis Date: Mon, 6 Mar 2023 16:53:44 +0800 Subject: [PATCH 06/13] Move `rootSpringBones` selecting codes outside of `VRMExporterv0.js`. --- src/library/VRMExporterv0.js | 28 +++++++++------------ src/library/download-utils.js | 46 ++++++++++++++++++++++++----------- 2 files changed, 44 insertions(+), 30 deletions(-) diff --git a/src/library/VRMExporterv0.js b/src/library/VRMExporterv0.js index e94aff29..b23dbdf3 100644 --- a/src/library/VRMExporterv0.js +++ b/src/library/VRMExporterv0.js @@ -97,7 +97,7 @@ function getVRM0BoneName(name){ return name; } export default class VRMExporterv0 { - parse(vrm, avatar, onDone) { + parse(vrm, avatar, rootSpringBones, onDone) { const vrmMeta = convertMetaToVRM0(vrm.meta); const humanoid = convertHumanoidToVRM0(vrm.humanoid); @@ -464,29 +464,25 @@ export default class VRMExporterv0 { // }; debugger - const rootSpringBones = []; - const headBone = nodes.filter(node => node.name === 'head')[0]; - headBone.children.forEach(hairTypeGroup => { - if (hairTypeGroup.name === 'leftEye' || hairTypeGroup.name === 'rightEye' || hairTypeGroup.name === 'Jaw') return; - hairTypeGroup.children.forEach(rootSpringBone => { // todo: performance: only export the hairTypeGroup of current selected hair. - for (let i = 0; i < nodes.length; i++) { - const node = nodes[i]; - if (node.name === rootSpringBone.name) { - rootSpringBones.push(i); - break; - } + const rootSpringBonesIndexes = []; + rootSpringBones.forEach(rootSpringBone => { + for (let i = 0; i < nodes.length; i++) { + const node = nodes[i]; + if (node.name === rootSpringBone.name) { + rootSpringBonesIndexes.push(i); + break; } - }) - }); + } + }) // nodes.forEach((node, i) => { // if(node.name === 'L_Hair5_Bang' || node.name === 'R_Hair5_Bang' || node.name === 'Hair5_Front_Bang') { - // rootSpringBones.push(i); + // rootSpringBonesIndexes.push(i); // } // }); const outputSecondaryAnimation = { "boneGroups": [ { - "bones": rootSpringBones, + "bones": rootSpringBonesIndexes, "center": -1, "colliderGroups": [ 0, 1, 2 ], "dragForce": 0.452, diff --git a/src/library/download-utils.js b/src/library/download-utils.js index 0be5e609..02f6f9cd 100644 --- a/src/library/download-utils.js +++ b/src/library/download-utils.js @@ -157,25 +157,43 @@ function parseVRM (glbModel, avatar, isVrm0 = false){ ...getVRMBaseData(avatar), ...getAvatarData(glbModel, "CharacterCreator"), } + let skinnedMesh; glbModel.traverse(child => { if (child.isSkinnedMesh) skinnedMesh = child; }) - skinnedMesh.skeleton.bones.forEach(bone => { - if (bone.name !== 'root') { - bone.position.x *= -1; - bone.position.z *= -1; - } - }) - skinnedMesh.skeleton.bones.forEach(bone => { - bone.updateMatrix(); - bone.updateMatrixWorld(); - }) - skinnedMesh.skeleton.calculateInverses(); - skinnedMesh.skeleton.computeBoneTexture(); - skinnedMesh.skeleton.update(); + + const reverseBonesXZ = () => { + skinnedMesh.skeleton.bones.forEach(bone => { + if (bone.name !== 'root') { + bone.position.x *= -1; + bone.position.z *= -1; + } + }) + skinnedMesh.skeleton.bones.forEach(bone => { + bone.updateMatrix(); + bone.updateMatrixWorld(); + }) + skinnedMesh.skeleton.calculateInverses(); + skinnedMesh.skeleton.computeBoneTexture(); + skinnedMesh.skeleton.update(); + } + reverseBonesXZ(); + + const rootSpringBones = []; + const processSpringBones = () => { + const headBone = skinnedMesh.skeleton.bones.filter(bone => bone.name === 'head')[0]; + headBone.children.forEach(hairTypeGroup => { + if (hairTypeGroup.name === 'leftEye' || hairTypeGroup.name === 'rightEye' || hairTypeGroup.name === 'Jaw') return; + hairTypeGroup.children.forEach(rootSpringBone => { // todo: performance: only export the hairTypeGroup of current selected hair. + rootSpringBones.push(rootSpringBone); + }); + }); + } + processSpringBones(); + // debugger - exporter.parse(vrmData, glbModel, (vrm) => { + exporter.parse(vrmData, glbModel, rootSpringBones, (vrm) => { resolve(vrm) }) }) From 2b935131ddd4074bd0542056f1abdd88258ffc4f Mon Sep 17 00:00:00 2001 From: gonnavis Date: Mon, 6 Mar 2023 17:07:26 +0800 Subject: [PATCH 07/13] Remove hard-coded colliders. --- src/library/VRMExporterv0.js | 33 ++------------------------------- 1 file changed, 2 insertions(+), 31 deletions(-) diff --git a/src/library/VRMExporterv0.js b/src/library/VRMExporterv0.js index b23dbdf3..65b2220c 100644 --- a/src/library/VRMExporterv0.js +++ b/src/library/VRMExporterv0.js @@ -484,44 +484,15 @@ export default class VRMExporterv0 { { "bones": rootSpringBonesIndexes, "center": -1, - "colliderGroups": [ 0, 1, 2 ], + "colliderGroups": [ ], "dragForce": 0.452, "gravityDir": { "x": 0, "y": 0, "z": 0 }, "gravityPower": 0, "hitRadius": 0.02, "stiffiness": 1 - }, - { - "bones": [ 21 ], - "center": -1, - "colliderGroups": [], - "dragForce": 1, - "gravityDir": { "x": 0, "y": -1, "z": 0 }, - "gravityPower": 0, - "hitRadius": 0.02, - "stiffiness": 3.32 } ], - "colliderGroups": [ - { - "colliders": [ - { "offset": { "x": -0.06999998, "y": -0.0544500351, "z": 0.00253520347 }, "radius": 0.05 } - ], - "node": 24 - }, - { - "colliders": [ - { "offset": { "x": -1.13197887e-8, "y": 0.0599999428, "z": 0.0395975038 }, "radius": 0.04 } - ], - "node": 44 - }, - { - "colliders": [ - { "offset": { "x": 0.07000001, "y": -0.0544500351, "z": 0.002535183 }, "radius": 0.05 } - ], - "node": 101 - } - ] + "colliderGroups": [ ] }; const bufferViews = []; From 9d6b513e1661e854fa502a258db2c12130331bd2 Mon Sep 17 00:00:00 2001 From: gonnavis Date: Mon, 6 Mar 2023 21:37:08 +0800 Subject: [PATCH 08/13] test: temp: only export Hair5/hair_option_1 springBones. && Add head collider. --- src/library/VRMExporterv0.js | 23 +++++++++++++++++++---- src/library/download-utils.js | 14 +++++++++++--- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/library/VRMExporterv0.js b/src/library/VRMExporterv0.js index 65b2220c..9c6b2fa3 100644 --- a/src/library/VRMExporterv0.js +++ b/src/library/VRMExporterv0.js @@ -97,7 +97,7 @@ function getVRM0BoneName(name){ return name; } export default class VRMExporterv0 { - parse(vrm, avatar, rootSpringBones, onDone) { + parse(vrm, avatar, rootSpringBones, colliderBones, onDone) { const vrmMeta = convertMetaToVRM0(vrm.meta); const humanoid = convertHumanoidToVRM0(vrm.humanoid); @@ -479,20 +479,35 @@ export default class VRMExporterv0 { // rootSpringBonesIndexes.push(i); // } // }); + + const colliderGroups = []; + const colliderGroupsIndexes = []; + colliderBones.forEach((colliderBone, i) => { + const nodeIndex = nodes.indexOf(colliderBone); + const colliderGroup = { + "colliders": [ + { "offset": { "x": 0, "y": 0.03, "z": 0 }, "radius": 0.08 } + ], + "node": nodeIndex + } + colliderGroups.push(colliderGroup); + colliderGroupsIndexes.push(i); + }) + const outputSecondaryAnimation = { "boneGroups": [ { "bones": rootSpringBonesIndexes, "center": -1, - "colliderGroups": [ ], + "colliderGroups": colliderGroupsIndexes, "dragForce": 0.452, "gravityDir": { "x": 0, "y": 0, "z": 0 }, "gravityPower": 0, - "hitRadius": 0.02, + "hitRadius": 0.01, "stiffiness": 1 } ], - "colliderGroups": [ ] + "colliderGroups": colliderGroups, }; const bufferViews = []; diff --git a/src/library/download-utils.js b/src/library/download-utils.js index 02f6f9cd..59d0b4df 100644 --- a/src/library/download-utils.js +++ b/src/library/download-utils.js @@ -179,12 +179,14 @@ function parseVRM (glbModel, avatar, isVrm0 = false){ skinnedMesh.skeleton.update(); } reverseBonesXZ(); + + const headBone = skinnedMesh.skeleton.bones.filter(bone => bone.name === 'head')[0]; const rootSpringBones = []; const processSpringBones = () => { - const headBone = skinnedMesh.skeleton.bones.filter(bone => bone.name === 'head')[0]; headBone.children.forEach(hairTypeGroup => { - if (hairTypeGroup.name === 'leftEye' || hairTypeGroup.name === 'rightEye' || hairTypeGroup.name === 'Jaw') return; + // if (hairTypeGroup.name === 'leftEye' || hairTypeGroup.name === 'rightEye' || hairTypeGroup.name === 'Jaw') return; + if (hairTypeGroup.name !== 'Hair5_Root') return; // test: temp: only export Hair5/hair_option_1 springBones. hairTypeGroup.children.forEach(rootSpringBone => { // todo: performance: only export the hairTypeGroup of current selected hair. rootSpringBones.push(rootSpringBone); }); @@ -192,8 +194,14 @@ function parseVRM (glbModel, avatar, isVrm0 = false){ } processSpringBones(); + const colliderBones = []; + const processColliderBones = () => { + colliderBones.push(headBone); + } + processColliderBones(); + // debugger - exporter.parse(vrmData, glbModel, rootSpringBones, (vrm) => { + exporter.parse(vrmData, glbModel, rootSpringBones, colliderBones, (vrm) => { resolve(vrm) }) }) From 7b1b7ba8111699db241778b9044d73f8c35f4eeb Mon Sep 17 00:00:00 2001 From: gonnavis Date: Tue, 7 Mar 2023 19:14:30 +0800 Subject: [PATCH 09/13] Adjust head collider. --- src/library/VRMExporterv0.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/library/VRMExporterv0.js b/src/library/VRMExporterv0.js index 9c6b2fa3..edd7e6f2 100644 --- a/src/library/VRMExporterv0.js +++ b/src/library/VRMExporterv0.js @@ -463,7 +463,7 @@ export default class VRMExporterv0 { // ] // }; - debugger + // debugger const rootSpringBonesIndexes = []; rootSpringBones.forEach(rootSpringBone => { for (let i = 0; i < nodes.length; i++) { @@ -486,7 +486,7 @@ export default class VRMExporterv0 { const nodeIndex = nodes.indexOf(colliderBone); const colliderGroup = { "colliders": [ - { "offset": { "x": 0, "y": 0.03, "z": 0 }, "radius": 0.08 } + { "offset": { "x": 0, "y": 0.05, "z": 0 }, "radius": 0.075 } ], "node": nodeIndex } From 16837a1fa2835ae3f033c74ecf22ae2d41b3fd77 Mon Sep 17 00:00:00 2001 From: gonnavis Date: Wed, 15 Mar 2023 21:18:31 +0800 Subject: [PATCH 10/13] Export springBone with new hair bone structure Darling made: hair_buns_root. --- src/library/download-utils.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/library/download-utils.js b/src/library/download-utils.js index 59d0b4df..50b137f4 100644 --- a/src/library/download-utils.js +++ b/src/library/download-utils.js @@ -186,9 +186,9 @@ function parseVRM (glbModel, avatar, isVrm0 = false){ const processSpringBones = () => { headBone.children.forEach(hairTypeGroup => { // if (hairTypeGroup.name === 'leftEye' || hairTypeGroup.name === 'rightEye' || hairTypeGroup.name === 'Jaw') return; - if (hairTypeGroup.name !== 'Hair5_Root') return; // test: temp: only export Hair5/hair_option_1 springBones. + if (hairTypeGroup.name !== 'hair_buns_root') return; // test: temp: only export Hair5/hair_option_1 springBones. hairTypeGroup.children.forEach(rootSpringBone => { // todo: performance: only export the hairTypeGroup of current selected hair. - rootSpringBones.push(rootSpringBone); + rootSpringBones.push(rootSpringBone.children[0]); }); }); } From 68539ce6b233f925fdbd4a5dc88b8ef4cdf2c1a3 Mon Sep 17 00:00:00 2001 From: gonnavis Date: Thu, 16 Mar 2023 11:44:48 +0800 Subject: [PATCH 11/13] Fit with new clarified hair vrms' bone structure. --- src/library/download-utils.js | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/library/download-utils.js b/src/library/download-utils.js index 50b137f4..567dda29 100644 --- a/src/library/download-utils.js +++ b/src/library/download-utils.js @@ -185,11 +185,21 @@ function parseVRM (glbModel, avatar, isVrm0 = false){ const rootSpringBones = []; const processSpringBones = () => { headBone.children.forEach(hairTypeGroup => { - // if (hairTypeGroup.name === 'leftEye' || hairTypeGroup.name === 'rightEye' || hairTypeGroup.name === 'Jaw') return; - if (hairTypeGroup.name !== 'hair_buns_root') return; // test: temp: only export Hair5/hair_option_1 springBones. - hairTypeGroup.children.forEach(rootSpringBone => { // todo: performance: only export the hairTypeGroup of current selected hair. - rootSpringBones.push(rootSpringBone.children[0]); + // debugger + // if (hairTypeGroup.name === 'leftEye' || hairTypeGroup.name === 'rightEye' || hairTypeGroup.name === 'Jaw') return; + // if (hairTypeGroup.name !== 'hair_buns_root') return; // test: temp: only export Hair5/hair_option_1 springBones. + if (!hairTypeGroup.name.startsWith('hair_')) return; + const nameParts = hairTypeGroup.name.split('_'); + const hairId = nameParts[1]; + if (hairId === avatar.head.traitInfo.id) { // note: only export the hairTypeGroup of current selected hair. + hairTypeGroup.children.forEach(strandRoot => { + // rootSpringBones.push(strandRoot); + // rootSpringBones.push(strandRoot.children[0]); + strandRoot.children.forEach(rootSpringBone => { + rootSpringBones.push(rootSpringBone); + }) }); + } }); } processSpringBones(); From f0a0b8eeeade18401adbc71d00e08f32f86920aa Mon Sep 17 00:00:00 2001 From: gonnavis Date: Fri, 17 Mar 2023 00:00:36 +0800 Subject: [PATCH 12/13] Use strandRoots as rootSpringBones directly. --- src/library/download-utils.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/library/download-utils.js b/src/library/download-utils.js index 567dda29..911f905d 100644 --- a/src/library/download-utils.js +++ b/src/library/download-utils.js @@ -193,11 +193,11 @@ function parseVRM (glbModel, avatar, isVrm0 = false){ const hairId = nameParts[1]; if (hairId === avatar.head.traitInfo.id) { // note: only export the hairTypeGroup of current selected hair. hairTypeGroup.children.forEach(strandRoot => { - // rootSpringBones.push(strandRoot); + rootSpringBones.push(strandRoot); // rootSpringBones.push(strandRoot.children[0]); - strandRoot.children.forEach(rootSpringBone => { - rootSpringBones.push(rootSpringBone); - }) + // strandRoot.children.forEach(rootSpringBone => { + // rootSpringBones.push(rootSpringBone); + // }) }); } }); From 5b9dc948a3b155886aa420e51dd60177af29083f Mon Sep 17 00:00:00 2001 From: gonnavis Date: Sat, 18 Mar 2023 19:36:48 +0800 Subject: [PATCH 13/13] Clean. --- src/components/Selector.jsx | 1 - src/library/VRMExporterv0.js | 51 ----------------------------------- src/library/download-utils.js | 8 ------ src/library/utils.js | 1 - 4 files changed, 61 deletions(-) diff --git a/src/components/Selector.jsx b/src/components/Selector.jsx index bf4f86ed..952bd911 100644 --- a/src/components/Selector.jsx +++ b/src/components/Selector.jsx @@ -282,7 +282,6 @@ export default function Selector({templateInfo, animationManager, blinkManager, const loadedModels = []; getAsArray(option?.item?.directory).map((modelDir, i) => { gltfLoader.loadAsync (baseDir + modelDir).then((mod) => { - // debugger // mark loadedModels[i] = mod; }) }) diff --git a/src/library/VRMExporterv0.js b/src/library/VRMExporterv0.js index edd7e6f2..1cbf562a 100644 --- a/src/library/VRMExporterv0.js +++ b/src/library/VRMExporterv0.js @@ -417,53 +417,7 @@ export default class VRMExporterv0 { //const outputVrmMeta = ToOutputVRMMeta(vrmMeta, icon, outputImages); const outputVrmMeta = vrmMeta; - // const outputSecondaryAnimation = toOutputSecondaryAnimation(springBone, nodeNames); - // const outputSecondaryAnimation = { - // "boneGroups": [ - // { - // "bones": [ 45, 49, 51, 53, 55, 57, 60, 62, 64, 67, 70, 72, 74, 76, 78, 81, 83, 85, 88, 90, 92, 94, 97, 99 ], - // "center": -1, - // "colliderGroups": [ 0, 1, 2 ], - // "dragForce": 0.452, - // "gravityDir": { "x": 0, "y": 0, "z": 0 }, - // "gravityPower": 0, - // "hitRadius": 0.02, - // "stiffiness": 1 - // }, - // { - // "bones": [ 21 ], - // "center": -1, - // "colliderGroups": [], - // "dragForce": 1, - // "gravityDir": { "x": 0, "y": -1, "z": 0 }, - // "gravityPower": 0, - // "hitRadius": 0.02, - // "stiffiness": 3.32 - // } - // ], - // "colliderGroups": [ - // { - // "colliders": [ - // { "offset": { "x": -0.06999998, "y": -0.0544500351, "z": 0.00253520347 }, "radius": 0.05 } - // ], - // "node": 24 - // }, - // { - // "colliders": [ - // { "offset": { "x": -1.13197887e-8, "y": 0.0599999428, "z": 0.0395975038 }, "radius": 0.04 } - // ], - // "node": 44 - // }, - // { - // "colliders": [ - // { "offset": { "x": 0.07000001, "y": -0.0544500351, "z": 0.002535183 }, "radius": 0.05 } - // ], - // "node": 101 - // } - // ] - // }; - // debugger const rootSpringBonesIndexes = []; rootSpringBones.forEach(rootSpringBone => { for (let i = 0; i < nodes.length; i++) { @@ -474,11 +428,6 @@ export default class VRMExporterv0 { } } }) - // nodes.forEach((node, i) => { - // if(node.name === 'L_Hair5_Bang' || node.name === 'R_Hair5_Bang' || node.name === 'Hair5_Front_Bang') { - // rootSpringBonesIndexes.push(i); - // } - // }); const colliderGroups = []; const colliderGroupsIndexes = []; diff --git a/src/library/download-utils.js b/src/library/download-utils.js index 911f905d..c2126055 100644 --- a/src/library/download-utils.js +++ b/src/library/download-utils.js @@ -185,19 +185,12 @@ function parseVRM (glbModel, avatar, isVrm0 = false){ const rootSpringBones = []; const processSpringBones = () => { headBone.children.forEach(hairTypeGroup => { - // debugger - // if (hairTypeGroup.name === 'leftEye' || hairTypeGroup.name === 'rightEye' || hairTypeGroup.name === 'Jaw') return; - // if (hairTypeGroup.name !== 'hair_buns_root') return; // test: temp: only export Hair5/hair_option_1 springBones. if (!hairTypeGroup.name.startsWith('hair_')) return; const nameParts = hairTypeGroup.name.split('_'); const hairId = nameParts[1]; if (hairId === avatar.head.traitInfo.id) { // note: only export the hairTypeGroup of current selected hair. hairTypeGroup.children.forEach(strandRoot => { rootSpringBones.push(strandRoot); - // rootSpringBones.push(strandRoot.children[0]); - // strandRoot.children.forEach(rootSpringBone => { - // rootSpringBones.push(rootSpringBone); - // }) }); } }); @@ -210,7 +203,6 @@ function parseVRM (glbModel, avatar, isVrm0 = false){ } processColliderBones(); - // debugger exporter.parse(vrmData, glbModel, rootSpringBones, colliderBones, (vrm) => { resolve(vrm) }) diff --git a/src/library/utils.js b/src/library/utils.js index 01f38bc9..509eb894 100644 --- a/src/library/utils.js +++ b/src/library/utils.js @@ -37,7 +37,6 @@ export async function loadModel(file, onProgress) { return new VRMLoaderPlugin(parser) }) return gltfLoader.loadAsync(file, onProgress).then((model) => { - // debugger const vrm = model.userData.vrm renameVRMBones(vrm)