爲何不是從零開始呢? 由於這裏面確實涉及到不少編程知識須要有必定基礎, 特別是面向對象的設計模式, 0基礎要看懂仍是很難很難.css
整個系列將會基於THREEjs權威指南的知識體系, 力圖撥絲抽繭.webpack
我將分爲幾個模塊來一步步梳理, 主要分爲如下幾個部分:git
整個THREjs的最核心部分就是如下的流程github
requestAnimationFrame
使動畫更平滑.其中最後兩個不是必須會的, 並且須要第三方的庫的支持可供選擇的格式也有不少種, 我會盡量在後面對應章節中舉實例來講明.web
以上流程其實就是一堆API的調用, 全局有個THREE對象, 封裝了全部的方法, 跟jQuery的$符相似.編程
本系列的全部代碼都力圖不用使用webpack等打包方式來實現. 文件較大, 官方不推薦使用script在線引用, 請下載build版本到本地路徑, 而後再行引入, 除此以外, 還須要設置一些全局樣式以更好的進行內容呈現canvas
body { margin: 0; }
canvas { width: 100%; height: 100% }
複製代碼
如下代碼只會簡略說明, 具體每個對象的用法會在以後的文章中一一介紹詳情.設計模式
這第一個場景將會包含基本材質,基本集合體,平面, 攝像機, 輔助axes. 最終的效果爲:網絡
function init() {
const scene = new THREE.Scene()
const camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 0.1, 1000)
const renderer = new THREE.WebGLRenderer()
renderer.setClearColor(new THREE.Color(0x000000))
renderer.setSize(window.innerWidth, window.innerHeight)
const axes = new THREE.AxesHelper(20)
scene.add(axes)
const planeGeometry = new THREE.PlaneGeometry(60, 20)
const planeMaterial = new THREE.MeshBasicMaterial({color: 'grey'})
const plane = new THREE.Mesh(planeGeometry, planeMaterial)
plane.rotation.x = -0.5 * Math.PI
plane.position.set(15, 0, 0)
scene.add(plane)
const cubeGeometry = new THREE.BoxGeometry(4, 4, 4)
const cubeMaterial = new THREE.MeshBasicMaterial({
wireframe: true,
color: 'red',
})
const cube = new THREE.Mesh(cubeGeometry, cubeMaterial)
cube.position.set(-4, 4, 4)
scene.add(cube)
camera.position.set(-30, 30, 30)
camera.lookAt(scene.position)
// 將render的dom對象放到DOM中進行渲染
document.getElementById('webgl-output').appendChild(renderer.domElement)
renderer.render(scene, camera)
}
複製代碼
上述代碼其實就是最開始咱們說的如何建立一個THREEjs的流程, 每一個API的具體用法, 好比PerspectiveCamera, Geometry等會在以後的文章中一一進行解釋.app
有不少數據不是隨意設置的, 好比cube的Geometry設置爲4,4,4, 也就是長寬高, 那麼再去設置它的position的時候須要注意, 若是設置爲-4,-4,-4, 那麼cube就會在平面的下方, 也就看不見cube了, 仍是須要一些基礎的幾何學基礎, 因此不能說從零開始學.不過難度不會很大, 請讀者放心.
本章具體代碼以及每行的註釋請參見github
最後再引入一個全局都會使用到的一個輔助工具, dat.gui, 能夠很方便的使用GUI的方式控制某些參數., 下面的參數就是用於控制cube的座標位置
// 添加control.js
import * as dat from 'dat.gui'
const gui = new dat.GUI()
export const controller = {
x : -4,
y : 4,
z : 4,
}
gui.add(controller, 'x', -10, 10)
gui.add(controller, 'y', -10, 10)
gui.add(controller, 'z', -10, 10)
複製代碼
而後再使用requestAnimationFrame
這個全局方法來實時響應式更新場景
const render = function() {
cube.position.x = controller.x
cube.position.y = controller.y
cube.position.z = controller.z
// 進行渲染
renderer.render(scene, camera)
requestAnimationFrame(render)
}
複製代碼
這樣在界面中就能夠看到cube的移動了
動畫也是如此原理, 只須要使用
// 沿x軸移動
cube.position.x += 0.02
複製代碼
下一篇會說到場景相關的東西.
封面圖來自threejs.org