You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
4.4 KiB
C#
111 lines
4.4 KiB
C#
6 months ago
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using UnityEngine;
|
||
|
|
||
|
namespace Autohand {
|
||
|
public class HandVelocityTracker {
|
||
|
HandBase hand = null;
|
||
|
float minThrowVelocity = 0f;
|
||
|
|
||
|
///<summary> A list of all acceleration values from the time the throwing motion was detected til now.</summary>
|
||
|
protected List<VelocityTimePair> m_ThrowVelocityList = new List<VelocityTimePair>();
|
||
|
protected List<VelocityTimePair> m_ThrowAngleVelocityList = new List<VelocityTimePair>();
|
||
|
|
||
|
public void ClearThrow() {
|
||
|
m_ThrowVelocityList.Clear();
|
||
|
m_ThrowAngleVelocityList.Clear();
|
||
|
}
|
||
|
|
||
|
float disableTime;
|
||
|
float disableSeconds;
|
||
|
public void Disable(float seconds) {
|
||
|
disableTime = Time.realtimeSinceStartup;
|
||
|
disableSeconds = seconds;
|
||
|
ClearThrow();
|
||
|
}
|
||
|
|
||
|
public HandVelocityTracker(HandBase hand) {
|
||
|
this.hand = hand;
|
||
|
}
|
||
|
|
||
|
|
||
|
public void UpdateThrowing() {
|
||
|
if(disableTime + disableSeconds > Time.realtimeSinceStartup) {
|
||
|
if(m_ThrowVelocityList.Count > 0) {
|
||
|
m_ThrowVelocityList.Clear();
|
||
|
m_ThrowAngleVelocityList.Clear();
|
||
|
}
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if(hand.holdingObj == null || hand.IsGrabbing()) {
|
||
|
if(m_ThrowVelocityList.Count > 0) {
|
||
|
m_ThrowVelocityList.Clear();
|
||
|
m_ThrowAngleVelocityList.Clear();
|
||
|
}
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Add current hand velocity to throw velocity list.
|
||
|
m_ThrowVelocityList.Add(new VelocityTimePair() { time = Time.realtimeSinceStartup, velocity = hand.holdingObj.body == null ? Vector3.zero : hand.holdingObj.body.velocity });
|
||
|
|
||
|
// Remove old entries from m_ThrowVelocityList.
|
||
|
for(int i = m_ThrowVelocityList.Count - 1; i >= 0; --i) {
|
||
|
if(Time.realtimeSinceStartup - m_ThrowVelocityList[i].time >= hand.throwVelocityExpireTime) {
|
||
|
// Remove expired entry.
|
||
|
m_ThrowVelocityList.RemoveAt(i);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Add current hand velocity to throw velocity list.
|
||
|
m_ThrowAngleVelocityList.Add(new VelocityTimePair() { time = Time.realtimeSinceStartup, velocity = hand.holdingObj.body == null ? Vector3.zero : hand.holdingObj.body.angularVelocity });
|
||
|
|
||
|
// Remove old entries from m_ThrowVelocityList.
|
||
|
for(int i = m_ThrowAngleVelocityList.Count - 1; i >= 0; --i) {
|
||
|
if(Time.realtimeSinceStartup - m_ThrowAngleVelocityList[i].time >= hand.throwAngularVelocityExpireTime) {
|
||
|
// Remove expired entry.
|
||
|
m_ThrowAngleVelocityList.RemoveAt(i);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>Returns the hands velocity times its strength</summary>
|
||
|
public Vector3 ThrowVelocity() {
|
||
|
if(hand.IsGrabbing() || hand.holdingObj == null)
|
||
|
return Vector3.zero;
|
||
|
|
||
|
// Calculate the average hand velocity over the course of the throw.
|
||
|
Vector3 averageVelocity = Vector3.zero;
|
||
|
if(m_ThrowVelocityList.Count > 0) {
|
||
|
foreach(VelocityTimePair pair in m_ThrowVelocityList) {
|
||
|
averageVelocity += pair.velocity;
|
||
|
}
|
||
|
averageVelocity /= m_ThrowVelocityList.Count;
|
||
|
}
|
||
|
|
||
|
var vel = averageVelocity * hand.holdingObj.throwPower;
|
||
|
|
||
|
return vel.magnitude > minThrowVelocity ? vel : Vector3.zero;
|
||
|
}
|
||
|
|
||
|
/// <summary>Returns the hands velocity times its strength</summary>
|
||
|
public Vector3 ThrowAngularVelocity() {
|
||
|
if(hand.IsGrabbing() || hand.holdingObj == null)
|
||
|
return Vector3.zero;
|
||
|
|
||
|
// Calculate the average hand velocity over the course of the throw.
|
||
|
Vector3 averageVelocity = Vector3.zero;
|
||
|
if(m_ThrowAngleVelocityList.Count > 0) {
|
||
|
foreach(VelocityTimePair pair in m_ThrowAngleVelocityList) {
|
||
|
averageVelocity += pair.velocity;
|
||
|
}
|
||
|
averageVelocity /= m_ThrowAngleVelocityList.Count;
|
||
|
}
|
||
|
|
||
|
averageVelocity *= Mathf.Sqrt(hand.throwPower) / 2f;
|
||
|
|
||
|
return averageVelocity.magnitude > minThrowVelocity ? averageVelocity : Vector3.zero; ;
|
||
|
}
|
||
|
}
|
||
|
}
|