Esempio n. 1
0
        public void ajustarCamaraSegunColision(Auto auto, List <ObstaculoRigido> obstaculos)
        {
            TgcThirdPersonCamera camera = GuiController.Instance.ThirdPersonCamera;
            Vector3 segmentA;
            Vector3 segmentB;

            camera.generateViewMatrix(out segmentA, out segmentB);

            //Detectar colisiones entre el segmento de recta camara-personaje y todos los objetos del escenario
            Vector3 q;
            float   minDistSq = FastMath.Pow2(camera.OffsetForward);

            foreach (ObstaculoRigido obstaculo in obstaculos)
            {
                //Hay colision del segmento camara-personaje y el objeto
                if (TgcCollisionUtils.intersectSegmentAABB(segmentB, segmentA, obstaculo.mesh.BoundingBox, out q))
                {
                    //Si hay colision, guardar la que tenga menor distancia
                    float distSq = (Vector3.Subtract(q, segmentB)).LengthSq();
                    if (distSq < minDistSq)
                    {
                        minDistSq = distSq;

                        //Le restamos un poco para que no se acerque tanto
                        minDistSq /= 2;
                    }
                }
            }

            //Acercar la camara hasta la minima distancia de colision encontrada (pero ponemos un umbral maximo de cercania)
            float newOffsetForward = FastMath.Sqrt(minDistSq);

            camera.OffsetForward = newOffsetForward;
        }
        /// <summary>
        /// Ajustar la posicion de la camara segun la colision con los objetos del escenario.
        /// Acerca la distancia entre el persona y la camara si hay colisiones de objetos
        /// en el medio
        /// </summary>
        private void ajustarPosicionDeCamara(TgcSkeletalMesh personaje, List <TgcBox> obstaculos)
        {
            //Actualizar valores de camara segun modifiers
            TgcThirdPersonCamera camera = GuiController.Instance.ThirdPersonCamera;

            camera.OffsetHeight  = (float)GuiController.Instance.Modifiers["offsetHeight"];
            camera.OffsetForward = (float)GuiController.Instance.Modifiers["offsetForward"];
            Vector2 displacement = (Vector2)GuiController.Instance.Modifiers["displacement"];

            camera.TargetDisplacement = new Vector3(displacement.X, displacement.Y, 0);

            //Pedirle a la camara cual va a ser su proxima posicion
            Vector3 segmentA;
            Vector3 segmentB;

            camera.generateViewMatrix(out segmentA, out segmentB);

            //Detectar colisiones entre el segmento de recta camara-personaje y todos los objetos del escenario
            Vector3 q;
            float   minDistSq = FastMath.Pow2(camera.OffsetForward);

            foreach (TgcBox obstaculo in obstaculos)
            {
                //Hay colision del segmento camara-personaje y el objeto
                if (TgcCollisionUtils.intersectSegmentAABB(segmentB, segmentA, obstaculo.BoundingBox, out q))
                {
                    //Si hay colision, guardar la que tenga menor distancia
                    float distSq = (Vector3.Subtract(q, segmentB)).LengthSq();
                    if (distSq < minDistSq)
                    {
                        minDistSq = distSq;

                        //Le restamos un poco para que no se acerque tanto
                        minDistSq /= 2;
                    }
                }
            }

            //Acercar la camara hasta la minima distancia de colision encontrada (pero ponemos un umbral maximo de cercania)
            float newOffsetForward = -FastMath.Sqrt(minDistSq);

            /*
             * if(newOffsetForward < 10)
             * {
             *  newOffsetForward = 10;
             * }*/
            camera.OffsetForward = newOffsetForward;
        }