Pointable Canvas Event works with Quest Link, but not when built to headset.
Hello fellow devs, I am using the RayCanvasFlat that comes with the samples for Meta Interaction SDK for my project. There is a wall object in an architecture scene and I want to be able to use the ray pinch functionality to select this wall and call an event to pop up a menu to interact with this wall. I used the RayCanvasFlat prefab and removed all text and buttons from it, duplicated it 3 times and placed them on 3 sides of the exposed wall: I added a pointable canvas unity event wrapper and in the select part I added my menu scaler. Here is the pointable canvas module settings: When I run the scene in unity editor, and I point and pinch at the canvases around the wall, I get the event called successfully and the menu pops up. However, when I make the build and run the build on Quest 3 untethered, pointing at the canvases still works (I see the cursor and the click effect) but the unity event to scale up the menu does not work... Any ideas how I can debug this or fix it? If there is also a way for me to use this ray interactor + pinch without a canvas where I can see the cursor similar to how it appears on canvas, I would be grateful for directions too. Thanks in advance!1.3KViews0likes1CommentMeta Interaction SDK and Mouseclicks
I am using the Meta XR interaction Toolkit and its Components. My Problem: I am in Playmode on my PC and have a Oculus hooked up via Link. I have 2 Displays. Display 1 (VR) Where the the Player is in a room with an interactable Panel. (Grab, Point, Select works) Display 2(PC) I have an UI Button. When its clicked something should happen. As far as i know the Meta SDK needs the PointableCanvasModule for the Events to work. But then my Mouseclick on Display 2 doesnt register. When i have the Standalone Input Module active, my mouseclicks works, but i can't interact with the Canvas anymore. Video that shows the Problem: https://streamable.com/uin4ms How can i use my Mouseclick and the VR Hands at the same time? Big_Flex I read that you work on the Interaction SDK team, so i tagged you š Thanks for the help556Views0likes0CommentsHow to modify Grabable scripts?
I renamed HandGrabInteractable to HandleLeft and confirmed that the grab functionality is working well. Additionally, I want to save the position when HandleLeft is grabbed and moved, and create a new object at that position. So, I wanted to add a public bool DropDown variable inside the Grabbable script and set DropDown = true during EndTransform(), but it keeps getting deleted automatically. I'm not sure how to solve this issue. Please help. + Additionally, the PointableElement, IGrabbable properties are not enabled. (The font color does not change.) Note : Visual Studio 2022 , Unity 2022.03.20f1,meta XR interaction SDK 63.00 /* * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * Licensed under the Oculus SDK License Agreement (the "License"); * you may not use the Oculus SDK except in compliance with the License, * which is provided at the time of installation or download, or which * otherwise accompanies this software in either electronic or hard copy form. * * You may obtain a copy of the License at * * https://developer.oculus.com/licenses/oculussdk/ * * Unless required by applicable law or agreed to in writing, the Oculus SDK * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System.Collections.Generic; using UnityEngine; namespace Oculus.Interaction { /// <summary> /// Moves the object it's attached to when an Interactor selects that object. /// </summary> public class Grabbable : PointableElement, IGrabbable { /// <summary> /// A One Grab...Transformer component, which should be attached to the grabbable object. Defaults to One Grab Free Transformer. /// If you set the Two Grab Transformer property and still want to use one hand for grabs, you must set this property as well. /// </summary> [Tooltip("A One Grab...Transformer component, which should be attached to the grabbable object. Defaults to One Grab Free Transformer. If you set the Two Grab Transformer property and still want to use one hand for grabs, you must set this property as well.")] [SerializeField, Interface(typeof(ITransformer))] [Optional(OptionalAttribute.Flag.AutoGenerated)] private UnityEngine.Object _oneGrabTransformer = null; /// <summary> /// A Two Grab...Transformer component, which should be attached to the grabbable object. /// If you set this property but also want to use one hand for grabs, you must set the One Grab Transformer property. /// </summary> [Tooltip("A Two Grab...Transformer component, which should be attached to the grabbable object. If you set this property but also want to use one hand for grabs, you must set the One Grab Transformer property.")] [SerializeField, Interface(typeof(ITransformer)), Optional] private UnityEngine.Object _twoGrabTransformer = null; [Tooltip("The target transform of the Grabbable. If unassigned, " + "the transform of this GameObject will be used.")] [SerializeField] [Optional(OptionalAttribute.Flag.AutoGenerated)] private Transform _targetTransform; /// <summary> /// The maximum number of grab points. Can be either -1 (unlimited), 1, or 2. /// </summary> [Tooltip("The maximum number of grab points. Can be either -1 (unlimited), 1, or 2.")] [SerializeField] private int _maxGrabPoints = -1; public int MaxGrabPoints { get { return _maxGrabPoints; } set { _maxGrabPoints = value; } } public Transform Transform => _targetTransform; public List<Pose> GrabPoints => _selectingPoints; private ITransformer _activeTransformer = null; private ITransformer OneGrabTransformer; private ITransformer TwoGrabTransformer; protected override void Awake() { base.Awake(); OneGrabTransformer = _oneGrabTransformer as ITransformer; TwoGrabTransformer = _twoGrabTransformer as ITransformer; } protected override void Start() { this.BeginStart(ref _started, () => base.Start()); if (_targetTransform == null) { _targetTransform = transform; } if (_oneGrabTransformer != null) { this.AssertField(OneGrabTransformer, nameof(OneGrabTransformer)); OneGrabTransformer.Initialize(this); } if (_twoGrabTransformer != null) { this.AssertField(TwoGrabTransformer, nameof(TwoGrabTransformer)); TwoGrabTransformer.Initialize(this); } // Create a default if no transformers assigned if (OneGrabTransformer == null && TwoGrabTransformer == null) { OneGrabFreeTransformer defaultTransformer = gameObject.AddComponent<OneGrabFreeTransformer>(); _oneGrabTransformer = defaultTransformer; OneGrabTransformer = defaultTransformer; OneGrabTransformer.Initialize(this); } this.EndStart(ref _started); } public override void ProcessPointerEvent(PointerEvent evt) { switch (evt.Type) { case PointerEventType.Select: EndTransform(); break; case PointerEventType.Unselect: ForceMove(evt); EndTransform(); break; case PointerEventType.Cancel: EndTransform(); break; } base.ProcessPointerEvent(evt); switch (evt.Type) { case PointerEventType.Select: BeginTransform(); break; case PointerEventType.Unselect: BeginTransform(); break; case PointerEventType.Move: UpdateTransform(); break; } } private void ForceMove(PointerEvent releaseEvent) { PointerEvent moveEvent = new PointerEvent(releaseEvent.Identifier, PointerEventType.Move, releaseEvent.Pose, releaseEvent.Data); ProcessPointerEvent(moveEvent); } // Whenever we change the number of grab points, we save the // current transform data private void BeginTransform() { // End the transform on any existing transformer before we // begin the new one EndTransform(); int useGrabPoints = _selectingPoints.Count; if (_maxGrabPoints != -1) { useGrabPoints = Mathf.Min(useGrabPoints, _maxGrabPoints); } switch (useGrabPoints) { case 1: _activeTransformer = OneGrabTransformer; break; case 2: _activeTransformer = TwoGrabTransformer; break; default: _activeTransformer = null; break; } if (_activeTransformer == null) { return; } _activeTransformer.BeginTransform(); } private void UpdateTransform() { if (_activeTransformer == null) { return; } _activeTransformer.UpdateTransform(); } private void EndTransform() { if (_activeTransformer == null) { return; } _activeTransformer.EndTransform(); _activeTransformer = null; } protected override void OnDisable() { if (_started) { EndTransform(); } base.OnDisable(); } #region Inject public void InjectOptionalOneGrabTransformer(ITransformer transformer) { _oneGrabTransformer = transformer as UnityEngine.Object; OneGrabTransformer = transformer; } public void InjectOptionalTwoGrabTransformer(ITransformer transformer) { _twoGrabTransformer = transformer as UnityEngine.Object; TwoGrabTransformer = transformer; } public void InjectOptionalTargetTransform(Transform targetTransform) { _targetTransform = targetTransform; } #endregion } } ā1.3KViews0likes0CommentsUnity Help Needed: Preserving Object Position After Grab and Instantiating New Object
I renamed HandGrabInteractable to HandleLeft and confirmed that the grab functionality is working well. Additionally, I want to save the position when HandleLeft is grabbed and moved, and create a new object at that position. So, I wanted to add a public bool DropDown variable inside the Grabbable script and set DropDown = true during EndTransform(), but it keeps getting deleted automatically. I'm not sure how to solve this issue. Please help.. + the PointableElement, IGrabbable properties are not enabled. (The font color does not change.) Note: Visual Studio 2022, Unity 2022.03.20f1, meta XR interaction SDK 63.00 /* * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * Licensed under the Oculus SDK License Agreement (the "License"); * you may not use the Oculus SDK except in compliance with the License, * which is provided at the time of installation or download, or which * otherwise accompanies this software in either electronic or hard copy form. * * You may obtain a copy of the License at * * https://developer.oculus.com/licenses/oculussdk/ * * Unless required by applicable law or agreed to in writing, the Oculus SDK * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System.Collections.Generic; using UnityEngine; namespace Oculus.Interaction { /// <summary> /// Moves the object it's attached to when an Interactor selects that object. /// </summary> public class Grabbable : PointableElement, IGrabbable { /// <summary> /// A One Grab...Transformer component, which should be attached to the grabbable object. Defaults to One Grab Free Transformer. /// If you set the Two Grab Transformer property and still want to use one hand for grabs, you must set this property as well. /// </summary> [Tooltip("A One Grab...Transformer component, which should be attached to the grabbable object. Defaults to One Grab Free Transformer. If you set the Two Grab Transformer property and still want to use one hand for grabs, you must set this property as well.")] [SerializeField, Interface(typeof(ITransformer))] [Optional(OptionalAttribute.Flag.AutoGenerated)] private UnityEngine.Object _oneGrabTransformer = null; /// <summary> /// A Two Grab...Transformer component, which should be attached to the grabbable object. /// If you set this property but also want to use one hand for grabs, you must set the One Grab Transformer property. /// </summary> [Tooltip("A Two Grab...Transformer component, which should be attached to the grabbable object. If you set this property but also want to use one hand for grabs, you must set the One Grab Transformer property.")] [SerializeField, Interface(typeof(ITransformer)), Optional] private UnityEngine.Object _twoGrabTransformer = null; [Tooltip("The target transform of the Grabbable. If unassigned, " + "the transform of this GameObject will be used.")] [SerializeField] [Optional(OptionalAttribute.Flag.AutoGenerated)] private Transform _targetTransform; /// <summary> /// The maximum number of grab points. Can be either -1 (unlimited), 1, or 2. /// </summary> [Tooltip("The maximum number of grab points. Can be either -1 (unlimited), 1, or 2.")] [SerializeField] private int _maxGrabPoints = -1; public int MaxGrabPoints { get { return _maxGrabPoints; } set { _maxGrabPoints = value; } } public Transform Transform => _targetTransform; public List<Pose> GrabPoints => _selectingPoints; private ITransformer _activeTransformer = null; private ITransformer OneGrabTransformer; private ITransformer TwoGrabTransformer; protected override void Awake() { base.Awake(); OneGrabTransformer = _oneGrabTransformer as ITransformer; TwoGrabTransformer = _twoGrabTransformer as ITransformer; } protected override void Start() { this.BeginStart(ref _started, () => base.Start()); if (_targetTransform == null) { _targetTransform = transform; } if (_oneGrabTransformer != null) { this.AssertField(OneGrabTransformer, nameof(OneGrabTransformer)); OneGrabTransformer.Initialize(this); } if (_twoGrabTransformer != null) { this.AssertField(TwoGrabTransformer, nameof(TwoGrabTransformer)); TwoGrabTransformer.Initialize(this); } // Create a default if no transformers assigned if (OneGrabTransformer == null && TwoGrabTransformer == null) { OneGrabFreeTransformer defaultTransformer = gameObject.AddComponent<OneGrabFreeTransformer>(); _oneGrabTransformer = defaultTransformer; OneGrabTransformer = defaultTransformer; OneGrabTransformer.Initialize(this); } this.EndStart(ref _started); } public override void ProcessPointerEvent(PointerEvent evt) { switch (evt.Type) { case PointerEventType.Select: EndTransform(); break; case PointerEventType.Unselect: ForceMove(evt); EndTransform(); break; case PointerEventType.Cancel: EndTransform(); break; } base.ProcessPointerEvent(evt); switch (evt.Type) { case PointerEventType.Select: BeginTransform(); break; case PointerEventType.Unselect: BeginTransform(); break; case PointerEventType.Move: UpdateTransform(); break; } } private void ForceMove(PointerEvent releaseEvent) { PointerEvent moveEvent = new PointerEvent(releaseEvent.Identifier, PointerEventType.Move, releaseEvent.Pose, releaseEvent.Data); ProcessPointerEvent(moveEvent); } // Whenever we change the number of grab points, we save the // current transform data private void BeginTransform() { // End the transform on any existing transformer before we // begin the new one EndTransform(); int useGrabPoints = _selectingPoints.Count; if (_maxGrabPoints != -1) { useGrabPoints = Mathf.Min(useGrabPoints, _maxGrabPoints); } switch (useGrabPoints) { case 1: _activeTransformer = OneGrabTransformer; break; case 2: _activeTransformer = TwoGrabTransformer; break; default: _activeTransformer = null; break; } if (_activeTransformer == null) { return; } _activeTransformer.BeginTransform(); } private void UpdateTransform() { if (_activeTransformer == null) { return; } _activeTransformer.UpdateTransform(); } private void EndTransform() { if (_activeTransformer == null) { return; } _activeTransformer.EndTransform(); _activeTransformer = null; } protected override void OnDisable() { if (_started) { EndTransform(); } base.OnDisable(); } #region Inject public void InjectOptionalOneGrabTransformer(ITransformer transformer) { _oneGrabTransformer = transformer as UnityEngine.Object; OneGrabTransformer = transformer; } public void InjectOptionalTwoGrabTransformer(ITransformer transformer) { _twoGrabTransformer = transformer as UnityEngine.Object; TwoGrabTransformer = transformer; } public void InjectOptionalTargetTransform(Transform targetTransform) { _targetTransform = targetTransform; } #endregion } }892Views0likes1Comment"Black" non-transparent hands when using the default Meta shader
When using Meta's shader for the hands + changing the style of passthrough, the hands transparency is not rendered correctly. It happens in both Quest 2 and 3. I'm sure this was working just a few days ago. Could it be caused by the new v64 OS update? Has anyone else seen this recently? This: Instead of512Views0likes0CommentsHand interaction only works for left hand
I want to use hand interactions for my application to pick up a ball. I have tried the Interaction SDK samples HandTracking scene and that works fine. I can pick up all the object with either my right hand or my left hand. So I copied that scene to build my own. I replaced the smallPinch object (the key) with a small ball and adjusted the handpose around it so that you grab it with your whole hand. When I test it, it works fine for my left hand, but it does not work for my right hand. And strangely enough the other objects (the thorch and the cup) also only work for my left hand. And I did not change anything on them nor in the rest of the scene. The only change is the interactable. How is this possible? Big_Flex I saw in another post that you're working on the interaction SDK, Hope you don't mind me tagging you in this. Thanks!1.4KViews0likes2CommentsHand placement wrong in build using Oculus Plug-in Provider
I have also tried making a basic project from scratch and the problem still occurs. If I use OpenXR as the plugin provider the hand placement is perfect, but as soon as I switch to Oculus the hands appear significantly lower then they should. Unfortunately my project doesn't work with OpenXR as the provider and there are various options with the Oculus provider that I require anyway. He's my repro steps for a plain sample project that shows the problem. Broken version: New 3D Unity project in Unity 2022.3.10 (also occurrs in 2022.3.17) Switch platform to Android Open Package Manager and install XR Interaction Toolkit Confirm yes to enabling the backends when prompted Install XR Plugin Management, OpenXR Plugin and Oculus XR Plugin in Package Manager Import Starter Assets sample from XR Interaction Toolkit package Open scene Assets/Samples/XR Interaction Toolkit/2.5.2/Starter Assets/DemoScene In Project Settings/XR Plug-in Management, set Oculus as Plug-in Provider Build & Run. Notice controller position is far lower than expected. Fixed version: Switch Plug-in Provider to OpenXR under Project Settings/XR Plug-in Management/OpenXR/Interaction Profiles add "Meta Quest Touch Pro Controller Profile" and "Oculus Touch Controller Profile" Under OpenXR Feature Groups enable Meta Quest Support Project Settings/XR Plug-in Management/Project Validation click Fix All Build & Run. Controllers now appear in correct position667Views0likes0CommentsSkeleton physical colliders pose not updated during hand tracking
I run the HandsInteractionTrainScene in Quest with Unity, and find that the skeleton physical colliders are not updated with hand tracking pose. I only turn on the Render Physics Capsules and allow Hand Tracking Support in OVRCameraRig. Does anyone know what's going on? You can see the footage in the attached zip file.Solved4KViews1like7CommentsDoes anyone know how to dynamically constrain hand position during grab interaction?
I am using Quest 2 controllers represented as hands. Started with the Complex Grab sample scene. I've created a custom object with custom grab points, hand pose, etc. and that works fine. What I have been trying to do is, if you have picked up an object the object + hand should collide and not be able to pass through a panel. Think of, for example, drawing on a board. You don't want the pen and hand to simply pass through the board. I know ways to do this in normal Unity or using XRI Toolkit - it's a fairly trivial thing - but the Interaction SDK is not playing nice. I also tried deconstructing the pin board prefab and using those OneHandTranslateTransformer and InteractableTransformerConnection components but I couldn't get it to work how I want. For one, they affect rotation as well as position but I just want to constrain position. In addition, those constraints kick in the moment you grab the object, but I need the constraint behavior to happen only when the tool (e.g., a pen) touches a specific object (e.g., drawing board). Couldn't seem to override this via script. Has anyone done this before with GrabInteractable type of objects? Or more generally, is there a GameObject one can interact with for constraining hand position? Thank you!3.5KViews0likes3CommentsMeta Avatars are nearly useless, and there is no support or documentation.
My company has been trying to implement the Meta Avatars into a game we are developing. As many VR games do, this involves holding many different items in VR with different hand poses. The only example of a custom hand pose, is primitive at best, with the custom pose being 24 transforms with a Skeleton Renderer script. There is no way to model poses accurately, and you can't even see what it looks like with a skin, until you run it. Move a transform the wrong way, and your fingers are a tangled up mess. Meta has spent literally billions of dollars on various software and game development for the Quest, including the Avatar SDK. It absolutely baffles me that there is no available support for it. No good examples, the documentation is extremely lacking. At least give me a hand model or something that can be used to model a hand, other than a pile of bones (vectors). The oculus integration hands look similar, but models are not compatible. Please, someone tell me I am wrong, and I have just been looking in all the wrong places. Tell me there is some actual documentation besides https://developer.oculus.com/documentation/unity/meta-avatars-custom-hand-poses/ Those documents sound like you can just add some joint types to any old hand model and they will work fine.. please show me one that will, because none have worked for us. Every time I search for solutions, all I can find is other people having the same issues. I am about to give up on even using Meta Avatars, because if we can't make the game feel good with them, I'd rather use another avatar solution, or even no avatar at all.2.3KViews9likes1Comment