private void AddFingerCapsules(HVRPosableFinger finger) { if (finger == null || finger.Bones == null) { return; } Undo.SetCurrentGroupName("AddFingerCapsules"); for (var i = 0; i < finger.Bones.Count; i++) { var bone = finger.Bones[i]; var go = GameObject.Find("coll_" + bone.Transform.name); if (go == null || go.transform.parent != bone.Transform) { go = new GameObject("coll_" + bone.Transform.name); } go.transform.parent = bone.Transform; go.transform.localPosition = Vector3.zero; go.transform.localRotation = Quaternion.identity; go.transform.localScale = Vector3.one; Undo.RegisterCreatedObjectUndo(go, "AddGO"); var capsule = go.GetComponent <CapsuleCollider>(); if (!capsule) { capsule = go.AddComponent <CapsuleCollider>(); } Transform next; if (i < finger.Bones.Count - 1) { next = finger.Bones[i + 1].Transform; } else { next = finger.Tip; } var jointDelta = next.position - bone.Transform.position; var length = jointDelta.magnitude; if (CapsuleAddRadius && i == finger.Bones.Count - 1) { length -= CapsuleRadius; } go.transform.position += jointDelta.normalized * (length * 0.5f); capsule.height = length; if (CapsuleAddRadius) { capsule.height += CapsuleRadius * 2f; } capsule.radius = CapsuleRadius; capsule.direction = (int)CapsuleDirection; } Undo.CollapseUndoOperations(Undo.GetCurrentGroup()); }
private void FindBonesForFinger(Transform bone, Transform tip, HVRPosableFinger finger) { finger.Bones.Add(new HVRPosableBone() { Transform = bone.transform }); if (tip.parent == bone) { return; } if (bone.childCount > 0) { FindBonesForFinger(bone.GetChild(0), tip, finger); } }
public void FingerSetup() { _fingers = null; if (ThumbRoot) { Thumb = new HVRPosableFinger(); Thumb.Root = ThumbRoot; Thumb.Tip = ThumbTip; FindBonesForFinger(ThumbRoot, ThumbTip, Thumb); } if (IndexRoot) { Index = new HVRPosableFinger(); Index.Root = IndexRoot; Index.Tip = IndexTip; FindBonesForFinger(IndexRoot, IndexTip, Index); } if (MiddleRoot) { Middle = new HVRPosableFinger(); Middle.Root = MiddleRoot; Middle.Tip = MiddleTip; FindBonesForFinger(MiddleRoot, MiddleTip, Middle); } if (RingRoot) { Ring = new HVRPosableFinger(); Ring.Root = RingRoot; Ring.Tip = RingTip; FindBonesForFinger(RingRoot, RingTip, Ring); } if (PinkyRoot) { Pinky = new HVRPosableFinger(); Pinky.Root = PinkyRoot; Pinky.Tip = PinkyTip; FindBonesForFinger(PinkyRoot, PinkyTip, Pinky); } EditorUtility.SetDirty(this); }
private void PoseFinger(HVRPosableFinger finger, HVRPosableFingerData data) { if (finger == null || data == null) { return; } if (finger.Bones == null || data.Bones == null) { return; } for (int i = 0; i < finger.Bones.Count; i++) { var bone = finger.Bones[i]; if (data.Bones.Count - 1 >= i) { var boneData = data.Bones[i]; bone.Transform.localPosition = boneData.Position; bone.Transform.localRotation = boneData.Rotation; } } }
private HVRPosableFingerData MirrorFinger(HVRPosableFinger finger, HVRJointMirrorSetting mirrorOverride, List <HVRJointMirrorSetting> settings) { var fingerData = new HVRPosableFingerData(); for (var i = 0; i < finger.Bones.Count; i++) { var bone = finger.Bones[i]; var boneData = new HVRPosableBoneData(); HVRJointMirrorSetting mirror = null; if (settings != null && i < settings.Count) { mirror = settings[i]; } else if (mirrorOverride != null) { mirror = mirrorOverride; } if (mirror != null) { var euler = bone.Transform.localRotation.eulerAngles; var xAngle = euler.x; var yAngle = euler.y; var zAngle = euler.z; MirrorRotation(mirror.XRotation, ref xAngle); MirrorRotation(mirror.YRotation, ref yAngle); MirrorRotation(mirror.ZRotation, ref zAngle); boneData.Position = bone.Transform.localPosition; boneData.Rotation = Quaternion.Euler(xAngle, yAngle, zAngle); if (mirror.XPosition == FingerMirrorPosition.Opposite) { boneData.Position.x *= -1f; } if (mirror.YPosition == FingerMirrorPosition.Opposite) { boneData.Position.y *= -1f; } if (mirror.ZPosition == FingerMirrorPosition.Opposite) { boneData.Position.z *= -1f; } } else { boneData.Position = bone.Transform.localPosition * -1; boneData.Rotation = bone.Transform.localRotation; } fingerData.Bones.Add(boneData); } return(fingerData); }