예제 #1
0
        /// <param name="centreDestination">where the centre of the grid will end up (local)</param>
        private void createCapsule(Vector3 centreDestination, IMyCubeBlock navigationBlock)
        {
            float longestDistanceSquared = 0;

            foreach (Vector3 rejection in rejectionCells)
            {
                float distanceSquared = (rejection - CentreRejection).LengthSquared();
                if (distanceSquared > longestDistanceSquared)
                {
                    longestDistanceSquared = distanceSquared;
                }
            }
            Vector3D P0 = RelativeVector3F.createFromLocal(Centre, myCubeGrid).getWorldAbsolute();
            //Vector3D P1 = RelativeVector3F.createFromLocal(centreDestination, myCubeGrid).getWorldAbsolute();

            // need to extend capsule past destination by distance between remote and front of ship
            Vector3 localPosition = navigationBlock.LocalPosition();
            Ray     navTowardsDest = new Ray(localPosition, DirectionNorm);
            float   tMin, tMax;

            myCubeGrid.LocalVolume.IntersectRaySphere(navTowardsDest, out tMin, out tMax);
            Vector3D P1 = RelativeVector3F.createFromLocal(centreDestination + tMax * DirectionNorm, myCubeGrid).getWorldAbsolute();

            float CapsuleRadius = (float)(Math.Pow(longestDistanceSquared, 0.5) + 3 * myCubeGrid.GridSize);

            myPath = new Capsule(P0, P1, CapsuleRadius);
        }
예제 #2
0
        public static bool IsOnSide(this IMyCubeBlock block, Vector3 side)
        {
            Vector3  blockPosition = block.LocalPosition();
            Vector3D centreOfMass  = block.CubeGrid.Physics.CenterOfMassWorld;
            MatrixD  invWorld      = block.CubeGrid.PositionComp.WorldMatrixNormalizedInv;

            Vector3D.Transform(ref centreOfMass, ref invWorld, out centreOfMass);
            Vector3 localCentreOfMass = centreOfMass;

            float blockPosInDirect; Vector3.Dot(ref blockPosition, ref side, out blockPosInDirect);
            float centreInDirect; Vector3.Dot(ref localCentreOfMass, ref side, out centreInDirect);

            return(blockPosInDirect > centreInDirect);
        }