BoneWeightの付与を実装

This commit is contained in:
ousttrue 2022-06-17 17:15:58 +09:00
parent 1b95fee136
commit 02ea689dc5
5 changed files with 27 additions and 4 deletions

View File

@ -30,6 +30,7 @@ namespace UniGLTF
public bool HasNormal { get; private set; } = true;
public string Name { get; private set; }
public bool AssignBoneWeight { get; private set; }
public MeshData(int vertexCapacity, int indexCapacity)
{
@ -318,6 +319,7 @@ namespace UniGLTF
var texCoords1 = primitives.GetTexCoords1(data, positions.Length);
var colors = primitives.GetColors(data, positions.Length);
var skinning = SkinningInfo.Create(data, gltfMesh, primitives);
AssignBoneWeight = skinning.AssignBoneWeight;
CheckAttributeUsages(primitives);
@ -449,6 +451,7 @@ namespace UniGLTF
var texCoords1 = primitives.GetTexCoords1(data, positions.Length);
var colors = primitives.GetColors(data, positions.Length);
var skinning = SkinningInfo.Create(data, gltfMesh, primitives);
AssignBoneWeight = skinning.AssignBoneWeight;
CheckAttributeUsages(primitives);

View File

@ -137,7 +137,8 @@ namespace UniGLTF
var result = new MeshWithMaterials
{
Mesh = mesh,
Materials = data.MaterialIndices.Select(materialFromIndex).ToArray()
Materials = data.MaterialIndices.Select(materialFromIndex).ToArray(),
AssignBoneWeight = data.AssignBoneWeight,
};
await awaitCaller.NextFrame();

View File

@ -9,7 +9,13 @@ namespace UniGLTF
public Mesh Mesh;
public Material[] Materials;
/// <summary>
/// BoneWeight が無い && BlendShape が有るの場合に、BoneWeightを付与する。
/// 付与した場合に true になる。
/// </summary>
public bool AssignBoneWeight = false;
// 複数のノードから参照されうる
public List<Renderer> Renderers=new List<Renderer>(); // SkinnedMeshRenderer or MeshRenderer
public List<Renderer> Renderers = new List<Renderer>(); // SkinnedMeshRenderer or MeshRenderer
}
}

View File

@ -8,8 +8,7 @@ namespace UniGLTF
public static SkinningInfo Create(GltfData data, glTFMesh mesh, glTFPrimitives primitives)
{
// var hasMorphTarget = HasMorphTarget(mesh);
var hasMorphTarget = false;
var hasMorphTarget = HasMorphTarget(mesh);
var positions = data.GLTF.accessors[primitives.attributes.POSITION];
var skinning = new SkinningInfo

View File

@ -119,6 +119,20 @@ namespace UniGLTF
renderer.sharedMaterials = mesh.Materials;
// invisible in loading
renderer.enabled = false;
if (mesh.AssignBoneWeight)
{
renderer.bones = new[] { renderer.transform };
//
// calc default matrices
// https://docs.unity3d.com/ScriptReference/Mesh-bindposes.html
//
var meshCoords = renderer.transform;
var calculatedBindPoses = renderer.bones.Select(bone => bone.worldToLocalMatrix * meshCoords.localToWorldMatrix).ToArray();
mesh.Mesh.bindposes = calculatedBindPoses;
}
mesh.Renderers.Add(renderer);
}
}