Three.js官方文檔比較精簡,重點介紹api,沒有一個合適的零基礎的教程,但官網的demo十分豐富,遂產生從demo來逐漸學習Three.js的想法。html
如下是目前收集到的較好的學習資源:git
好,下面迴歸正題,這是今天要分析的: demo,官網的例子,能夠直接跳到github上查看源碼,我建議直接把three.js整個項目下載下來,能夠直接查看demo的效果,直接打開html文件可能效果有不同,能夠看官網的說法, 也就是須要啓動一個本地的服務器,若是你用的webstorm的話,直接右鍵html文件,就會有個 run 文件的選項,點擊就能夠啓動一個本地服務器來啓動本地的文件。github
下面是demo的代碼:web
var camera, scene, renderer; var mesh; init(); animate(); function init() { // 初始化透視相機,參數(fov : Number, aspect : Number, near : Number, far : Number) // fov — 攝像機視錐體垂直視野角度 // aspect — 攝像機視錐體長寬比 // near — 攝像機視錐體近端面 // far — 攝像機視錐體遠端面 camera = new THREE.PerspectiveCamera( 70, ( window.innerWidth - 600 ) / window.innerHeight, 1, 1000 ); // position是camera繼承自Object3D的屬性,表示相機對象在三維空間中的位置 camera.position.z = 400; // 初始化場景 scene = new THREE.Scene(); // 加載紋理,TextureLoader是一個加載器,load方法加載文件,返回一個新的紋理對象 var texture = new THREE.TextureLoader().load( 'textures/crate.gif' ); // BoxBufferGeometry(width : Float, height : Float, depth : Float, widthSegments : Integer, heightSegments : Integer, depthSegments : Integer) var geometry = new THREE.BoxBufferGeometry( 200, 200, 200 ); // 材質,map屬性表示貼圖,這裏將以前的texture紋理對象添加進來 var material = new THREE.MeshBasicMaterial( { map: texture } ); // Mesh方法表示以三角形組成基本網格來造成物體 mesh = new THREE.Mesh( geometry, material ); // 將物體添加到場景中 scene.add( mesh ); // 初始化渲染器,antialias表示抗鋸齒, canvas屬性將three.js加載到已有的canvas元素上。 renderer = new THREE.WebGLRenderer( { antialias: true, canvas: document.getElementById('my-canvas') } ); // 設置設備像素比。一般用於避免HiDPI設備上繪圖模糊 renderer.setPixelRatio( window.devicePixelRatio ); // .setSiZe( width : Integer, height : Integer, updateStyle : Boolean ) // 設置輸出canvas的大小,將updateStyle設置爲false以阻止對canvas的樣式作改變 renderer.setSize( window.innerWidth - 600, window.innerHeight ); // domElement爲自動建立或已有的canvas元素 document.body.appendChild( renderer.domElement ); // 監聽瀏覽器尺寸的修改 window.addEventListener( 'resize', onWindowResize, false ); } // 瀏覽器尺寸改變時的回調,從新設置相機和渲染器參數 function onWindowResize() { camera.aspect = window.innerWidth / window.innerHeight; // 在大多數屬性發生改變以後,你將須要調用.updateProjectionMatrix來使得這些改變生效。 camera.updateProjectionMatrix(); renderer.setSize( window.innerWidth, window.innerHeight ); } // 動畫 function animate() { // 每一幀調用一次 requestAnimationFrame( animate ); mesh.rotation.x += 0.005; mesh.rotation.y += 0.01; renderer.render( scene, camera ); }
對於初始化透視相機中fov — 攝像機視錐體垂直視野角度和視錐體的理解,能夠看看入門指南中的透視相機一章,但視錐體的長寬比都說要和canvas的長寬比同樣,我試了一下,若是不同的話物體就會變形。有點難以理解,其實道理跟圖片要在固定長寬的div填滿且沒有裁剪和空白的情形同樣,若是圖片跟div長寬比不一樣的話就會變形。這裏的視錐體垂直視野角度在照相機距離物體角度固定的狀況下,至關於固定了寬,再根據長寬比算出長,視錐體的面積就固定了,此時視錐體的就至關於一張圖片,而canvas就至關於固定寬高的div,因此此時視錐體拉伸鋪滿。canvas
widthSegments屬性能夠看入門指南中的基本形狀瞭解。api
設備像素比能夠看連接瀏覽器
通常狀況下new THREE.WebGLRenderer()
會自動建立一個canvas元素,若是想用本身定義的canvas元素的話,能夠傳入canvas屬性,值爲獲取的元素。服務器