public MyIntersectionResultLineTriangleEx? GetIntersectionWithLine(MyEntity physObject, ref MyLine line, IntersectionFlags flags) { BoundingSphere vol = physObject.WorldVolume; // Check if line intersects phys object's current bounding sphere, and if not, return 'no intersection' if (MyUtils.IsLineIntersectingBoundingSphere(ref line, ref vol) == false) return null; // Transform line into 'model instance' local/object space. Bounding box of a line is needed!! Matrix worldInv = physObject.GetWorldMatrixInverted(); return GetIntersectionWithLine(physObject, ref line, ref worldInv, flags); }
public bool GetIntersectionWithSphere(MyEntity physObject, ref BoundingSphere sphere) { // Transform sphere from world space to object space Matrix worldInv = physObject.GetWorldMatrixInverted(); Vector3 positionInObjectSpace = MyUtils.GetTransform(sphere.Center, ref worldInv); BoundingSphere sphereInObjectSpace = new BoundingSphere(positionInObjectSpace, sphere.Radius); var aabb = BoundingBoxHelper.InitialBox; BoundingBoxHelper.AddSphere(ref sphereInObjectSpace, ref aabb); AABB gi_aabb = new AABB(ref aabb.Min, ref aabb.Max); m_overlappedTriangles.Clear(); if (m_bvh.BoxQuery(ref gi_aabb, m_overlappedTriangles)) { // temporary variable for storing tirngle boundingbox info BoundingBox triangleBoundingBox = new BoundingBox(); // Triangles that are directly in this node for (int i = 0; i < m_overlappedTriangles.Count; i++) { var triangleIndex = m_overlappedTriangles[i]; m_model.GetTriangleBoundingBox(triangleIndex, ref triangleBoundingBox); // First test intersection of triangleVertexes's bounding box with bounding sphere. And only if they overlap or intersect, do further intersection tests. if (MyUtils.IsBoxIntersectingSphere(triangleBoundingBox, ref sphereInObjectSpace) == true) { // See that we swaped vertex indices!! MyTriangle_Vertexes triangle; MyTriangleVertexIndices triangleIndices = m_model.Triangles[triangleIndex]; triangle.Vertex0 = m_model.GetVertex(triangleIndices.I0); triangle.Vertex1 = m_model.GetVertex(triangleIndices.I2); triangle.Vertex2 = m_model.GetVertex(triangleIndices.I1); MyPlane trianglePlane = new MyPlane(ref triangle); if (MyUtils.GetSphereTriangleIntersection(ref sphereInObjectSpace, ref trianglePlane, ref triangle) != null) { // If we found intersection we can stop and dont need to look further return true; } } } } return false; }
// Return true if object intersects specified sphere. // This method doesn't return exact point of intersection or any additional data. // We don't look for closest intersection - so we stop on first intersection found. public bool GetIntersectionWithSphere(MyEntity physObject, ref BoundingSphere sphere) { // Transform sphere from world space to object space Matrix worldInv = physObject.GetWorldMatrixInverted(); Vector3 positionInObjectSpace = MyUtils.GetTransform(sphere.Center, ref worldInv); BoundingSphere sphereInObjectSpace = new BoundingSphere(positionInObjectSpace, sphere.Radius); return m_rootNode.GetIntersectionWithSphere(m_model, ref sphereInObjectSpace); }