Merge pull request #1662 from amamagi/fix/fsb-collider-and-rotation

FastSpringBoneが初期化時のrotationとリアルタイムのColliderのScaleを反映するように
This commit is contained in:
Yutaka Sato 2022-05-30 18:37:09 +09:00 committed by GitHub
commit f67e709727
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 16 additions and 9 deletions

View File

@ -1,7 +1,8 @@
{
"name": "FastSpringBone10",
"references": [
"GUID:2665a8d13d1b3f18800f46e256720795"
"GUID:2665a8d13d1b3f18800f46e256720795",
"GUID:d8b63aba1907145bea998dd612889d6b"
],
"includePlatforms": [],
"excludePlatforms": [],

View File

@ -108,7 +108,7 @@ namespace UniVRM10.FastSpringBones.System
parentTransformIndex = parent != null ? transformIndexDictionary[parent] : -1,
currentTail = currentTail,
prevTail = currentTail,
localRotation = Quaternion.identity,
localRotation = joint.Transform.localRotation,
boneAxis = localChildPosition.normalized,
length = localChildPosition.magnitude
});

View File

@ -1,6 +1,7 @@
using System;
using Unity.Collections;
using Unity.Jobs;
using Unity.Mathematics;
using UnityEngine;
using UniVRM10.FastSpringBones.Blittables;
#if ENABLE_SPRINGBONE_BURST
@ -76,16 +77,19 @@ namespace UniVRM10.FastSpringBones.System
{
var collider = Colliders[colliderIndex];
var colliderTransform = Transforms[collider.transformIndex + logic.transformIndexOffset];
var colliderScale = colliderTransform.localToWorldMatrix.lossyScale;
var absColliderScale = math.abs(colliderScale);
var maxColliderScale = math.max(math.max(absColliderScale.x, absColliderScale.y), absColliderScale.z);
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, maxColliderScale, logic, ref nextTail);
break;
case BlittableColliderType.Capsule:
ResolveCapsuleCollision(worldTail, worldPosition, headTransform, joint, collider, logic, ref nextTail);
ResolveCapsuleCollision(worldTail, worldPosition, headTransform, joint, collider, maxColliderScale, logic, ref nextTail);
break;
}
}
@ -150,6 +154,7 @@ namespace UniVRM10.FastSpringBones.System
BlittableTransform headTransform,
BlittableJoint joint,
BlittableCollider collider,
float maxColliderScale,
BlittableLogic logic,
ref Vector3 nextTail)
{
@ -159,19 +164,19 @@ namespace UniVRM10.FastSpringBones.System
if (dot <= 0)
{
// head側半球の球判定
ResolveSphereCollision(joint, collider, worldPosition, headTransform, logic, ref nextTail);
ResolveSphereCollision(joint, collider, worldPosition, headTransform, maxColliderScale, logic, ref nextTail);
}
var t = dot / P.magnitude;
if (t >= 1.0f)
{
// tail側半球の球判定
ResolveSphereCollision(joint, collider, worldTail, headTransform, logic, ref nextTail);
ResolveSphereCollision(joint, collider, worldTail, headTransform, maxColliderScale, logic, ref nextTail);
}
// head-tail上の m_transform.position との最近点
var p = worldPosition + P * t;
ResolveSphereCollision(joint, collider, p, headTransform, logic, ref nextTail);
ResolveSphereCollision(joint, collider, p, headTransform, maxColliderScale, logic, ref nextTail);
}
private static void ResolveSphereCollision(
@ -179,15 +184,16 @@ namespace UniVRM10.FastSpringBones.System
BlittableCollider collider,
Vector3 worldPosition,
BlittableTransform headTransform,
float maxColliderScale,
BlittableLogic logic,
ref Vector3 nextTail)
{
var r = joint.radius + collider.radius;
var r = joint.radius + collider.radius * maxColliderScale;
if (Vector3.SqrMagnitude(nextTail - worldPosition) <= (r * r))
{
// ヒット。Colliderの半径方向に押し出す
var normal = (nextTail - worldPosition).normalized;
var posFromCollider = worldPosition + normal * (joint.radius + collider.radius);
var posFromCollider = worldPosition + normal * r;
// 長さをboneLengthに強制
nextTail = headTransform.position + (posFromCollider - headTransform.position).normalized * logic.length;
}