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.

85 lines
3.0 KiB
C#

6 months ago
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Autohand{
public class GrabbablePoseCombiner : MonoBehaviour{
public List<GrabbablePose> poses = new List<GrabbablePose>();
HandPoseData pose;
public bool CanSetPose(Hand hand, Grabbable grab) {
foreach(var pose in poses) {
if(pose != null && pose.CanSetPose(hand, grab))
return true;
}
return false;
}
public void AddPose(GrabbablePose pose) {
if(!poses.Contains(pose))
poses.Add(pose);
}
private void OnDestroy()
{
for (int i = poses.Count - 1; i >= 0; i--)
{
Destroy(poses[i]);
}
}
public GrabbablePose GetClosestPose(Hand hand, Grabbable grab) {
List<GrabbablePose> possiblePoses = new List<GrabbablePose>();
foreach(var handPose in this.poses)
if(handPose != null && handPose.CanSetPose(hand, grab))
possiblePoses.Add(handPose);
float closestValue = float.MaxValue;
int closestIndex = 0;
for (int i = 0; i < possiblePoses.Count; i++){
var pregrabPos = hand.transform.position;
var pregrabRot = hand.transform.rotation;
var pregrabBodPos = hand.body.position;
var pregrabBodRot = hand.body.rotation;
var tempContainer = AutoHandExtensions.transformRuler;
tempContainer.rotation = Quaternion.identity;
tempContainer.position = possiblePoses[i].transform.position;
tempContainer.localScale = possiblePoses[i].transform.lossyScale;
var handMatch = AutoHandExtensions.transformRulerChild;
handMatch.position = hand.transform.position;
handMatch.rotation = hand.transform.rotation;
pose = possiblePoses[i].GetHandPoseData(hand);
handMatch.localPosition = pose.handOffset;
handMatch.localRotation = pose.localQuaternionOffset;
var distance = Vector3.Distance(handMatch.position, pregrabPos);
var angleDistance = Quaternion.Angle(handMatch.rotation, pregrabRot) / 90f;
var closenessValue = distance / possiblePoses[i].positionWeight + angleDistance / possiblePoses[i].rotationWeight;
if(closenessValue < closestValue) {
closestIndex = i;
closestValue = closenessValue;
}
hand.transform.position = pregrabPos;
hand.transform.rotation = pregrabRot;
hand.body.position = pregrabBodPos;
hand.body.rotation = pregrabBodRot;
}
return possiblePoses[closestIndex];
}
internal int PoseCount() {
return poses.Count;
}
}
}