mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-05-15 15:11:43 -05:00
BoneWeightの付与を実装
This commit is contained in:
parent
1b95fee136
commit
02ea689dc5
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user