//Metodos para el avion public void initPlane() { // Crear avion del jugador player = new Plane(); // Crear la cámara cam = new FreeCam(); cam.SetCenterTargetUp(CAM_DELTA, new Vector3(0, 0, 0), new Vector3(0, 1, 0), true); cam.Enable = true; GuiController.Instance.CurrentCamera = cam; if (!avion_inicializado) { // Crear modifiers GuiController.Instance.Modifiers.addBoolean("Modo capturar calaveras", "Activado", false); GuiController.Instance.Modifiers.addBoolean("BoundingBox Avión", "Activado", false); GuiController.Instance.Modifiers.addBoolean("BoundingBox Calaveras", "Activado", false); GuiController.Instance.Modifiers.addInt("Cantidad de objetivos", 0, 100, 10); GuiController.Instance.Modifiers.addFloat("Velocidad de aceleración", 0, 1500.0f, 500); GuiController.Instance.Modifiers.addFloat("Velocidad de rotación", 0.5f, 1.0f, 0.6f); GuiController.Instance.Modifiers.addFloat("Velocidad de pitch", 1.0f, 3.0f, 2.0f); GuiController.Instance.Modifiers.addFloat("Velocidad de roll", 1.0f, 3.0f, 2.5f); // Crear UserVars GuiController.Instance.UserVars.addVar("Posición en X"); GuiController.Instance.UserVars.addVar("Posición en Y"); GuiController.Instance.UserVars.addVar("Posición en Z"); GuiController.Instance.Modifiers.addVertex3f("lightPos", new Vector3(-5000, -5000, -5000), new Vector3(5000, 8000, 5000), new Vector3(0, 4750, -2500)); } avion_inicializado = true; ResetPlane(); }
public override void render(float elapsedTime) { Device d3dDevice = GuiController.Instance.D3dDevice; //Renderizar terreno pos_actual = GuiController.Instance.FpsCamera.getPosition(); look_at_actual=GuiController.Instance.FpsCamera.getLookAt(); normal_actual=look_at_actual-pos_actual; plano_vision = Plane.FromPointNormal(pos_actual, normal_actual); proy_pos_actual = pos_actual; proy_pos_actual.Y = 0; List<Vector3>a_borrar=new List<Vector3>(); List<Vector3> a_revisar_para_generar = new List<Vector3>(); //genero las posiciones de los centros que se requieran que aparezcan "a lo lejos" foreach (Vector3 posicion in posiciones_centros) { //Esta forma de averiguar que puntos estan delante de la camara funciona, pero no resultó performante, por lo que se reemplazo la condicion del if //if (esta_delante_del_plano(plano_vision, posicion)) if (dist_menor_a_n_width(proy_pos_actual, posicion, 5)) { if (dist_mayor_a_n_width(proy_pos_actual, posicion, 3)) { a_revisar_para_generar.Add(posicion); } } else { a_borrar.Add(posicion); } } foreach (Vector3 posicion_a_revisar in a_revisar_para_generar) { generar_puntos_alrededor(posicion_a_revisar); } foreach (Vector3 posicion_a_borrar in a_borrar) { posiciones_centros.Remove(posicion_a_borrar); } //renderizo terrenos de alta, media y baja calidad de acuerdo a la distancia a la que se encuentren de la proyeccion de la camara en el plano xz foreach (Vector3 posicion in posiciones_centros) { if (dist_menor_a_n_width(proy_pos_actual, posicion, 2)) { terrain_hq.render(posicion); //terrain_hq.render(); } else { if (dist_menor_a_n_width(proy_pos_actual, posicion, 4)) { terrain_mq.render(posicion); //terrain_mq.render(); } else { terrain_lq.render(posicion); //terrain_lq.render(); } } } }
private bool esta_delante_del_plano(Plane plano_actual, Vector3 punto) { //genero un punto atras del plano que este en una linea perpendicular al mismo y que contenga al punto analizado punto_para_proy.X = (valor_grande * normal_actual.X) + punto.X; punto_para_proy.Y = (valor_grande * normal_actual.Y) + punto.Y; punto_para_proy.Z = (valor_grande * normal_actual.Z) + punto.Z; punto_proy_en_pl = Plane.IntersectLine(plano_vision, punto_para_proy, punto); //este vector apunta desde el plano al punto (de forma perpendicular al plano) vector_final = punto - punto_proy_en_pl; //si el punto esta "por delante" del plano, devuelvo true if ((vector_final.X / normal_actual.X >= 0)) { return true; } return false; }
/// <summary> /// Método que se llama una sola vez, al principio cuando se ejecuta el ejemplo. /// Escribir aquí todo el código de inicialización: cargar modelos, texturas, modifiers, uservars, etc. /// Borrar todo lo que no haga falta /// </summary> public override void init() { // Crear avion del jugador player = new Plane(); // Crear la cámara cam = new FreeCam(); cam.SetCenterTargetUp(CAM_DELTA, new Vector3(0, 0, 0), new Vector3(0, 1, 0), true); cam.Enable = true; GuiController.Instance.CurrentCamera = cam; GuiController.Instance.Modifiers.addFloat("Velocidad de rotación", 0.5f, 1.0f, 0.6f); GuiController.Instance.Modifiers.addFloat("Velocidad de pitch", 1.0f, 3.0f, 2.0f); GuiController.Instance.Modifiers.addFloat("Velocidad de roll", 1.0f, 3.0f, 2.5f); GuiController.Instance.UserVars.addVar("Posición en X"); GuiController.Instance.UserVars.addVar("Posición en Y"); GuiController.Instance.UserVars.addVar("Posición en Z"); GuiController.Instance.UserVars.addVar("Avión respecto a X"); GuiController.Instance.UserVars.addVar("Avión respecto a Y"); GuiController.Instance.UserVars.addVar("Avión respecto a Z"); Reset(); }