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.
		
		
		
		
		
			
		
			
	
	
		
			78 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C#
		
	
		
		
			
		
	
	
			78 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C#
		
	
| 
								 
											1 year ago
										 
									 | 
							
								using UnityEngine;
							 | 
						||
| 
								 | 
							
								using System.Collections;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace RootMotion.FinalIK {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// <summary>
							 | 
						||
| 
								 | 
							
									/// Posing the children of a Transform to match the children of another Transform
							 | 
						||
| 
								 | 
							
									/// </summary>
							 | 
						||
| 
								 | 
							
									public class HandPoser : Poser {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										public override void AutoMapping() {
							 | 
						||
| 
								 | 
							
											if (poseRoot == null) poseChildren = new Transform[0];
							 | 
						||
| 
								 | 
							
											else poseChildren = (Transform[])poseRoot.GetComponentsInChildren<Transform>();
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
											_poseRoot = poseRoot;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										protected override void InitiatePoser() {
							 | 
						||
| 
								 | 
							
											// Find the children
							 | 
						||
| 
								 | 
							
											children = (Transform[])GetComponentsInChildren<Transform>();
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
											StoreDefaultState();
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
										protected override void FixPoserTransforms() {
							 | 
						||
| 
								 | 
							
											for (int i = 0; i < children.Length; i++) {
							 | 
						||
| 
								 | 
							
												children[i].localPosition = defaultLocalPositions[i];
							 | 
						||
| 
								 | 
							
												children[i].localRotation = defaultLocalRotations[i];
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										protected override void UpdatePoser() {
							 | 
						||
| 
								 | 
							
											if (weight <= 0f) return;
							 | 
						||
| 
								 | 
							
											if (localPositionWeight <= 0f && localRotationWeight <= 0f) return;
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
											// Get the children, if we don't have them already
							 | 
						||
| 
								 | 
							
											if (_poseRoot != poseRoot) AutoMapping();
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
											if (poseRoot == null) return;
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
											// Something went wrong
							 | 
						||
| 
								 | 
							
											if (children.Length != poseChildren.Length) {
							 | 
						||
| 
								 | 
							
												Warning.Log("Number of children does not match with the pose", transform);
							 | 
						||
| 
								 | 
							
												return;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
											// Calculate weights
							 | 
						||
| 
								 | 
							
											float rW = localRotationWeight * weight;
							 | 
						||
| 
								 | 
							
											float pW = localPositionWeight * weight;
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
											// Lerping the localRotation and the localPosition
							 | 
						||
| 
								 | 
							
											for (int i = 0; i < children.Length; i++) {
							 | 
						||
| 
								 | 
							
												if (children[i] != transform) {
							 | 
						||
| 
								 | 
							
													children[i].localRotation = Quaternion.Lerp(children[i].localRotation, poseChildren[i].localRotation, rW);
							 | 
						||
| 
								 | 
							
													children[i].localPosition = Vector3.Lerp(children[i].localPosition, poseChildren[i].localPosition, pW);
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										protected Transform[] children;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										private Transform _poseRoot;
							 | 
						||
| 
								 | 
							
										private Transform[] poseChildren;
							 | 
						||
| 
								 | 
							
										private Vector3[] defaultLocalPositions;
							 | 
						||
| 
								 | 
							
										private Quaternion[] defaultLocalRotations;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										protected void StoreDefaultState() {
							 | 
						||
| 
								 | 
							
											defaultLocalPositions = new Vector3[children.Length];
							 | 
						||
| 
								 | 
							
											defaultLocalRotations = new Quaternion[children.Length];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											for (int i = 0; i < children.Length; i++) {
							 | 
						||
| 
								 | 
							
												defaultLocalPositions[i] = children[i].localPosition;
							 | 
						||
| 
								 | 
							
												defaultLocalRotations[i] = children[i].localRotation;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |