public void Update(Vector3 PosicionTarget) { var mapScene = gameModel.MapScene; bool collisionFound = false; Mover(); tiempoEspera += elapsedTime; //1 chocar contra target? if (TgcCollisionUtils.testObbObb(obb, autoPlayer.obb)) { velocidad = 0f; //Doblar(20f); gameModel.TerminarJuego(false); obb.setRenderColor(Color.Blue); return; } //2 choca contra mapa? if (testChoqueContraMapa(mapScene, collisionFound)) { velocidad = 2f; Doblar(45f); obb.setRenderColor(Color.Red); return; } obb.setRenderColor(Color.Yellow); //3 Dobla para apuntar al target? ApuntarAlTarget(PosicionTarget); }
public PlataformaRotante(TgcMesh plataformaMesh, Escenario escenario, int coeficienteRotacion) : base(plataformaMesh, escenario) { this.plataformaMesh = plataformaMesh; this.escenario = escenario; this.coeficienteRotacion = coeficienteRotacion; this.plataformaMesh.AutoTransform = false; this.plataformaMesh.AutoUpdateBoundingBox = false; //Defino angulo de rotacion --> coeficiente puede ser -1 o 1, define direccion de rotacion anguloRotacion = FastMath.ToRad(15f); anguloRotacion *= coeficienteRotacion; //Defino Matrices para rotacion del mesh de la plataforma posicionInicialBB = this.plataformaMesh.BoundingBox.calculateBoxCenter(); matrizTranslacionPosicionInicial = TGCMatrix.Translation(posicionInicialBB); matrizTranslacionOrigen = TGCMatrix.Translation(new TGCVector3(-posicionInicialBB.X, -posicionInicialBB.Y, -posicionInicialBB.Z)); //Defino OrientedBoundingBox y hago el Dispose() de la AABB OBB = TgcBoundingOrientedBox.computeFromAABB(this.plataformaMesh.BoundingBox); OBB.setRenderColor(System.Drawing.Color.Empty); vRotacionOBB = new TGCVector3(0f, anguloRotacion, 0f); // plataformaMesh.BoundingBox.Dispose(); }
private void ProcesarColisiones() { collisionFound = false; chocoAdelante = false; //TgcCollisionUtils.testobbTest choque cilindro var ray = new TgcRay.RayStruct(); var x1 = -largo *FastMath.Sin(anguloFinal); var z1 = -largo *FastMath.Cos(anguloFinal); var x2 = x1 * 1.2; var z2 = z1 * 1.2; //var a = Mesh.Position.TransformCoordinate(Matrix.Identity); ray.origin = new Vector3( Mesh.Position.X + x1, Mesh.Position.Y, Mesh.Position.Z + z1); ray.direction = new Vector3( newPosicion.X + (float)x2, newPosicion.Y, newPosicion.Z + (float)z2 ); directionArrow = new TgcArrow(); directionArrow.Thickness = 5; directionArrow.HeadSize = new Vector2(10, 10); //directionArrow.PEnd = ray.origin; directionArrow.PStart = ray.origin; directionArrow.PEnd = ray.direction; directionArrow.updateValues(); //-FastMath.Sin(anguloFinal), 0, 350 * -FastMath.Cos(anguloFinal) //ray.direction = eMovementVector; foreach (var sceneMesh in ciudadScene.Meshes) { var escenaAABB = sceneMesh.BoundingBox; var collisionResult = TgcCollisionUtils.testObbAABB(obb, escenaAABB); //2 -si lo hizo, salgo del foreach. if (collisionResult) { collisionFound = true; //if (intersectRayAABB(ray, escenaAABB))//, out t, out p) || t > 1.0f) float t; Vector3 p; chocoAdelante = (intersectRayAABB(ray, escenaAABB, out t, out p) || t > 1.0f); break; } } //3 - si chocó, pongo el bounding box en rojo (apretar F para ver el bb). if (collisionFound) { if (Mesh.Position.Y == 5 || Mesh.Position.Y >= 25) { obb.setRenderColor(Color.Red); //efectoShaderNitroHummer.SetValue("Velocidad", 4 * Velocidad); PosicionRollback(); } } else { obb.setRenderColor(Color.Yellow); } if (Mesh.Position.Y == 5) { ManejarColisionCamara(); } velocimetro.Update(Velocidad, marchaAtras); }
public override void Update() { PreUpdate(); var velocidadCaminar = VELOCIDAD_DESPLAZAMIENTO * ElapsedTime; //Calcular proxima posicion de personaje segun Input var moving = false; var movement = new Vector3(0, 0, 0); //Adelante if (Input.keyDown(Key.W)) { movement.Z = velocidadCaminar; moving = true; } //Atras if (Input.keyDown(Key.S)) { movement.Z = -velocidadCaminar; moving = true; } //Derecha if (Input.keyDown(Key.D)) { movement.X = velocidadCaminar; moving = true; } //Izquierda if (Input.keyDown(Key.A)) { movement.X = -velocidadCaminar; moving = true; } //Salto if (Input.keyDown(Key.Space)) { movement.Y = velocidadCaminar; moving = true; } //Agachar if (Input.keyDown(Key.LeftControl)) { movement.Y = -velocidadCaminar; moving = true; } //Si hubo desplazamiento if (moving) { //Aplicar movimiento, internamente suma valores a la posicion actual del mesh. mesh.move(movement); } //Hacer que la camara siga al personaje en su nueva posicion camaraInterna.Target = mesh.Position; //Detectar colision con triangulo if (TgcCollisionUtils.testTriangleAABB(triangle[0].Position, triangle[1].Position, triangle[2].Position, mesh.BoundingBox)) { triangle[0].Color = Color.Red.ToArgb(); triangle[1].Color = Color.Red.ToArgb(); triangle[2].Color = Color.Red.ToArgb(); } else { triangle[0].Color = Color.Green.ToArgb(); triangle[1].Color = Color.Green.ToArgb(); triangle[2].Color = Color.Green.ToArgb(); } //Detectar colision con el otro AABB if (TgcCollisionUtils.testAABBAABB(mesh.BoundingBox, box2.BoundingBox)) { box2.Color = Color.Red; box2.updateValues(); } else { box2.Color = Color.Violet; box2.updateValues(); } //Detectar colision con la esfera if (TgcCollisionUtils.testSphereAABB(boundingSphere, mesh.BoundingBox)) { boundingSphere.setRenderColor(Color.Red); } else { boundingSphere.setRenderColor(Color.Yellow); } //Detectar colision con la obb if (TgcCollisionUtils.testObbAABB(obb, mesh.BoundingBox)) { obb.setRenderColor(Color.Red); } else { obb.setRenderColor(Color.Yellow); } }