BEPUphysics.CollisionShapes.ConvexShapes.ConvexHullShape.GetBoundingBox C# (CSharp) Метод

GetBoundingBox() публичный Метод

Gets the bounding box of the shape given a transform.
public GetBoundingBox ( RigidTransform &shapeTransform, BoundingBox &boundingBox ) : void
shapeTransform BEPUutilities.RigidTransform Transform to use.
boundingBox BoundingBox Bounding box of the transformed shape.
Результат void
        public override void GetBoundingBox(ref RigidTransform shapeTransform, out BoundingBox boundingBox)
        {
#if !WINDOWS
            boundingBox = new BoundingBox();
#endif

            Matrix3x3 o;
            Matrix3x3.CreateFromQuaternion(ref shapeTransform.Orientation, out o);

            float minX, maxX;
            float minY, maxY;
            float minZ, maxZ;
            var right = new Vector3(o.M11, o.M21, o.M31);
            var up = new Vector3(o.M12, o.M22, o.M32);
            var backward = new Vector3(o.M13, o.M23, o.M33);
            Vector3.Dot(ref vertices.Elements[0], ref right, out maxX);
            minX = maxX;
            Vector3.Dot(ref vertices.Elements[0], ref up, out maxY);
            minY = maxY;
            Vector3.Dot(ref vertices.Elements[0], ref backward, out maxZ);
            minZ = maxZ;
            int minXIndex = 0;
            int maxXIndex = 0;
            int minYIndex = 0;
            int maxYIndex = 0;
            int minZIndex = 0;
            int maxZIndex = 0;
            for (int i = 1; i < vertices.Count; i++)
            {
                float dot;
                Vector3.Dot(ref vertices.Elements[i], ref right, out dot);
                if (dot < minX)
                {
                    minX = dot;
                    minXIndex = i;
                }
                else if (dot > maxX)
                {
                    maxX = dot;
                    maxXIndex = i;
                }

                Vector3.Dot(ref vertices.Elements[i], ref up, out dot);
                if (dot < minY)
                {
                    minY = dot;
                    minYIndex = i;
                }
                else if (dot > maxY)
                {
                    maxY = dot;
                    maxYIndex = i;
                }

                Vector3.Dot(ref vertices.Elements[i], ref backward, out dot);
                if (dot < minZ)
                {
                    minZ = dot;
                    minZIndex = i;
                }
                else if (dot > maxZ)
                {
                    maxZ = dot;
                    maxZIndex = i;
                }
            }

            Vector3 minXpoint, maxXpoint, minYpoint, maxYpoint, minZpoint, maxZpoint;

            Matrix3x3.Transform(ref vertices.Elements[minXIndex], ref o, out minXpoint);
            Matrix3x3.Transform(ref vertices.Elements[maxXIndex], ref o, out maxXpoint);
            Matrix3x3.Transform(ref vertices.Elements[minYIndex], ref o, out minYpoint);
            Matrix3x3.Transform(ref vertices.Elements[maxYIndex], ref o, out maxYpoint);
            Matrix3x3.Transform(ref vertices.Elements[minZIndex], ref o, out minZpoint);
            Matrix3x3.Transform(ref vertices.Elements[maxZIndex], ref o, out maxZpoint);

            boundingBox.Max.X = shapeTransform.Position.X + collisionMargin + maxXpoint.X;
            boundingBox.Max.Y = shapeTransform.Position.Y + collisionMargin + maxYpoint.Y;
            boundingBox.Max.Z = shapeTransform.Position.Z + collisionMargin + maxZpoint.Z;

            boundingBox.Min.X = shapeTransform.Position.X - collisionMargin + minXpoint.X;
            boundingBox.Min.Y = shapeTransform.Position.Y - collisionMargin + minYpoint.Y;
            boundingBox.Min.Z = shapeTransform.Position.Z - collisionMargin + minZpoint.Z;
        }