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