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); }
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; }