Após visitar alguns sites, e finalmente cair de paraquedas nessa linda biblioteca threejs.org, vi que a internet me surpreende a cada dia.
A proposta da biblioteca é :
O objetivo do projeto é criar uma biblioteca 3D leve, com um baixo nível de complexidade – em outras palavras, para iniciantes. A biblioteca oferece <canvas>, <svg>, CSS3D e renderizadores WebGL .
Em outras palavras, você pode fazer um monte de coisas legais em 3D com javascript rodando do lado do cliente sem necessidade de processamento gráfico pesado!
Veja uma imagem do que eu fiz aqui :
Não entendeu ainda o que eu quis diz dizer? Veja um live demo aqui
Viu que maneiro?
Que tal aprender a fazer um desses? Vamos lá?
O código resumidamente é bastante simples, vamos a nossa página HTML :
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:fb="http://www.facebook.com/2008/fbml" xml:lang="pt" lang="pt"> <meta http-equiv="content-type" content="text/html;charset=utf-8" /><!-- /Added by HTTrack --> <head> <title>Cubo 3D</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> <!-- Js --> <script src="../Content/js/jquery-1.10.1.min.js"></script> <script src="../Content/js/canvas.js"></script> <script src="../Content/js/three.js"></script> </head> <body style="background:#333;"> <div id="main"> <section class="cubo"> <div id="cubo-canvas"></div> </section> </div> </html>
Você pode perceber que temos apenas 3 arquivos, a bilbioteca Jquery, nosso arquivo de configuração Canvas.js e a biblioteca 3D Three.js
Vamos dar uma olhada no código do nosso arquivo de configuração:
$(function () { //cria elemento canvas do html5 var canvasEl = document.createElement('canvas'); if (!canvasEl.getContext || $(window).width() < 479) { $("#cubo-canvas").append('<img src="../Content/img/cubo.png" alt="Cubo 3D" />'); return; } //instancia as variáveis necessárias var camera, scene, renderer, cubo; var targetRotationX = 0; var targetRotationY = 0; var targetRotationOnMouseDownX = 0; var targetRotationOnMouseDownY = 0; var mouseX = 0; var mouseY = 0; var mouseXOnMouseDown = 0; var mouseYOnMouseDown = 0; //define tamanho var canvasWidth = 390; var canvasHeight = 390; //define o eixo var canvasHalfX = canvasWidth / 2; var canvasHalfY = canvasHeight / 2; //define o inicio window.requestAF = function () { return ( window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (callback) { window.setTimeout(callback, 1000 / 60); } ); } (); //inicia a figura init(); //incia a renderizaçao e animação animate(); //cria o elemento function init() { var container = document.getElementById("cubo-canvas"); //posicao de camera camera = new THREE.Camera(53, canvasWidth / canvasHeight, 1, 1000); camera.position.y = 150; camera.position.z = 500; camera.target.position.y = 150; //define um cenário scene = new THREE.Scene(); //define as "faces" do cubo ( você pode fazer um dado! ) var materiais = [ new THREE.MeshBasicMaterial({ map: THREE.ImageUtils.loadTexture("../Content/img/cubo.jpg") }), // Left side new THREE.MeshBasicMaterial({ map: THREE.ImageUtils.loadTexture("../Content/img/cubo.jpg") }), // Right side new THREE.MeshBasicMaterial({ map: THREE.ImageUtils.loadTexture("../Content/img/cubo.jpg") }), // Top side new THREE.MeshBasicMaterial({ map: THREE.ImageUtils.loadTexture("../Content/img/cubo.jpg") }), // Bottom side new THREE.MeshBasicMaterial({ map: THREE.ImageUtils.loadTexture("../Content/img/cubo.jpg") }), // Front side new THREE.MeshBasicMaterial({ map: THREE.ImageUtils.loadTexture("../Content/img/cubo.jpg") }) // Back side ]; //define o cubo cubo = new THREE.Mesh(new THREE.Cube(260, 260, 260, 4, 4, 4, materiais), new THREE.MeshFaceMaterial()); cubo.position.y = 150; //adiciona o cubo na cena scene.addObject(cubo); //renderiza renderer = new THREE.CanvasRenderer(); renderer.setSize(canvasWidth, canvasHeight); container.appendChild(renderer.domElement); container.addEventListener('mousemove', onMouseMove, false); } //velocidade do cubo em relaçao ao mouse function onMouseMove(event) { mouseX = event.clientX - canvasHalfX; mouseY = event.clientY - canvasHalfY; targetRotationX = targetRotationOnMouseDownX + (mouseX - mouseXOnMouseDown) * 0.02; targetRotationY = targetRotationOnMouseDownY + (mouseY - mouseYOnMouseDown) * 0.002; } function animate() { requestAF(animate); render(); } //velocidade de renderizaçao function render() { cubo.rotation.x += (targetRotationY - cubo.rotation.x) * 0.05; cubo.rotation.y += (targetRotationX - cubo.rotation.y) * 0.05; renderer.render(scene, camera); } });
Ufa! Muitos detalhezinhos, mas nada que seja complicado de entender.
E pronto! Nosso cubo está funcionando.
Você pode baixar todo o projeto cubo3d, para estudar melhor.
Não esqueça de conferir ótimos exemplos aqui: http://threejs.org/
Ah, que tal dar aquela curtida na nossa Fã Page?