首先,如果想要學習threejs,先去看看 官方基礎教程 ,里面闡述了threejs的核心概念和一些重要的對象。這邊文章就是具體使用threejs加入3D圖形的一個水文,看了自由添加其他物體有個參照。
使用threejs繪制3D圖形,一般繪制的結果都是通過canvas元素生成,對於平面、3D效果、視角變化和交互、動畫這一塊,使用threejs可以快速便捷地幫助我們完成工作,而不必一步一步創建canvas,獲取context再逐條繪制。threejs有一些基本概念在使用之前必須要了解。
const scene = new THREE.Scene();
場景的初始化可以自定義其中一些內容,Scene接收對象形式的參數,比較有用屬性的包括:
const camera = new THREE.PerspectiveCamera(45, 1, 1, 100);
const renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
下面就粗暴地添加一組物體:
所謂組的概念,是由於場景中3D圖形是一個一個的,多個3D圖形就可以組成一組,一個或者一組圖形都可以通過name屬性命名,並通過name找到對應的3D對象。對於一個場景中有多個模型,分組是十分必要的。
let group = new THREE.Group(); scene.add(group); // 添加兩個物體 let cube = new THREE.BoxGeometry( 10, 10, 10 ); let boxMaterial = new THREE.MeshBasicMaterial( {color: 0x00ff00, wireframe: true} ); let box = new THREE.Mesh( cube, boxMaterial ); box.position.x = 10; group.add( box );
let sphere = new THREE.SphereGeometry( 5, 32, 32 ); let sphereMaterial = new THREE.MeshNormalMaterial({ wireframe: true, transparent: true} ); let blet = new THREE.Mesh( sphere, sphereMaterial ); blet.position.x = -10; group.add( blet ); // 添加光 let light = new THREE.AmbientLight( 0x404040 ); scene.add( light ); // 想要看到空間內的物體,需要調整一下距離和方位 camera.position.z = 100; // 更新空間需要重新渲染 renderer.render(scene, camera);
Geometry對應有許多幾何形狀,大部分都進行封裝,規則圖形很好進行繪制,獨特的圖形也需要自己描點傳入數據繪制,比如shape。
材料又分許多種,這里材料都用到wireframe,便於觀察我們添加的物體的確是3D結構。
場景中有一個組,那么組內所有顯示的3D對象都是在場景中的。而想要顯示必須要確保視野對着物體,也就是camera的位置、角度都合適,然后有光才能看見材料的顏色。最后別忘了render一下。
這時候場景中是這樣的:
好像3D想過也不是很明顯,那么加上動畫轉一轉,將兩個物體延自身中心旋轉:
window.requestAnimationFrame(function animate() { requestAnimationFrame(animate); box.rotation.x += 0.01; box.rotation.y += 0.01; blet.rotation.x += 0.01; blet.rotation.y += 0.01; renderer.render(scene, camera) })
差不多這樣吧:
更多用法參考:https://threejs.org/examples/
還是很有意思的。。