collider group の仕様変更

This commit is contained in:
ousttrue
2021-04-30 14:08:36 +09:00
parent c4dd9e0404
commit 9274c84c01
3 changed files with 69 additions and 68 deletions

View File

@@ -314,40 +314,44 @@ namespace UniVRM10
Springs = new List<UniGLTF.Extensions.VRMC_springBone.Spring>(),
};
Func<Transform, int> getIndexFromTransform = t =>
Func<Transform, int> getNodeIndexFromTransform = t =>
{
var node = converter.Nodes[t.gameObject];
return model.Nodes.IndexOf(node);
};
var colliderGroups = vrmController.GetComponentsInChildren<VRM10SpringBoneColliderGroup>();
foreach (var x in colliderGroups)
{
var colliderGroup = new UniGLTF.Extensions.VRMC_springBone.ColliderGroup
{
Colliders = new List<UniGLTF.Extensions.VRMC_springBone.Collider>(),
};
springBone.ColliderGroups.Add(colliderGroup);
foreach (var y in x.Colliders)
{
if (y == null)
{
continue;
}
colliderGroup.Colliders.Add(new UniGLTF.Extensions.VRMC_springBone.Collider
{
Node = getNodeIndexFromTransform(y.transform),
Shape = ExportShape(y),
});
}
}
foreach (var x in vrmController.GetComponentsInChildren<VRM10SpringBone>())
{
var spring = new UniGLTF.Extensions.VRMC_springBone.Spring
{
Name = x.Comment,
Joints = x.Joints.Select(y => ExportJoint(y, getIndexFromTransform)).ToList(),
Joints = x.Joints.Select(y => ExportJoint(y, getNodeIndexFromTransform)).ToList(),
ColliderGroups = x.ColliderGroups.Select(y => Array.IndexOf(colliderGroups, y)).ToArray(),
};
springBone.Springs.Add(spring);
List<int> colliders = new List<int>();
foreach (var y in x.ColliderGroups)
{
// node
var node = converter.Nodes[y.gameObject];
var nodeIndex = model.Nodes.IndexOf(node);
colliders.Add(nodeIndex);
var gltfNode = Storage.Gltf.nodes[nodeIndex];
// // VRMC_node_collider
// var collider = new UniGLTF.Extensions.VRMC_node_collider.VRMC_node_collider
// {
// Shapes = y.Colliders.Select(ExportShape).ToList(),
// };
// // serialize
// UniGLTF.Extensions.VRMC_node_collider.GltfSerializer.SerializeTo(ref gltfNode.extensions, collider);
}
spring.ColliderGroups = colliders.ToArray();
}
return springBone;

View File

@@ -365,6 +365,47 @@ namespace UniVRM10
// springs
if (gltfVrmSpringBone.Springs != null)
{
var secondary = Root.transform.Find("secondary");
if (secondary == null)
{
secondary = new GameObject("secondary").transform;
secondary.SetParent(Root.transform, false);
}
// colliderGroup
var list = new List<VRM10SpringBoneColliderGroup>();
foreach (var g in gltfVrmSpringBone.ColliderGroups)
{
var colliderGroup = secondary.gameObject.AddComponent<VRM10SpringBoneColliderGroup>();
list.Add(colliderGroup);
foreach (var c in g.Colliders)
{
var node = Nodes[c.Node.Value];
var collider = node.gameObject.AddComponent<VRM10SpringBoneCollider>();
colliderGroup.Colliders.Add(collider);
if (c.Shape.Sphere is UniGLTF.Extensions.VRMC_springBone.ColliderShapeSphere sphere)
{
collider.ColliderType = VRM10SpringBoneColliderTypes.Sphere;
collider.Radius = sphere.Radius.Value;
collider.Offset = Vector3InvertX(sphere.Offset);
}
else if (c.Shape.Capsule is UniGLTF.Extensions.VRMC_springBone.ColliderShapeCapsule capsule)
{
collider.ColliderType = VRM10SpringBoneColliderTypes.Capsule;
collider.Radius = capsule.Radius.Value;
collider.Offset = Vector3InvertX(capsule.Offset);
collider.Tail = Vector3InvertX(capsule.Tail);
}
else
{
throw new NotImplementedException();
}
}
}
foreach (var gltfSpring in gltfVrmSpringBone.Springs)
{
if (gltfSpring.Joints == null || gltfSpring.Joints.Count == 0)
@@ -374,6 +415,7 @@ namespace UniVRM10
var firstJointNode = Nodes[gltfSpring.Joints.First().Node.Value];
var springBone = firstJointNode.gameObject.AddComponent<VRM10SpringBone>();
springBone.Comment = gltfSpring.Name;
springBone.ColliderGroups = gltfSpring.ColliderGroups.Select(x => list[x]).ToList();
// joint
foreach (var gltfJoint in gltfSpring.Joints)
@@ -395,52 +437,6 @@ namespace UniVRM10
springBone.Joints.Add(joint);
}
}
// // collider
// springBone.ColliderGroups.AddRange(gltfSpring.ColliderGroups.Select(colliderNode =>
// {
// if (UniGLTF.Extensions.VRMC_node_collider.GltfDeserializer.TryGet(Parser.GLTF.nodes[colliderNode].extensions,
// out UniGLTF.Extensions.VRMC_node_collider.VRMC_node_collider extension))
// {
// var node = Nodes[colliderNode];
// var colliderGroup = node.gameObject.GetComponent<VRM10SpringBoneColliderGroup>();
// if (colliderGroup == null)
// {
// colliderGroup = node.gameObject.AddComponent<VRM10SpringBoneColliderGroup>();
// colliderGroup.Colliders.AddRange(extension.Shapes.Select(x =>
// {
// if (x.Sphere != null)
// {
// return new VRM10SpringBoneCollider
// {
// ColliderType = VRM10SpringBoneColliderTypes.Sphere,
// Offset = Vector3InvertX(x.Sphere.Offset),
// Radius = x.Sphere.Radius.Value,
// };
// }
// else if (x.Capsule != null)
// {
// return new VRM10SpringBoneCollider
// {
// ColliderType = VRM10SpringBoneColliderTypes.Capsule,
// Offset = Vector3InvertX(x.Capsule.Offset),
// Radius = x.Capsule.Radius.Value,
// Tail = Vector3InvertX(x.Capsule.Tail),
// };
// }
// else
// {
// throw new NotImplementedException();
// }
// }));
// }
// return colliderGroup;
// }
// else
// {
// return null;
// }
// }).Where(x => x != null));
}
}
}

View File

@@ -73,6 +73,7 @@ namespace UniVRM10
{
colliderGroup.Colliders.Add(new UniGLTF.Extensions.VRMC_springBone.Collider
{
Node = x["node"].GetInt32(),
Shape = new UniGLTF.Extensions.VRMC_springBone.ColliderShape
{
Sphere = new UniGLTF.Extensions.VRMC_springBone.ColliderShapeSphere