wereldbeeld

wereldbeeld in fullscreen

 

gezicht op de zuidpool de wereld draait linksom

gezicht op de zuidpool de wereld draait linksom

 

 

 

gezicht op de noordpool de wereld draait rechtsom

gezicht op de noordpool de wereld draait rechtsom

 

 

 

gezicht op Europa, gezellig he al die lichtjes

gezicht op Europa, gezellig he al die lichtjes

 

 

amsterdam

Amsterdam

 

 

 

Wereldbeeld.                          terug naar de inleiding                 naar de animatie in fullscreen

Een animatie met de standaardvormen: SphereGeometry.  Het material is: MeshBasicMaterial 
De afbeelding van de wereld is een equirectangulare afbeelding die in de functie createEquirect (regel 74) wordt geladen en geplakt op de MeshBasicMaterial
Door de equirectangulaire afbeelding als MeshBasicMaterial op de Sphere te plakken ontstaan 360 graden animaties.
 
De  material en Sphere zijn classes van de three.module.js lib
Alle libs zijn javaScript ES6 modules. Dit zijn scripts opgebouwd uit modules wat een forse verbetering van de codeer stijl betekend.
 
addon libs
De muis en pijltjestoets bewegingen worden gerealiseerd met de addon lib OrbitControls, zie de functie createControl (regel 85)

De GUI (grafische user interface) wordt gerealiseerd met de addon lib lil-gui-module.min.js  zie de functie createGUI (regel 90)

Met muisknoppen, muisbewegingen en muiswiel kan je de animatie in x, y en z richting verplaatsen. (z met het muiswieltje)

De rotatie stoppen door het vinkje, in het controle venster rechts, weg te klikken.
Door met het muiswiel uit te zoomen verschijnt een puntvorm dit door het derde (aantal verticale segmenten ) argument in de constructor van

de SphereGeometry op "2"  te zetten (regel 75)

Voor het overzicht heb ik alle code in functies gezet, die in function init()  (line 32)  worden aangeroepen.
De achtergrond- en equirectangulare afbeeldingen worden geladen met TextureLoader (regel 51 en 77)
 
 

<html>
  <head>
    <title>wereldbeeld</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta charset="UTF-8" />
    <style> body { margin: 0;} </style>
  </head>
 
  <body>
    <script type="importmap">
        {
          "imports": {
            "three": "../build/three.module.js",
          "three/addons/": "../jsm/"
        }
      }
    </script>
 
  <script type="module">
      import * as THREE from 'three';
      import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
      import { GUI } from 'three/addons/libs/lil-gui.module.min.js';
 
      let camera, scene, renderer, controls;
      let start_stop_rotatie , wolken_achtergrond;
       //data tbv de GUI control
      const data = {wolken_achtergrond: true, start_stop_rotatie: true};
 
      init();
      play();
      function init() {
        scene = new THREE.Scene();
        THREE.ColorManagement.enabled = true;
        window.addEventListener( 'resize', onWindowResize );
        createBackground();
        createCamera();
        createRenderer();
        createEquirect();
        createControls();
        createGui();
        onWindowResize();
    }
 
    function createBackground() {
          if (wolken_achtergrond==false)
       {const bgColor = new THREE.Color( 0xE6FBFF );
        scene.background = bgColor;
        wolken_achtergrond = true;}
          else
        {const loader = new THREE.TextureLoader();
        const bgTexture = loader.load('../textures/cloud.jpg');
        scene.background = bgTexture;
        wolken_achtergrond = false;}
    }
 
      function createCamera() {
         camera = new THREE.PerspectiveCamera(
         50, // FOV
         window.innerWidth /window.innerHeight, // aspect ratio
         1, // near clipping plane
         8000, // far clipping plane
      );
        camera.position.set( 0, -50, 150 )
    }
 
     function createRenderer() {
       renderer = new THREE.WebGLRenderer( { antialas: true } );
       renderer.setSize( window.innerWidth, window.innerHeight );
       renderer.setPixelRatio( window.devicePixelRatio );
       document.body.appendChild( renderer.domElement );
   }
 
     function createEquirect() {
       const geometry = new THREE.SphereGeometry( 250,2000, 2 );
       geometry.scale( -1, 1, 1 );
       const texture = new THREE.TextureLoader().load( '../textures/wereld.jpg' );
       texture.colorSpace = THREE.SRGBColorSpace;
       const material = new THREE.MeshBasicMaterial( {map: texture} );
       const mesh = new THREE.Mesh( geometry, material );
       scene.add( mesh );
    }
 
            //de functie voor de muis en pijltjestoetsen controls
     function createControls() {
       const controls = new OrbitControls( camera , renderer.domElement);
       controls.listenToKeyEvents( window );
    }
 
      function createGui() {
        const gui = new GUI({width: 150});
        gui.add(data,'start_stop_rotatie');
        gui.add(data, 'wolken_achtergrond').onChange(createBackground);
        gui.open();
    }
 
      function onWindowResize() {
        camera.aspect = window.innerWidth / window.innerHeight;
        camera.updateProjectionMatrix(); //met updateProjectionMatrix wordt het camera frustum aangepast
        renderer.setSize( window.innerWidth, window.innerHeight );
    }
 
      function render() {
         renderer.render( scene, camera );
    }
 
      function animate() {
        if (data.start_stop_rotatie) {
            scene.rotation.y += 0.004;
        }
    }
 
      function play() {
          renderer.setAnimationLoop( () => {animate();render();} );
    }
      </script>
  </body>
</html>