Creando al Planeta tierra con GLScene [Delphi 2010]

Buenas tardes a todos los lectores de balusoft!, en este post vamos a ver algo interesante! y facil de hacer!, vamos a hacer nuestro planeta tierra estilo Google Earth, claro solo el planeta tierra sin ninguna funcionalidad!.

En este post aprenderemos:

  • Cargar texturas en runtime
  • Usar la clase Atmosphere
  • Iluminar superficies texturizadas
  • Utilizar la clase GLEarthSkyDome para simular el espacio

Pero para este post! es necesario tener la ultima version de GLScene!, no es necesario tener Delphi 2010, con Delphi 7 o con lazarus se puede hacer esto mismo.

Primero les mostrare lo que haremos en este post!:

image

image

Iniciando la escena

Primero que nada y para comenzar, esta sera nuestra escena que crearemos (por el momento):

image

En las propiedades de cada objetos, modificaremos lo siguiente:

GLCamera1: Position(4,1,1) , TargetObject:=GLDummyCube1

GLLightSource1: Position(100,0,0)

GLSphere1: Radius:=1.5

GLSceneViewer1: Buffer->BackgroundColor:= clBlack

Modificando estas propiedades tendremos por el momento lo siguiente:

NOTA: Claro que previamente agregamos un GLSceneViewer como la escena basica que hemos hecho en post anteriores, si no sabes de que hablo sera necesario que visites este post y luego este, ya que en este post supongo que ya saben hacer una escena basica en GLScene( asigncar camaras, el visor y sobre todo un glscene!)

Hasta este entonces tendremos esta escena:

image

Cargando una textura

Lo primero que haremos es cargar la textura a la esfera que sera nuestro planeta tierra, para eso bajen esta textura

Para cargar la textura, lo haremos en tiempo de ejecucion ya que sin razon alguna mi profe de Graficacion dijo que era recomendado cargarlo en ejecucion!, pero en fin se puede hacer desde las propiedades!; Primero creamos un evento llamado “onCreate” de nuestro Form y agregamos lo siguiente

(es importante que a este paso grabemos nuestro proyecto en una carpeta accesible y alli guardar la textura descargada)

image

NOTA: Es importante agregar al Uses el unit  “JPEG” si no, no cargara ninguna imagen!

image

Ahora tendremos que modificar una propiedad de nuestra esfera, esta propiedad se encuentra en Material->Texture->TextureMode y asignamos “tmModulate”. Esto es para que la luz afecte a una figura texturizada! (la imagen no tiene esta opcion aun)

Ahora nuestro planeta lucira de esta forma In love

Agregando estrellas

Para agregar estrellas, haremos uso de GLEarthSkyDome (environment objects), para eso agregaremos uno a nuestro GLScene y lo posicionamos al inicio de todos nuestros objetos, este tiene que ser dibujado primero que todos:

image

Es importante cambiar varias propiedades al GLEarthSkyDome1; primero que nada en Direction; X=0,Y=1,Z=0 .

y SunElevation:=-75

Y lo que haremos ahora, es agregar muchas estrellas posicionadas aleatoriamente en nuestro espacio, para eso nos iremos al evento que ya habiamos creado de “onCreate” y agregaremos lo siguiente:

“GLEarthSkyDome1.Stars.AddRandomStars(4000,clWhite);”

Si corremos nuestro programa ya lucira un poco mejor!:

image

Agregando la atmosfera y el sol

Para terminar con nuestra escena agregaremos 2 objetos mas a nuestro GLScene

image

GLLensFlare se encuentra en “Special Objects” y GLAtmosphere se encuentra en “Environment objects”

Al GLLensFlare no le vamos a modificar nada, pero si es importante que lo pongamos como hijo de la luz

Al GLAtmosphere le vamos a modificar la primer propiedades que es “Atmosphere radius” y le vamos a poner 1.6 y a “PlanetRadius” le damos 1.5

EDITO!!: Jav comento en algo que falto sobre la configuracion de la atmosfera!, en la propiedades de la atmosfera podemos ver una que  propiedad es “SUN”, en esa propiedad vamos a poner la luz que habiamos agregado anteriormente o sea la GLLightSource1

