La 3D dans les sites web cela fait maintenant quelques années que l’on nous promet la révolution à toutes les sauces. Mais des sites en 3D il y en a peu, la plupart sont surtout des proof of concept. Cela dit la multiplication des framework de toute sorte prouve que les choses évolue. En attendant et pour pas se faire trop larguer je propose une very petite initiation.

Le but de cette initiation est d’afficher et contrôler un objet en 3D créé avec blender

J’ai choisi le framework/librairies three.js car il est fourni avec de nombreux exemples, le plug-in a installer dans blender est bien documenté et surtout elle fonctionne avec où sans WebGL

Three.js se télécharge au moment où j’écris ces quelques lignes ici

 Pour le plug-in de blender c’est par ici la version 2.66 fonctionne avec blender 2.67

Installation du plug-in dans blender

sous windows rien de plus simple copier les fichiers __init__.py, export_threejs.py, import_threejs.py

dans le répertoire

C:\Users\USERNAME\AppData\Roaming\Blender Foundation\Blender\2.6X\scripts\addons

(USERNAME est à remplacer par votre nom d’utilisateur windows)

 

sous linux:
/home/USERNAME/.config/blender/2.6X/scripts/addons

(USERNAME est à remplacer par votre nom d’utilisateur linux)

sous Mac OSX

/Applications/Blender/blender.app/Contents/MacOS/2.6X/scripts/addons

une fois cela fait vous (re)démarrez blender, vous allez dans préférence user (ctrl + alt +U)

Dans l’onglet Add-ons -> Import Export -> tout en bas il doit y avoir Import-Export three.js, vous cochez (img1)

Si vous avez tout bien fait vous devez avoir dans le menu Export (img2)

Je ne vous explique pas comment on exporte cela me semble assez basique. je mets à disposition un sac pliage pour la suite

Les bases de three.js

Pour bien démarrer il faut quelques éléments pour la 3D (style j’y connais quelque chose !!)

  •  La scène
  •  Le rendu
  •  Une caméra
  •  Un objet (ou plus), dans notre exemple pas de matériaux juste les couleurs défini dans Blender
  •  Un éclairage (bas oui un scène 3D dans le noir on voit rien)

La structure des répertoires pour l’exemple

Lorsque l’on dézippe three.js dans le répertoire example on se retrouve avec une foule de librairie js bien pratique, je vous conseille de les reprendre dans votre arborescence. 

Au final je propose l’arborescence des exemples avec juste une nuance pour le build
html -> /build
/js
/models
/obj
/scenes
/sounds
/textures

Mon premier tout premier exemple

 

Dans ce premier exemple on va definir :

  • une scène (bah oui comme un spectacle)
  • Utiliser un caméra Perspective
  • Utiliser un point de lumière (plus facile à gérer quand on y comprend rien ;)
  • Utiliser l’objet JSON que j’ai exporté depuis Blender, on lui fera faire une rotation de 45° sur l’axe y.


Il n’est pas inintéressant de voir quels sont les matériels que l’on a importé dans le json c’est pour cela qu’il y a une ligne console.log(materials);

 

<html>
	<head>
		<title>Mon premier Three.js app</title>
		<style>canvas { width: 100%; height: 100% }</style>
	</head>
	<body>
		<script src="/build/three.min.js"></script>
		<script>
			var scene = new THREE.Scene();
			var camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);

			var renderer = new THREE.WebGLRenderer();
			renderer.setSize(window.innerWidth, window.innerHeight);
			document.body.appendChild(renderer.domElement);
			//maintenant on va ajouter un objet créé avec blender
			var loader = new THREE.JSONLoader();
			loader.load( "obj/pliage_v3_bis.js",function (geometry,materials){
			//console.log(materials);

				//correction de la couleur du 2 ieme matériel
				//materials[1].color = new THREE.Color("rgb(255,0,0)");
				mesh2 = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial( materials ) );
				mesh2.position.x = 0;
				mesh2.scale.x = mesh2.scale.y = mesh2.scale.z = 1;
				mesh2.rotation.y = 45;
				scene.add( mesh2 );
			
				}
				);
			// on ajoute un point de lumière
			var light = new THREE.PointLight( 0xffffff, 1, 500 );
			light.position.set( 8,2,8);
			scene.add( light )
			//on change la position de la caméra
			camera.position.z = 6;

			var render = function () {
				requestAnimationFrame(render);
				renderer.render(scene, camera);
			};

			render();
		</script>
	</body>
