public void ManejarColisionCamara() { //Actualizar valores de camara segun modifiers //COPIADO DE EJEMPLO COLISIONES CAMARA del tgc viewer //Pedirle a la camara cual va a ser su proxima posicion Vector3 position; Vector3 target; CamaraAuto.CalculatePositionTarget(out position, out target); //Detectar colisiones entre el segmento de recta camara-personaje y todos los objetos del escenario Vector3 q; var minDistSq = FastMath.Pow2(CamaraAuto.OffsetForward); foreach (var obstaculo in ciudadScene.Meshes) { //Hay colision del segmento camara-personaje y el objeto if (TgcCollisionUtils.intersectSegmentAABB(target, position, obstaculo.BoundingBox, out q)) { //Si hay colision, guardar la que tenga menor distancia var distSq = Vector3.Subtract(q, target).LengthSq(); //Hay dos casos singulares, puede que tengamos mas de una colision hay que quedarse con el menor offset. //Si no dividimos la distancia por 2 se acerca mucho al target. minDistSq = FastMath.Min(distSq / 2, minDistSq); } } //Acercar la camara hasta la minima distancia de colision encontrada (pero ponemos un umbral maximo de cercania) var newOffsetForward = -FastMath.Sqrt(minDistSq); if (FastMath.Abs(newOffsetForward) < 10) { newOffsetForward = -10; } if (camaraOffsetDefaulForward > CamaraAuto.OffsetForward) { CamaraAuto.OffsetForward = (newOffsetForward - 72f * GameModel.ElapsedTime) * (-1f); //enderezo lentamente } else { CamaraAuto.OffsetForward = -newOffsetForward; } //CamaraAuto.OffsetForward = newOffsetForward; //Asignar la ViewMatrix haciendo un LookAt desde la posicion final anterior al centro de la camara CamaraAuto.CalculatePositionTarget(out position, out target); CamaraAuto.SetCamera(position, target); }
/// <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() { //Actualizar valores de camara segun modifiers camaraInterna.OffsetHeight = offsetHeightModifier.Value; camaraInterna.OffsetForward = offsetForwardModifier.Value; var displacement = displacementModifier.Value; camaraInterna.TargetDisplacement = new TGCVector3(displacement.X, displacement.Y, 0); //Pedirle a la camara cual va a ser su proxima posicion TGCVector3 position; TGCVector3 target; camaraInterna.CalculatePositionTarget(out position, out target); //Detectar colisiones entre el segmento de recta camara-personaje y todos los objetos del escenario TGCVector3 q; var minDistSq = FastMath.Pow2(camaraInterna.OffsetForward); foreach (var obstaculo in obstaculos) { //Hay colision del segmento camara-personaje y el objeto if (TgcCollisionUtils.intersectSegmentAABB(target, position, obstaculo.BoundingBox, out q)) { //Si hay colision, guardar la que tenga menor distancia var distSq = TGCVector3.Subtract(q, target).LengthSq(); //Hay dos casos singulares, puede que tengamos mas de una colision hay que quedarse con el menor offset. //Si no dividimos la distancia por 2 se acerca mucho al target. minDistSq = FastMath.Min(distSq / 2, minDistSq); } } //Acercar la camara hasta la minima distancia de colision encontrada (pero ponemos un umbral maximo de cercania) var newOffsetForward = -FastMath.Sqrt(minDistSq); if (FastMath.Abs(newOffsetForward) < 10) { newOffsetForward = 10; } camaraInterna.OffsetForward = newOffsetForward; //Asignar la ViewMatrix haciendo un LookAt desde la posicion final anterior al centro de la camara camaraInterna.CalculatePositionTarget(out position, out target); camaraInterna.SetCamera(position, target); }
protected void AdjustCameraPosition(TgcThirdPersonCamera camaraInterna, ModoCamara modoCamara) { //if (!Player1.collision) //{ // currentCameraPosition = camaraInterna.Position; //} if (camaraInterna.OffsetHeight == 0.1f) { return; } camaraInterna.OffsetHeight = 0.1f; camaraInterna.OffsetForward = 30; //Pedirle a la camara cual va a ser su proxima posicion TGCVector3 position; TGCVector3 target; camaraInterna.CalculatePositionTarget(out position, out target); //Detectar colisiones entre el segmento de recta camara-personaje y todos los objetos del escenario TGCVector3 q; var minDistSq = FastMath.Pow2(camaraInterna.OffsetForward); foreach (var obstaculo in escenario.TgcScene.Meshes) { if (obstaculo.Name.Equals("Arbusto") || obstaculo.Name.Equals("Pasto") || obstaculo.Name.Equals("Flores")) { continue; } //Hay colision del segmento camara-personaje y el objeto if (TgcCollisionUtils.intersectSegmentAABB(target, position, obstaculo.BoundingBox, out q)) { //Si hay colision, guardar la que tenga menor distancia var distSq = TGCVector3.Subtract(q, target).LengthSq(); //Hay dos casos singulares, puede que tengamos mas de una colision hay que quedarse con el menor offset. //Si no dividimos la distancia por 2 se acerca mucho al target. minDistSq = FastMath.Min(distSq / 2, minDistSq); } } //Acercar la camara hasta la minima distancia de colision encontrada (pero ponemos un umbral maximo de cercania) var newOffsetForward = FastMath.Sqrt(minDistSq); if (FastMath.Abs(newOffsetForward) < 10f) { newOffsetForward = 10f; } if (newOffsetForward > modoCamara.ProfundidadCamara()) { newOffsetForward = modoCamara.ProfundidadCamara(); } if (modoCamara.AlturaCamara() > 1) { camaraInterna.OffsetHeight = 1.1f; } else { camaraInterna.OffsetHeight = modoCamara.AlturaCamara(); } camaraInterna.OffsetForward = newOffsetForward; //Asignar la ViewMatrix haciendo un LookAt desde la posicion final anterior al centro de la camara camaraInterna.CalculatePositionTarget(out position, out target); camaraInterna.SetCamera(position, target); }