image Y ahora si ya se vera todo igual como en el video que se vera mas abajo.

Ahora es importante agregar un GLCadencer a nuestra escena, esto ya lo hicimos en post anteriores, nos vamos a la pestaña GLScene y buscamos la clase TGLCadencer y lo agregamos a nuestro form, en la propiedad “Scene” asignamos nuestro GLScene1.

Le damos doble click al cadencer para crear un evento y pondremos lo siguiente:

image

Esto es para darle una rotacion a la tierra para que se vea mas bonito Open-mouthed smile

Moviendonos alrededor de la tierra

Ahora solo falta poder movernos alrededor de la tierra, para eso creamos 2 variables globales tipo entero;

image

Y ahora crearemos un evento de nuestro GLSceneViewer, el evento es “onMouseMove” y despues de crear ese evento agregamos el siguiente codigo:

image

Esto es sencillo, obtenemos las cordenadas actuales del mouse, y cada ves que se presione una tecla especial (shift,clic etc) la camara se movera alrededor del objetivo segun se mueva el mouse, esto es sencillamente para movernos alrededor de nuestro “target” que es la tierra.

Y el resultado sera identico al mostrado al principio:

Resultado final 😀

Espero y les haya gustado!

Code4Fun

Autor: Isaac Ojeda

Computer Systems Engineer. Full stack DotNet developer. Expert in Web technologies, and lifelong learner in all existing technologies for software development.

13 opiniones en “Creando al Planeta tierra con GLScene [Delphi 2010]”

  1. que tal isaac

    solo para preguntarte si tienes alguna idea de como ponerle gravedad a un terreno y a objetos que se creen en el en si que se paresca a la vida real te agradeceria si me dieras la idea no se di con ODE se pueda hacer eso o se tenga que usar otra forma..

    CYA !!

    1. Efectivamente Tony!, con ODE se puede hacer eso, solo tienes que agregarle un comportamiento al Terreno, este no recuerdo cual es, pero del listado de Behaiviors sera el ultimo!, te buscare un ejemplo y te lo paso!

  2. oye una pregunta…. a mi planeta ya le puse una luna, pero no se como implementar q la luna haga su movimiento de traslacion sobre la tierra… me podrias hechar la mano =) ?

    1. La forma que puedes hacer esto, es poniendo un dummycube en la misma posicion de la tierra, agregas una esfera ( que sera la luna ), dentro de ese dummyCube ( que sea su hijo ) y la luna, la pones en una posicion adecuada alejada de la tierra, y despues solo haces rotar el dummyCube,y la luna dara vueltas alrededor del dummyCube ( o sease alrededor de la tierra), espero a verme explicado

      Un Saludo

  3. hola isaac, una pregunta… tu sabes de casualidad como poner neblina a una aplicacion, por ejemplo como ´poner fuego o agua, yo necesito neblina porq quiero hacerle ver como polvo cosmico pero no tengo idea de como y no encuentro algun tuto … ayuda porfa

    1. Jav!, tengo un tutorial de como poner un poco de niebla pero la verdad no creo que te sirva ya que no lo encuentro muy eficiente:

      Uno de los efectos atmosféricos más simple para crear el GLScene es la niebla, es simple y puede dar efectos muy realistas de una escena, hay varias maneras de crear, pero la forma más sencilla es con una propiedad GLSceneViewer .

      A partir de la escena anterior, seleccione el GLSceneViewer y dejar que la opción de Buffer , para activar la niebla se encuentran:
      • Coloque FogEnable de verdad .
      • Introduzca FogEnvironment , y dentro de ésta,
      • Elegir un FogColor (por ejemplo, clrLimeGreen )
      • A través de FogStart y FogEnd indicar dónde comienza y termina en la niebla (por ejemplo, 500 y 1000).

      espero te sirva

  4. Una pregunta quiza estoy haciendo algo mal yo tengo delphi 7 y cuando le pongo la textura lo carga pero a la hora de rotar la esfera gira pero la textura permenece inmovil es como si la textura no rotara junto con la esferra que estoy haciendo mal o en delphi 7 no se puede
    he hecho en vez de una esfera un cubo y si se mueve la textura en la esfera no

Replica a Isaac Ojeda Cancelar la respuesta