public void FindComparingNames() { List <Transform> reprs = new List <Transform>(); searchForReprsUnderThese.ForEach(x => reprs.AddRange(x.GetComponentsInChildren <Transform>(true))); List <Transform> reprsOfPoint; for (int p = 0; p < points.Count; p++) { if (points[p].endsWith == "") { continue; } reprsOfPoint = reprs.FindAll(r => r.name.ToLower().EndsWith(points[p].endsWith.ToLower())); for (int r = 0; r < reprsOfPoint.Count; r++) { ReprModel reprModel = reprsOfPoint[r].GetComponent <ReprModel>(); if (reprModel != null && !points[p].representations.Contains(reprModel)) { points[p].representations.Add(reprModel); } else { Debug.LogWarning(reprsOfPoint[r].name + " does not have a ReprModel attached!"); } } } }
void UpdateBoneTsfPos(ReprModel repr, Transform applyToThis, AbstractTsf inputData, float maxSpeed, Transform referenceTsf, Transform replicatedTsf) { AvatarController avatarCtrl = repr.point.bone.part.body.avatar.controller; Vector3 desiredWorldPos; if (inputData.space == Space.World) { desiredWorldPos = inputData.position; } else { desiredWorldPos = avatarCtrl.GetWorldFromLocalPoition(inputData.position, repr); } if (referenceTsf && replicatedTsf) { Vector3 relPos = referenceTsf.InverseTransformPoint(desiredWorldPos); desiredWorldPos = replicatedTsf.TransformPoint(relPos); } if (maxSpeed > 0.0f) { applyToThis.position += Vector3.ClampMagnitude(desiredWorldPos - applyToThis.position, maxSpeed * Time.deltaTime); } else { applyToThis.position = desiredWorldPos; } }
void UpdateBoneTsfRot(ReprModel repr, Transform applyToThis, AbstractTsf inputData, float maxSpeed, Transform referenceTsf, Transform replicatedTsf) { AvatarController avatarCtrl = repr.point.bone.part.body.avatar.controller; Quaternion desiredWorldRot; if (inputData.space == Space.World) { desiredWorldRot = inputData.rotation; } else { desiredWorldRot = avatarCtrl.GetWorldFromLocalRotation(inputData.rotation, repr); } if (referenceTsf && replicatedTsf) { Quaternion relRot = Quaternion.Inverse(referenceTsf.rotation) * desiredWorldRot; desiredWorldRot = replicatedTsf.rotation * relRot; } if (maxSpeed > 0.0f) { applyToThis.rotation = BasicHelpers.ClampQuaternion(applyToThis.rotation, desiredWorldRot, maxSpeed * Time.deltaTime); } else { applyToThis.rotation = desiredWorldRot; } }
public static void ApplyFingerPose(FingerPose pose, FingerModel finger, string toReprKey, bool pos, bool rot, bool scale, bool inverted) { if (!finger.tip || !finger.tip.bone) { Debug.LogWarning("It was not possible to find distal bone for finger " + finger.name + ". Finger pose cannot be applied"); return; } if (pose == null || !finger) { Debug.LogWarning("Missing finger pose or finger destination. Finger pose cannot be applied"); return; } for (int pb = 1; pb <= pose.bones.Count; pb++) { // From tip to root (full length) int poseBoneIndex = pose.bones.Count - pb; int fingerBoneIndex = finger.bonesFromRootToTip.Count - pb; if (poseBoneIndex < 0) { break; } if (fingerBoneIndex < 0) { break; } if (pose.bones[poseBoneIndex].space != Space.Self) { Debug.LogError("Pose for finger " + pose.finger.ToString() + " and bone " + pose.bones[poseBoneIndex].name + " does not have its AbstractTsf configured in local space. FingerPose cannot be applied completely"); continue; } ReprModel boneRepr = finger.bonesFromRootToTip[fingerBoneIndex].reprs[toReprKey]; if (pos) { boneRepr.localPosition = pose.bones[poseBoneIndex].position; if (inverted) { boneRepr.localPosition *= -1.0f; } } if (rot) { Quaternion localRot; if (fingerBoneIndex == 0 && poseBoneIndex > 0) { localRot = pose.bones[poseBoneIndex - 1].rotation * pose.bones[poseBoneIndex].rotation; } else { localRot = pose.bones[poseBoneIndex].rotation; } boneRepr.localRotation = localRot; } if (scale) { boneRepr.transformRef.localScale = pose.bones[poseBoneIndex].localScale; } } }