</html>

 

Deuxième exemple

On va juste ajouter la gestion de la souris, histoire de faire bouger un peu l’objet.

On ajoute la librairie et remanier le JS (ok c’est du presque copier-coller des exemples)

 

<input id="valeurRY"  type="input"/>
		<input id="valeurRX"  type="input"/>
		<script src="/build/three.min.js"></script>
		<script src="/js/Detector.js"></script>
		<script>
			var SCREEN_WIDTH = window.innerWidth;
			var SCREEN_HEIGHT = window.innerHeight;
			if ( ! Detector.webgl ) Detector.addGetWebGLMessage();
			var scene = new THREE.Scene();
			camera = new THREE.PerspectiveCamera( 70, SCREEN_WIDTH / SCREEN_HEIGHT, 1, 10000 );

			var mouseX = 0, mouseY = 0;
			var windowHalfX = window.innerWidth / 2;
			var windowHalfY = window.innerHeight / 2;
			var renderer,container;
			init();
			animate()
			
			//maintenant on va ajouter un objet créé avec blender
			function init() {
				container = document.createElement( 'div' );
				document.body.appendChild( container );
				renderer = new THREE.WebGLRenderer();
				renderer.setSize( SCREEN_WIDTH, SCREEN_HEIGHT );
				renderer.setFaceCulling( THREE.CullFaceNone );

				container.appendChild( renderer.domElement );
				
				renderer.setSize(window.innerWidth, window.innerHeight);
				document.body.appendChild(renderer.domElement);
				var loader = new THREE.JSONLoader();
				loader.load( "obj/pliage_v3_bis.js",function (geometry,materials){
					materials[0].color = new THREE.Color("rgb(255,0,0)");
					mesh2 = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial( materials ) );
					mesh2.position.x = 0;
					mesh2.scale.x = mesh2.scale.y = mesh2.scale.z = 1;
					scene.add( mesh2 );
					}
				);
				// on ajoute un point de lumière
				var light = new THREE.PointLight( 0xffffff, 1, 500 );
				light.position.set( 2,2,8);
				scene.add( light )
				//on change la position de la caméra
				camera.position.z = 10;
				//detection mouvement du curseur
				document.addEventListener( 'mousemove', onDocumentMouseMove, false );
			}
			function animate() {
				requestAnimationFrame(animate );
				render();
			}

			function render () {
				var RY =document.getElementById("valeurRY");
				var RX =document.getElementById("valeurRX");
				mesh2.rotation.x =  mouseY * Math.PI / 180;
				mesh2.rotation.y =  mouseX * Math.PI / 180;
				renderer.render(scene, camera);
				RX.value=mesh2.rotation.x;
				RY.value=mesh2.rotation.y;
				
			}
			//action que l'on ralise lorsque le curseur bouge
			function onDocumentMouseMove( event ) {
				mouseX = ( event.clientX - windowHalfX );
				mouseY = ( event.clientY - windowHalfY );
			}
			
			function onWindowResize() {
				windowHalfX = window.innerWidth / 2;
				windowHalfY = window.innerHeight / 2;

				camera.aspect = window.innerWidth / window.innerHeight;
				camera.updateProjectionMatrix();

				renderer.setSize( window.innerWidth, window.innerHeight );
			}
		</script>

 

 

 Bon voilà c’était un very tiny exemple car les possibilités sont bien entendu immense. Il existe des exemples de toutes sortes. Une petite recherche sur vos moteurs préféré vous permettra de découvrir tout un monde extraordinaire.

  

three.js img 001 three.js img 002 three.js img 003 three.js img 004

Nouveau Calque...

Comments powered by CComment

We use cookies

Nous utilisons des cookies sur notre site web. Certains d’entre eux sont essentiels au fonctionnement du site et d’autres nous aident à améliorer ce site et l’expérience utilisateur (cookies traceurs). Vous pouvez décider vous-même si vous autorisez ou non ces cookies. Merci de noter que, si vous les rejetez, vous risquez de ne pas pouvoir utiliser l’ensemble des fonctionnalités du site.