/* * 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; using UnityEngine; /// /// Represents a volume described by its . /// /// /// This component can be accessed from an that supports it by calling /// from the anchor. /// /// public readonly partial struct OVRBounded3D : IOVRAnchorComponent, IEquatable { /// /// Bounding Box /// /// /// representing the 3D Bounding Box of the Anchor this component is attached to. /// /// If it fails to retrieve the Bounding Box. public Bounds BoundingBox => OVRPlugin.GetSpaceBoundingBox3D(Handle, out var boundsf) ? ConvertBounds(boundsf) : throw new InvalidOperationException("Could not get BoundingBox"); private Bounds ConvertBounds(OVRPlugin.Boundsf openXrBounds) { // OpenXR Bounds describe a volume by its position (or offset) and its size (or extents) // https://registry.khronos.org/OpenXR/specs/1.0/man/html/XrRect3DfFB.html // Unity Bounds describe a volume by its center and its size (or extents) // https://docs.unity3d.com/ScriptReference/Bounds.html var extents = openXrBounds.Size.FromSize3f(); // OpenXR uses a right-handed coordinate system // Unity uses left-handed coordinate system // We therefore need to flip the z axis to convert from OpenXR to Unity // And then, because of the z-axis positive normal, rotate 180 around +y // This ends up being equivalent to flipping x axis var offset = openXrBounds.Pos.FromFlippedXVector3f(); // When flipping one axis, position doesn't point to a min corner any more offset.x -= extents.x; // And add half of the extents to find the center var halfExtents = extents * 0.5f; var center = offset + halfExtents; // Bounds constructor takes the center and the full size (not half extents) return new Bounds(center, extents); } }