public override bool intersectRay(TgcRay ray, Matrix transform, out Vector3 q) { COLLISION_SPHERE.setCenter(Vector3.TransformCoordinate(position, transform)); float t; return(TgcCollisionUtils.intersectRaySphere(ray, COLLISION_SPHERE, out t, out q)); }
public override bool colisionaConPersonaje(TgcBoundingSphere esferaPersonaje) { bool colision = false; TgcBoundingSphere esferaAux = esferaPersonaje; TGCVector3 centroOriginal = esferaAux.Center; TGCVector3 centroTestColision = centroOriginal; centroTestColision.Y -= 50f; esferaAux.setCenter(centroTestColision); colision = base.colisionaConPersonaje(esferaAux); esferaAux.setCenter(centroOriginal); return(colision); }
/// <summary> /// Detección de colisiones, filtrando los obstaculos que se encuentran dentro del radio de movimiento /// </summary> private void collideWithWorld(TgcBoundingSphere characterSphere, Vector3 movementVector, List <IColisionablePelota> obstaculos, ColisionInfo colisionInfo) { /* * // DEJO que al menos se haga una iteracion aunque la pelota no se mueva, fix bug de colision con pelota quieta. * if (movementVector.LengthSq() < EPSILON) * { * return; * } */ List <IColisionable> objetosCandidatos = new List <IColisionable>(); Vector3 lastCenterSafePosition = characterSphere.Center; //Dejar solo los obstáculos que están dentro del radio de movimiento de la esfera Vector3 halfMovementVec = Vector3.Multiply(movementVector, 0.5f); TgcBoundingSphere testSphere = new TgcBoundingSphere( characterSphere.Center + halfMovementVec, halfMovementVec.Length() + characterSphere.Radius ); objetosCandidatos.Clear(); foreach (IColisionable obstaculo in obstaculos) { if (TgcCollisionUtils.testSphereAABB(testSphere, obstaculo.GetTgcBoundingBox())) { //colisionInfo.Add(obstaculo); objetosCandidatos.Add(obstaculo); } } //Detectar colisiones y deplazar con sliding doCollideWithWorld(characterSphere, movementVector, objetosCandidatos, 0, colisionInfo); //Manejo de error. No deberiamos colisionar con nadie si todo salio bien foreach (IColisionable obstaculo in objetosCandidatos) { if (TgcCollisionUtils.testSphereAABB(characterSphere, obstaculo.GetTgcBoundingBox())) { //Hubo un error, volver a la posición original characterSphere.setCenter(lastCenterSafePosition); return; } } }
/// <summary> /// Detección de colisiones, filtrando los obstaculos que se encuentran dentro del radio de movimiento /// </summary> private void collideWithWorld(TgcBoundingSphere characterSphere, Vector3 movementVector, List <TgcBoundingBox> obstaculos) { if (movementVector.LengthSq() < EPSILON) { return; } Vector3 lastCenterSafePosition = characterSphere.Center; //Dejar solo los obstáculos que están dentro del radio de movimiento de la esfera Vector3 halfMovementVec = Vector3.Multiply(movementVector, 0.5f); TgcBoundingSphere testSphere = new TgcBoundingSphere( characterSphere.Center + halfMovementVec, halfMovementVec.Length() + characterSphere.Radius ); objetosCandidatos.Clear(); foreach (TgcBoundingBox obstaculo in obstaculos) { if (TgcCollisionUtils.testSphereAABB(testSphere, obstaculo)) { objetosCandidatos.Add(obstaculo); } } //Detectar colisiones y deplazar con sliding doCollideWithWorld(characterSphere, movementVector, objetosCandidatos, 0); //Manejo de error. No deberiamos colisionar con nadie si todo salio bien foreach (TgcBoundingBox obstaculo in objetosCandidatos) { if (TgcCollisionUtils.testSphereAABB(characterSphere, obstaculo)) { //Hubo un error, volver a la posición original characterSphere.setCenter(lastCenterSafePosition); return; } } }
/// <summary> /// Detección de colisiones, filtrando los obstaculos que se encuentran dentro del radio de movimiento /// </summary> private void collideWithWorld(TgcBoundingSphere characterSphere, Vector3 movementVector, List<IColisionablePelota> obstaculos, ColisionInfo colisionInfo) { /* // DEJO que al menos se haga una iteracion aunque la pelota no se mueva, fix bug de colision con pelota quieta. if (movementVector.LengthSq() < EPSILON) { return; } */ List<IColisionable> objetosCandidatos = new List<IColisionable>(); Vector3 lastCenterSafePosition = characterSphere.Center; //Dejar solo los obstáculos que están dentro del radio de movimiento de la esfera Vector3 halfMovementVec = Vector3.Multiply(movementVector, 0.5f); TgcBoundingSphere testSphere = new TgcBoundingSphere( characterSphere.Center + halfMovementVec, halfMovementVec.Length() + characterSphere.Radius ); objetosCandidatos.Clear(); foreach (IColisionable obstaculo in obstaculos) { if (TgcCollisionUtils.testSphereAABB(testSphere, obstaculo.GetTgcBoundingBox())) { //colisionInfo.Add(obstaculo); objetosCandidatos.Add(obstaculo); } } //Detectar colisiones y deplazar con sliding doCollideWithWorld(characterSphere, movementVector, objetosCandidatos, 0, colisionInfo); //Manejo de error. No deberiamos colisionar con nadie si todo salio bien foreach (IColisionable obstaculo in objetosCandidatos) { if (TgcCollisionUtils.testSphereAABB(characterSphere, obstaculo.GetTgcBoundingBox())) { //Hubo un error, volver a la posición original characterSphere.setCenter(lastCenterSafePosition); return; } } }
protected virtual void Item_PositionChanged(Item item) { Sphere.setCenter(Position = item.Position); }
public void Update(float ElapsedTime, TgcD3dInput Input) { // Actualizo la posicion del Hacha Posicion = env.Camara.Position; hachaPersonaje.Position = new Vector3(Posicion.X - 1, Posicion.Y - 0.8f, Posicion.Z); // Actualizo la Posicion de la Esfera de Colisión BoundingSphere.setCenter(Posicion); // Actualizo las Variables de Estado del Personaje actualizarEstado(ElapsedTime); actualizarControles(ElapsedTime); if (this.Muerto) { env.musica.selectionSound("Sonido\\game_over.mp3"); env.musica.startSound(); } else { // Creo la fogata if (env.terreno.activarFogata && !env.terreno.ubicacionFogataFija) { env.terreno.fogata.Position = new Vector3(env.Camara.Position.X - (1 * env.terreno.SceneScaleXZ), env.terreno.CalcularAlturaTerreno((env.Camara.Position.X - (1 * env.terreno.SceneScaleXZ)) / env.terreno.SceneScaleXZ, env.Camara.Position.Z / env.terreno.SceneScaleXZ) * env.terreno.SceneScaleY, env.Camara.Position.Z); env.terreno.ubicacionFogataFija = true; } // Verifico cuantos objetos estan Cerca env.objetosCerca = 0; foreach (var objeto in env.terreno.SceneMeshes) { if (estaCerca(objeto)) { env.objetosCerca++; // Si el objeto es una Fruta if (objeto.Name.StartsWith("Fruta") && env.Input.keyPressed(Key.E)) { Inventario[0].cantidad++; // Desactivo el objeto y lo muevo a un lugar lejano ya que no puedo sacarlos de SceneMeshes objeto.Enabled = false; objeto.dispose(); objeto.Position = new Vector3(0, 0, 0); } // Si el objeto es una Palmera if (objeto.Name.StartsWith("Palmera") && Input.buttonDown(TgcD3dInput.MouseButtons.BUTTON_LEFT)) { sonidoHacha(true); env.sonidoHacha = true; Inventario[2].cantidad++; // Desactivo el objeto y lo muevo a un lugar lejano ya que no puedo sacarlos de SceneMeshes objeto.Enabled = false; objeto.dispose(); objeto.Position = new Vector3(0, 0, 0); } // Si el objeto es un Pino if (objeto.Name.StartsWith("Pino") && Input.buttonDown(TgcD3dInput.MouseButtons.BUTTON_LEFT)) { sonidoHacha(true); env.sonidoHacha = true; Inventario[2].cantidad++; // Desactivo el objeto y lo muevo a un lugar lejano ya que no puedo sacarlos de SceneMeshes objeto.Enabled = false; objeto.dispose(); objeto.Position = new Vector3(0, 0, 0); } // Si el objeto es una Piedra if (objeto.Name.StartsWith("Roca") && Input.buttonDown(TgcD3dInput.MouseButtons.BUTTON_LEFT)) { sonidoHacha(true); env.sonidoHacha = true; Inventario[3].cantidad++; // Desactivo el objeto y lo muevo a un lugar lejano ya que no puedo sacarlos de SceneMeshes objeto.Enabled = false; objeto.dispose(); objeto.Position = new Vector3(0, 0, 0); } } } } }