Exemple #1
0
        /// <summary>
        ///     Crear Collider a partir de BoundingBox.
        ///     Crea el BoundingSphere del Collider.
        /// </summary>
        /// <param name="mesh">BoundingBox</param>
        /// <returns>Collider creado</returns>
        public static BoundingBoxCollider fromBoundingBox(TgcBoundingAxisAlignBox aabb)
        {
            var collider = new BoundingBoxCollider();

            collider.Aabb           = aabb;
            collider.BoundingSphere = TgcBoundingSphere.computeFromPoints(aabb.computeCorners()).toClass();
            return(collider);
        }
        /*
         * /// <summary>
         * /// Proyecta un BoundingBox a un rectangulo 2D de screen space
         * /// </summary>
         * public static Rectangle projectAABB(TgcBoundingBox aabb)
         * {
         *  return aabb.projectToScreen();
         * }
         */

        /// <summary>
        ///     Proyectar AABB a 2D
        /// </summary>
        /// <param name="box3d">BoundingBox 3D</param>
        /// <param name="box2D">Rectangulo 2D proyectado</param>
        /// <returns>False si es un caso degenerado de proyeccion y no debe considerarse</returns>
        public static bool projectBoundingBox(TgcBoundingAxisAlignBox box3d, out Rectangle box2D)
        {
            //Datos de viewport
            var d3dDevice = D3DDevice.Instance.Device;
            var viewport  = d3dDevice.Viewport;
            var view      = d3dDevice.Transform.View;
            var proj      = d3dDevice.Transform.Projection;
            var width     = viewport.Width;
            var height    = viewport.Height;

            box2D = new Rectangle();

            //Proyectar los 8 puntos, sin dividir aun por W
            var corners      = box3d.computeCorners();
            var m            = view * proj;
            var projVertices = new TGCVector3[corners.Length];

            for (var i = 0; i < corners.Length; i++)
            {
                var pOut = TGCVector3.Transform(corners[i], TGCMatrix.FromMatrix(m));
                if (pOut.W < 0)
                {
                    return(false);
                }
                projVertices[i] = toScreenSpace(pOut, width, height);
            }

            //Buscar los puntos extremos
            var min      = new TGCVector2(float.MaxValue, float.MaxValue);
            var max      = new TGCVector2(float.MinValue, float.MinValue);
            var minDepth = float.MaxValue;

            foreach (var v in projVertices)
            {
                if (v.X < min.X)
                {
                    min.X = v.X;
                }
                if (v.Y < min.Y)
                {
                    min.Y = v.Y;
                }
                if (v.X > max.X)
                {
                    max.X = v.X;
                }
                if (v.Y > max.Y)
                {
                    max.Y = v.Y;
                }

                if (v.Z < minDepth)
                {
                    minDepth = v.Z;
                }
            }

            //Clamp
            if (min.X < 0f)
            {
                min.X = 0f;
            }
            if (min.Y < 0f)
            {
                min.Y = 0f;
            }
            if (max.X >= width)
            {
                max.X = width - 1;
            }
            if (max.Y >= height)
            {
                max.Y = height - 1;
            }

            //Control de tamaño minimo
            if (max.X - min.X < 1f)
            {
                return(false);
            }
            if (max.Y - min.Y < 1f)
            {
                return(false);
            }

            //Cargar valores de box2D
            box2D.Location = new Point((int)min.X, (int)min.Y);
            box2D.Size     = new Size((int)(max.X - min.X), (int)(max.Y - min.Y));
            return(true);
        }