public override void setSelected(bool selected) { this.selected = selected; var color = selected ? MeshCreatorUtils.SELECTED_OBJECT_COLOR : MeshCreatorUtils.UNSELECTED_OBJECT_COLOR; // mesh.BoundingSphere.setRenderColor(color); bb.setRenderColor(color); }
public Caja(string mediaDir, TGCVector3 pos, TGCVector3 size) { // TODO: tengo que hacer dispose de esta textura? la hago global? var texture = TgcTexture.createTexture(D3DDevice.Instance.Device, mediaDir + "caja.jpg"); box = TGCBox.fromSize(size, texture); var minInferior = box.BoundingBox.PMin; var maxInferior = box.BoundingBox.PMax; var posInferior = box.BoundingBox.calculateBoxCenter(); maxInferior.Y = minInferior.Y; posInferior.Y = minInferior.Y; var minSuperior = box.BoundingBox.PMin; var maxSuperior = box.BoundingBox.PMax; var posSuperior = box.BoundingBox.calculateBoxCenter(); minSuperior.Y = maxSuperior.Y; posSuperior.Y = maxSuperior.Y; superior = new TgcBoundingAxisAlignBox(minSuperior, maxSuperior, posSuperior, TGCVector3.One); cuerpo = box.BoundingBox; // debug cuerpo.setRenderColor(Color.Yellow); superior.setRenderColor(Color.Red); move(pos); vel = TGCVector3.Empty; }
public void Update() { var velocidadCaminar = 300f; var velocidadSalto = 100f; var velocidadRotacion = 120f; vectorDesplazamiento = TGCVector3.Empty; vectorColision = TGCVector3.Empty; //Calcular proxima posicion de personaje segun Input var Input = GModel.Input; var moveForward = 0f; var moveJump = 0f; float rotate = 0; var moving = false; var rotating = false; var lastPos = personaje.Position; desplazamientoDePlataforma = TGCVector3.Empty; //Adelante if (Input.keyDown(Key.W)) { moveForward = velocidadCaminar * GModel.ElapsedTime; moving = true; } //Atras if (Input.keyDown(Key.S)) { moveForward = -velocidadCaminar * GModel.ElapsedTime; moving = true; } //Derecha if (Input.keyDown(Key.D)) { rotate = velocidadRotacion; rotating = true; } //Izquierda if (Input.keyDown(Key.A)) { rotate = -velocidadRotacion; rotating = true; } //Si hubo rotacion if (rotating) { //Rotar personaje y la camara, hay que multiplicarlo por el tiempo transcurrido para no atarse a la velocidad el hardware var rotAngle = FastMath.ToRad(rotate * GModel.ElapsedTime); matrizRotacionPersonajeY *= TGCMatrix.RotationY(rotAngle); GModel.camaraInterna.rotateY(rotAngle); anguloDeRotacion += rotAngle; //Ajustar la matriz de rotacion segun el angulo de rotacion (sobre el sentido de la orientacion) //Lo que se desplaza en cada eje depende del angulo de rotacion //Cada componente podria separarse en funcion del seno y coseno orientacion.X = FastMath.Sin(anguloDeRotacion); orientacion.Z = FastMath.Cos(anguloDeRotacion); } if (moving) { //Activar animacion de caminando personaje.playAnimation("Caminando", true); //Ajustar el vector desplazamiento en base a lo que se movio y la orientacion que tiene vectorDesplazamiento.X += moveForward * orientacion.X; vectorDesplazamiento.Z += moveForward * orientacion.Z; } //Si no se esta moviendo, activar animacion de Parado else { personaje.playAnimation("Parado", true); } //----------Salto //Por el momento solamente parece que flota if (Input.keyDown(Key.Space) /*&& colliderY != null*/) { moveJump = velocidadSalto * GModel.ElapsedTime; vectorDesplazamiento.Y += moveJump; } //---------prueba gravedad---------- vectorDesplazamiento.Y += FastMath.Clamp(gravedad * GModel.ElapsedTime, -10, 10); //--------Colision con el piso a nivel triangulo TgcBoundingAxisAlignBox colliderPlano = null; foreach (var obstaculo in GModel.escenario1.getPiso()) { if (TgcCollisionUtils.testAABBAABB(personaje.BoundingBox, obstaculo.BoundingBox)) { colliderPlano = obstaculo.BoundingBox; //No le afecta la gravedad si está en el piso vectorDesplazamiento.Y -= FastMath.Clamp(gravedad * GModel.ElapsedTime, -10, 10); break; } } this.posicion = posicion + vectorDesplazamiento; //Reseteo el vector desplazamiento una vez que lo sume vectorDesplazamiento = TGCVector3.Empty; //---------Colisiones objetos-------------------------- var collide = false; foreach (var obstaculo in GModel.escenario1.getAABBDelEscenario() /*GModel.escenario1.getPared1()*/) { if (TgcCollisionUtils.testAABBAABB(personaje.BoundingBox, obstaculo)) { collide = true; collider = obstaculo; break; } } //Una buena idea seria diferenciar las plataformas del resto de los objetos foreach (var plataforma in GModel.escenario1.getPlataformasDelEscenario()) { if (TgcCollisionUtils.testAABBAABB(personaje.BoundingBox, plataforma)) { collide = true; collider = plataforma; //Pensamos en calcular cuanto se desplaza la plataforma y mandarselo al personaje para que se muevan juntos //Todavia no funciona como esperamos desplazamientoDePlataforma = GModel.escenario1.desplazamientoDePlataforma(collider); break; } } if (collide) { var movementRay = lastPos - posicion; //Cuando choca con algo que se ponga rojo, nos sirve para probar collider.setRenderColor(Color.Red); var rs = TGCVector3.Empty; if (((personaje.BoundingBox.PMax.X > collider.PMax.X && movementRay.X > 0) || (personaje.BoundingBox.PMin.X < collider.PMin.X && movementRay.X < 0)) && ((personaje.BoundingBox.PMax.Z > collider.PMax.Z && movementRay.Z > 0) || (personaje.BoundingBox.PMin.Z < collider.PMin.Z && movementRay.Z < 0)) && ((personaje.BoundingBox.PMax.Y > collider.PMax.Y && movementRay.Y > 0) || (personaje.BoundingBox.PMin.Y < collider.PMin.Y && movementRay.Y < 0))) { if (personaje.Position.X > collider.PMin.X && personaje.Position.X < collider.PMax.X) { //El personaje esta contenido en el bounding X rs = new TGCVector3(movementRay.X, movementRay.Y, 0); } if (personaje.Position.Z > collider.PMin.Z && personaje.Position.Z < collider.PMax.Z) { //El personaje esta contenido en el bounding Z rs = new TGCVector3(0, movementRay.Y, movementRay.Z); } if (personaje.Position.Y > collider.PMin.Y && personaje.Position.Y < collider.PMax.Y) { //El personaje esta contenido en el bounding Y rs = new TGCVector3(movementRay.X, 0, movementRay.Z); } } else { if ((personaje.BoundingBox.PMax.X > collider.PMax.X && movementRay.X > 0) || (personaje.BoundingBox.PMin.X < collider.PMin.X && movementRay.X < 0)) { rs = new TGCVector3(0, movementRay.Y, movementRay.Z); } if ((personaje.BoundingBox.PMax.Z > collider.PMax.Z && movementRay.Z > 0) || (personaje.BoundingBox.PMin.Z < collider.PMin.Z && movementRay.Z < 0)) { rs = new TGCVector3(movementRay.X, movementRay.Y, 0); } if ((personaje.BoundingBox.PMax.Y > collider.PMax.Y && movementRay.Y > 0) || (personaje.BoundingBox.PMin.Y < collider.PMin.Y && movementRay.Y < 0)) { //Si esta sobre un plano XZ tampoco deberia afectarle la gravedad vectorDesplazamiento.Y -= FastMath.Clamp(gravedad * GModel.ElapsedTime, -10, 10); rs = new TGCVector3(movementRay.X, 0, movementRay.Z); } } //El vector rs actua como "freno" al movimiento del personaje //Le "descuento" la gravedad si es que colisiona con el plano XZ personaje.Position = lastPos - rs + new TGCVector3(0, vectorDesplazamiento.Y, 0); posicion = personaje.Position; } personaje.Position = posicion; //Una forma de reiniciar, que se active con R o cuando el personaje muere //Por ahora el personaje muere solamente si su coordenada en Y es inferior a un valor determinado if (Input.keyDown(Key.R) || this.estaMuerto()) { posicion = this.checkpoint; } matrizPosicionamientoPersonaje = TGCMatrix.Translation(posicion /*+ desplazamientoDePlataforma*/); GModel.camaraInterna.Target = GModel.tgcPersonaje.getPosicion(); }