SpringBoneに対してグローバルで外力を渡すインターフェースを実装する

This commit is contained in:
notargs 2022-10-18 13:16:33 +09:00
parent 75e9a82ee8
commit dc3b6afd8c
5 changed files with 18 additions and 3 deletions

View File

@ -1,5 +1,5 @@
using System;
using UnityEngine.Serialization;
using UnityEngine;
namespace UniVRM10.FastSpringBones.Blittables
{
@ -13,5 +13,6 @@ namespace UniVRM10.FastSpringBones.Blittables
public BlittableSpan logicSpan;
public int centerTransformIndex;
public int transformIndexOffset;
public Vector3 externalForce;
}
}

View File

@ -38,6 +38,8 @@ namespace UniVRM10.FastSpringBones.System
public NativeArray<BlittableCollider> Colliders => _colliders;
public NativeArray<BlittableLogic> Logics => _logics;
public bool HasBuffer => _batchedBuffers != null && _batchedBuffers.Length > 0;
public void Register(FastSpringBoneBuffer buffer)
{
_buffers.AddLast(buffer);

View File

@ -8,6 +8,7 @@ namespace UniVRM10.FastSpringBones.System
public sealed class FastSpringBoneScheduler : IDisposable
{
private readonly FastSpringBoneBufferCombiner _bufferCombiner;
public Vector3 ExternalForce { get; set; }
public FastSpringBoneScheduler(FastSpringBoneBufferCombiner bufferCombiner)
{
@ -18,6 +19,10 @@ namespace UniVRM10.FastSpringBones.System
{
var handle = default(JobHandle);
handle = _bufferCombiner.ReconstructIfDirty(handle);
if (!_bufferCombiner.HasBuffer)
{
return handle;
}
handle = new PullTransformJob
{
@ -32,6 +37,7 @@ namespace UniVRM10.FastSpringBones.System
Springs = _bufferCombiner.Springs,
Transforms = _bufferCombiner.Transforms,
DeltaTime = Time.deltaTime,
ExternalForce = ExternalForce
}.Schedule(_bufferCombiner.Springs.Length, 1, handle);
handle = new PushTransformJob

View File

@ -27,6 +27,12 @@ namespace UniVRM10.FastSpringBones.System
}
}
public Vector3 ExternalForce
{
get => _fastSpringBoneScheduler.ExternalForce;
set => _fastSpringBoneScheduler.ExternalForce = value;
}
/// <summary>
/// 専有しているインスタンスを破棄する
/// </summary>

View File

@ -22,6 +22,7 @@ namespace UniVRM10.FastSpringBones.System
[NativeDisableParallelForRestriction] public NativeArray<BlittableTransform> Transforms;
public float DeltaTime;
public Vector3 ExternalForce;
public void Execute(int index)
{
@ -43,7 +44,6 @@ namespace UniVRM10.FastSpringBones.System
? Transforms[spring.centerTransformIndex + transformIndexOffset]
: (BlittableTransform?)null;
// 親があったら、親に依存するTransformを再計算
if (parentTransform.HasValue)
{
@ -62,7 +62,7 @@ namespace UniVRM10.FastSpringBones.System
var parentRotation = parentTransform?.rotation ?? Quaternion.identity;
// verlet積分で次の位置を計算
var external = joint.gravityDir * joint.gravityPower * DeltaTime;
var external = (joint.gravityDir * joint.gravityPower + ExternalForce) * DeltaTime;
var nextTail = currentTail
+ (currentTail - prevTail) * (1.0f - joint.dragForce) // 前フレームの移動を継続する(減衰もあるよ)
+ parentRotation * logic.localRotation * logic.boneAxis *