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