98 lines
3.0 KiB
C#
98 lines
3.0 KiB
C#
|
|
using UnityEngine;
|
|
|
|
namespace KindRetargeting
|
|
{
|
|
/// <summary>
|
|
/// 모션 데이터 필터링을 위한 클래스
|
|
/// </summary>
|
|
public class MotionFilter
|
|
{
|
|
private Vector3[] positionBuffer;
|
|
private Quaternion[] rotationBuffer;
|
|
private int bufferSize;
|
|
private int currentIndex;
|
|
|
|
public MotionFilter(int bufferSize = 5)
|
|
{
|
|
this.bufferSize = bufferSize;
|
|
positionBuffer = new Vector3[bufferSize];
|
|
rotationBuffer = new Quaternion[bufferSize];
|
|
currentIndex = 0;
|
|
}
|
|
|
|
public Vector3 FilterPosition(Vector3 newPosition)
|
|
{
|
|
positionBuffer[currentIndex] = newPosition;
|
|
Vector3 smoothedPosition = Vector3.zero;
|
|
|
|
for (int i = 0; i < bufferSize; i++)
|
|
{
|
|
smoothedPosition += positionBuffer[i];
|
|
}
|
|
|
|
currentIndex = (currentIndex + 1) % bufferSize;
|
|
return smoothedPosition / bufferSize;
|
|
}
|
|
|
|
public Quaternion FilterRotation(Quaternion newRotation)
|
|
{
|
|
rotationBuffer[currentIndex] = newRotation;
|
|
Vector4 average = Vector4.zero;
|
|
|
|
for (int i = 0; i < bufferSize; i++)
|
|
{
|
|
if (Quaternion.Dot(rotationBuffer[0], rotationBuffer[i]) < 0)
|
|
{
|
|
rotationBuffer[i] = new Quaternion(-rotationBuffer[i].x, -rotationBuffer[i].y,
|
|
-rotationBuffer[i].z, -rotationBuffer[i].w);
|
|
}
|
|
average.x += rotationBuffer[i].x;
|
|
average.y += rotationBuffer[i].y;
|
|
average.z += rotationBuffer[i].z;
|
|
average.w += rotationBuffer[i].w;
|
|
}
|
|
|
|
average /= bufferSize;
|
|
currentIndex = (currentIndex + 1) % bufferSize;
|
|
return new Quaternion(average.x, average.y, average.z, average.w).normalized;
|
|
}
|
|
|
|
public void UpdateSettings(bool useFilter, bool useRoughMotion)
|
|
{
|
|
// 필요한 경우 여기에 설정 업데이트 로직 추가
|
|
}
|
|
}
|
|
|
|
public class RoughMotion
|
|
{
|
|
private Vector3 lastPosition;
|
|
private Quaternion lastRotation;
|
|
private float smoothSpeed;
|
|
|
|
public RoughMotion(float smoothSpeed = 5f)
|
|
{
|
|
this.smoothSpeed = smoothSpeed;
|
|
lastPosition = Vector3.zero;
|
|
lastRotation = Quaternion.identity;
|
|
}
|
|
|
|
public Vector3 ProcessPosition(Vector3 newPosition)
|
|
{
|
|
lastPosition = Vector3.Lerp(lastPosition, newPosition, smoothSpeed * Time.deltaTime);
|
|
return lastPosition;
|
|
}
|
|
|
|
public Quaternion ProcessRotation(Quaternion newRotation)
|
|
{
|
|
lastRotation = Quaternion.Lerp(lastRotation, newRotation, smoothSpeed * Time.deltaTime);
|
|
return lastRotation;
|
|
}
|
|
|
|
public void SetSmoothSpeed(float speed)
|
|
{
|
|
smoothSpeed = speed;
|
|
}
|
|
}
|
|
}
|