Normalize quaternion on update headTransform.rotation

This commit is contained in:
notargs
2021-10-19 16:18:17 +09:00
parent 23ac5c06a3
commit 1e4b054790

View File

@@ -28,7 +28,9 @@ namespace UniVRM10.FastSpringBones.System
var colliderSpan = spring.colliderSpan;
var logicSpan = spring.logicSpan;
for (var logicIndex = logicSpan.startIndex; logicIndex < logicSpan.startIndex + logicSpan.count; ++logicIndex)
for (var logicIndex = logicSpan.startIndex;
logicIndex < logicSpan.startIndex + logicSpan.count;
++logicIndex)
{
var logic = Logics[logicIndex];
var joint = Joints[logicIndex];
@@ -71,20 +73,23 @@ namespace UniVRM10.FastSpringBones.System
nextTail = headTransform.position + (nextTail - headTransform.position).normalized * logic.length;
// Collisionで移動
for (var colliderIndex = colliderSpan.startIndex; colliderIndex < colliderSpan.startIndex + colliderSpan.count; ++colliderIndex)
for (var colliderIndex = colliderSpan.startIndex;
colliderIndex < colliderSpan.startIndex + colliderSpan.count;
++colliderIndex)
{
var collider = Colliders[colliderIndex];
var colliderTransform = Transforms[collider.transformIndex];
var worldPosition = colliderTransform.localToWorldMatrix.MultiplyPoint3x4(collider.offset);
var worldTail = colliderTransform.localToWorldMatrix.MultiplyPoint3x4(collider.tail);
switch (collider.colliderType)
{
case BlittableColliderType.Sphere:
ResolveSphereCollision(joint, collider, worldPosition, headTransform, logic, ref nextTail);
ResolveSphereCollision(joint, collider, worldPosition, headTransform, logic, ref nextTail);
break;
case BlittableColliderType.Capsule:
ResolveCapsuleCollision(worldTail, worldPosition, headTransform, joint, collider, logic, ref nextTail);
ResolveCapsuleCollision(worldTail, worldPosition, headTransform, joint, collider, logic,
ref nextTail);
break;
}
}
@@ -106,7 +111,8 @@ namespace UniVRM10.FastSpringBones.System
if (parentTransform.HasValue)
{
var parentLocalToWorldMatrix = parentTransform.Value.localToWorldMatrix;
headTransform.localRotation = Quaternion.Inverse(parentTransform.Value.rotation) * headTransform.rotation;
headTransform.localRotation =
(Quaternion.Inverse(parentTransform.Value.rotation) * headTransform.rotation).normalized;
headTransform.localToWorldMatrix =
parentLocalToWorldMatrix *
Matrix4x4.TRS(
@@ -179,7 +185,8 @@ namespace UniVRM10.FastSpringBones.System
var normal = (nextTail - worldPosition).normalized;
var posFromCollider = worldPosition + normal * (joint.radius + collider.radius);
// 長さをboneLengthに強制
nextTail = headTransform.position + (posFromCollider - headTransform.position).normalized * logic.length;
nextTail = headTransform.position +
(posFromCollider - headTransform.position).normalized * logic.length;
}
}
}