//metodo de clase que construye un barco - necesario para poder instanciar barcos y que sean TgcMesh static public Barco ConstruirBarco(string path, Vector2 pos, float radioElipsoide, TipoElemento tipoBarco) { //cuando mergee tengo que sacar la altura del Oceano Vector3 posAlturaDelOceano = new Vector3(pos.X, Oceano.alturaEnPunto(pos.X, pos.Y), pos.Y); return((Barco)ConstruirElemento(path, posAlturaDelOceano, radioElipsoide, tipoBarco)); }
public override void update() { this.mover(); base.update(); //esto tambien if (Oceano.alturaEnPunto(this.Position.X, this.Position.Z) - 0.03f > this.Position.Y) { InteractionManager.Disparos.Remove(this); this.dispose(); } }
public static Vector3 normalEnPuntoXZ(float X, float Z /*, float momento*/) { float delta = 2f; float alturaN = Oceano.alturaEnPunto(X, Z + delta); float alturaS = Oceano.alturaEnPunto(X, Z - delta); float alturaE = Oceano.alturaEnPunto(X + delta, Z); float alturaO = Oceano.alturaEnPunto(X - delta, Z); Vector3 vector1 = new Vector3(delta * 2, alturaE - alturaO, 0); Vector3 vector2 = new Vector3(0, alturaN - alturaS, delta * 2); return(Vector3.Cross(vector2, vector1)); }
//mueve el barco y su boundingspehere en Y; hay que refactorearlo... //mueve el barco y su boundingspehere en Y; hay que refactorearlo... virtual public void flotar() { //normal del mar en el punto donde se encuentra el barco normal = Oceano.normalEnPuntoXZ(this.Position.X, this.Position.Z); //altura del mar en el punto de se encuentra el barco float Y = Oceano.alturaEnPunto(this.Position.X, this.Position.Z); //ponemos el bounding sphere a la altura donde esta el barco this.boundingSphere.moveCenter(new Vector3(0, Y - boundingSphere.Position.Y + 40, 0)); //ubicamos al barco... this.Position = new Vector3(this.Position.X, Y - 15, this.Position.Z); // ...en alto... this.rotation.Z = FastMath.Atan2(-normal.X * FastMath.Cos(this.rotation.Y), normal.Y) + FastMath.Atan2(normal.Z * FastMath.Sin(this.rotation.Y), normal.Y); // ...con rotacion en Z... this.rotation.X = FastMath.Atan2(normal.Z * FastMath.Cos(this.rotation.Y), normal.Y) + FastMath.Atan2(normal.X * FastMath.Sin(this.rotation.Y), normal.Y); // ...con rotacion en Y... }