From a42aa7e575afb659eb77b248c24e2fb92354b0ab Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 17 Apr 2018 13:57:52 +0900 Subject: [PATCH] fix normal and tangents BlendShape in BoneNormalizer --- .../Editor/BoneNormalizer.cs | 35 +++++++++++++++---- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/Scripts/SkinnedMeshUtility/Editor/BoneNormalizer.cs b/Scripts/SkinnedMeshUtility/Editor/BoneNormalizer.cs index d42a2353f..76b5b8a0b 100644 --- a/Scripts/SkinnedMeshUtility/Editor/BoneNormalizer.cs +++ b/Scripts/SkinnedMeshUtility/Editor/BoneNormalizer.cs @@ -162,9 +162,22 @@ namespace VRM mesh.boneWeights = srcMesh.boneWeights; var meshVertices = mesh.vertices; + var meshNormals = mesh.normals; + var meshTangents = mesh.tangents.Select(x => (Vector3)x).ToArray(); + + var _meshVertices = new Vector3[meshVertices.Length]; + var _meshNormals = new Vector3[meshVertices.Length]; + var _meshTangents = new Vector3[meshVertices.Length]; + var blendShapeMesh = new Mesh(); for (int i = 0; i < srcMesh.blendShapeCount; ++i) { + // check blendShape + srcRenderer.sharedMesh.GetBlendShapeFrameVertices(i, 0, _meshVertices, _meshNormals, _meshTangents); + var hasVertices = !_meshVertices.All(x => x == Vector3.zero); + var hasNormals = !_meshNormals.All(x => x == Vector3.zero); + var hasTangents = !_meshTangents.All(x => x == Vector3.zero); + srcRenderer.SetBlendShapeWeight(i, 100.0f); srcRenderer.BakeMesh(blendShapeMesh); srcRenderer.SetBlendShapeWeight(i, 0); @@ -181,13 +194,21 @@ namespace VRM for (int j = 0; j < vertices.Length; ++j) { vertices[j]= m.MultiplyPoint(vertices[j]) - meshVertices[j]; } - for (int j = 0; j < normals.Length; ++j) + + if (hasNormals) { - normals[j] = m.MultiplyVector(normals[j]).normalized; + for (int j = 0; j < normals.Length; ++j) + { + normals[j] = m.MultiplyVector(normals[j]) - meshNormals[j]; + } } - for(int j=0; j