Exemplo n.º 1
0
        //todo: Fix left hand preference
        private static void ProcessHand(IScene scene, GameObject hand, SteamVR_Input_Sources inputSource, ref GripInfo gripInfo)
        {
            if (hand == null)
            {
                return;
            }

            var handTransform = new Transform(1, hand.transform.rotation.ToClarity(true), hand.transform.position.ToClarity());

            if (SteamVR_Actions.default_GrabGrip.GetStateDown(inputSource))
            {
                var handPosition = hand.transform.position.ToClarity();
                var node         = scene
                                   .EnumerateAllNodes()
                                   .Where(x => x.HasComponent <ManipulateInPresentationComponent>())
                                   .Select(x => x.SearchComponent <ITransformable3DComponent>())
                                   .Where(x => x != null)
                                   .FirstOrDefault(x => (x.LocalBoundingSphere * x.Node.GlobalTransform).Contains(handPosition))
                                   ?.Node;
                if (node != null)
                {
                    var gripTransform = node.GlobalTransform * handTransform.Invert();
                    gripInfo = new GripInfo(node, gripTransform);
                }
            }

            if (!SteamVR_Actions.default_GrabGrip.GetState(inputSource))
            {
                gripInfo = null;
                return;
            }

            if (gripInfo == null)
            {
                return;
            }

            var newGlobalTransform = gripInfo.GripTransform * handTransform;

            gripInfo.Node.Transform = newGlobalTransform *
                                      (gripInfo.Node.ParentNode?.GlobalTransform.Invert() ?? Transform.Identity);
        }
Exemplo n.º 2
0
 public GripInfo(ISceneNode node, Transform gripTransform)
 {
     Node          = node;
     GripTransform = gripTransform;
 }