protected bool TryGetPlaneData(LayerPlaneData layerPlane, Pose layerOriginPose,
                                       List <Vector3> vertices, out Pose pose, out Vector3 center, out Vector2 extents)
        {
            var layerPlaneVertices = layerPlane.Vertices;

            extents = GeometryUtils.OrientedMinimumBoundingBox2D(layerPlaneVertices, k_PlaneBoundingBox);
            if (extents.x < m_MinSideLength || extents.y < m_MinSideLength)
            {
                pose   = default;
                center = default;
                return(false);
            }

            var centroid       = GeometryUtils.PolygonCentroid2D(layerPlaneVertices);
            var layerPlanePose = new Pose(centroid, GeometryUtils.RotationForBox(k_PlaneBoundingBox));

            foreach (var vertex in layerPlaneVertices)
            {
                var localVertex = layerPlanePose.ApplyInverseOffsetTo(vertex);
                vertices.Add(localVertex);
            }

            for (var j = 0; j < k_PlaneBoundingBox.Length; ++j)
            {
                k_PlaneBoundingBox[j] = layerPlanePose.ApplyInverseOffsetTo(k_PlaneBoundingBox[j]);
            }

            layerPlanePose.position += k_Up * (layerPlane.YOffsetFromLayer + k_PlaneYEpsilon);
            pose   = layerOriginPose.ApplyOffsetTo(layerPlanePose);
            center = (k_PlaneBoundingBox[0] + k_PlaneBoundingBox[2]) * 0.5f;
            return(true);
        }
Beispiel #2
0
        public void SetPolygonWorldSpace(List <Vector3> newWorldVertices, Pose newPose)
        {
            // Remove extra elements beyond size of input list
            if (newWorldVertices.Count < m_WorldVerts.Count)
            {
                m_WorldVerts.RemoveRange(newWorldVertices.Count, m_WorldVerts.Count - newWorldVertices.Count);
            }

            if (newWorldVertices.Count < m_LocalVerts.Count)
            {
                m_LocalVerts.RemoveRange(newWorldVertices.Count, m_LocalVerts.Count - newWorldVertices.Count);
            }

            // Copy values and transform from world to local
            for (var i = 0; i < newWorldVertices.Count; i++)
            {
                if (i < m_WorldVerts.Count)
                {
                    m_WorldVerts[i] = newWorldVertices[i];
                }
                else
                {
                    m_WorldVerts.Add(newWorldVertices[i]);
                }

                if (i < m_LocalVerts.Count)
                {
                    m_LocalVerts[i] = newPose.ApplyInverseOffsetTo(newWorldVertices[i]);
                }
                else
                {
                    m_LocalVerts.Add(newPose.ApplyInverseOffsetTo(newWorldVertices[i]));
                }
            }

            pose = newPose;
        }