Three.js的入門案例(上)
關(guān)注初識Threejs與小編一起學(xué)習(xí)成長
在Three.js的賦能下,WEB網(wǎng)頁效果逐漸豐富起來,今天我們就來運(yùn)用之前學(xué)習(xí)的Three.js基礎(chǔ)知識,實(shí)現(xiàn)一個旋轉(zhuǎn)的幾何體-球體。

知識點(diǎn)
1、透視投影照相機(jī)、基本材質(zhì);
2、球體幾何模型、全景貼圖;
3、渲染器;
創(chuàng)建DOM
<div class="canvas" id="canvasObj"></div>
為div容器定義樣式:
html,body,.canvas{width:100%;height: 100%;padding:0px;margin:0px;}.canvas{background:url(../libs/threejs/img/bg.jpg) no-repeat;background-size:100% 100%;}
引入依賴
這里使用import導(dǎo)入依賴,OrbitControls.js是軸道控制器控件,用它可以實(shí)現(xiàn)場景與鼠標(biāo)交互,讓場景動起來,控制場景的旋轉(zhuǎn)、縮放、平移;CSS2DRenderer.js是CSS 2D渲染器,使用CSS2DObject和CSS2DRenderer可以繪制一個2D效果的標(biāo)簽,將三維物體和基于HTML的標(biāo)簽相結(jié)合。
import * as THREE from '../libs/threeJs/three.module.js';import { OrbitControls } from '../libs/threeJs/controls/OrbitControls.js';//軸道控制器控件import { CSS2DRenderer, CSS2DObject } from '../libs/threeJs/renderers/CSS2DRenderer.js';//css 2D渲染器
核心代碼
1、初始化場景:
_this.scene=function(){scene = new THREE.Scene();}
2、初始化照相機(jī):
_this.camera=function(){/*** 構(gòu)造函數(shù)總共有四個參數(shù),分別是fov,aspect,near,far* fov:照相機(jī)視錐體垂直視野角度,實(shí)際項(xiàng)目中一般都定義45,因?yàn)?5最接近人正常睜眼角度* aspect:照相機(jī)視錐體長寬比* near:照相機(jī)視錐體近端面 far:照相機(jī)視錐體遠(yuǎn)端面* */camera = new THREE.PerspectiveCamera(45, canvasWidth / canvasHeight, 1, 1000);//遠(yuǎn)景投影的相機(jī)camera.position.set(10, 2, 20);//position用來指定相機(jī)在三維坐標(biāo)中的位置}
3、在場景里面創(chuàng)建球體:
_this.addSphere=function(){/*** 初始化球體幾何模型* SphereGeometry(radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength)* radius:球體半徑* widthSegments:水平分割面的數(shù)量* heightSegments:垂直分割面的數(shù)量* */var earthGeometry = new THREE.SphereGeometry(_this.EARTH_RADIUS, 60, 60);var textureLoader = new THREE.TextureLoader();//紋理加載器,用于加載球體的紋理//基礎(chǔ)網(wǎng)孔材料var earthMaterial = new THREE.MeshBasicMaterial({color:0xffffff,//線條的十六進(jìn)制顏色map: textureLoader.load(_this.sphereBg),//設(shè)置紋理貼圖wireframe: false,//渲染模型為線框wireframeLinewidth: 3,//線框線寬skinning: false,//定義材料是否使用皮膚});//threeJs 的世界中,材質(zhì)(Material)+幾何體(Geometry)就是一個 mesh//創(chuàng)建網(wǎng)格對象earth = new THREE.Mesh(earthGeometry, earthMaterial);//設(shè)置球體標(biāo)題var h2html=$("<div class='title'><span>Three.js球體<br/>旋轉(zhuǎn)案例</span></div>").get(0);var earthLabel = new CSS2DObject(h2html);earthLabel.position.set(0, 2, 0);earth.add(earthLabel);//DOM元素實(shí)例添加到網(wǎng)格中scene.add(earth);//將球體添加到場景中}
4、初始化渲染器:
_this.renderer=function(){renderer = new THREE.WebGLRenderer({alpha: true,//背景是否透明antialias: true//抗鋸齒屬性});//window.devicePixelRatio返回當(dāng)前顯示設(shè)備的物理像素分辨率與CSS像素分辨率之比//設(shè)置設(shè)備像素比。通常用于HiDPI設(shè)備防止模糊輸出canvasrenderer.setPixelRatio(window.devicePixelRatio);renderer.setSize(canvasWidth, canvasHeight);//調(diào)整輸出canvas尺寸canvasObj.append(renderer.domElement);//把canvas添加Dom中/*** 初始化CSS 2D渲染器* 可以將三維物體和基于HTML的標(biāo)簽相結(jié)合*/labelRenderer = new CSS2DRenderer();labelRenderer.setSize(canvasWidth, canvasHeight);labelRenderer.domElement.style.position = 'absolute';labelRenderer.domElement.style.top = 0;canvasObj.append(labelRenderer.domElement);}
5、周期性渲染場景:
_this.renderFun=function(){requestAnimationFrame(_this.renderFun);var now = new Date();var delay = now - lastDate;lastDate = now;var intc = 3; // 每秒轉(zhuǎn)3度earth.rotation.y += Math.PI / 180 / delay * intc;labelRenderer.render(scene, camera);renderer.render(scene, camera);}
6、調(diào)用函數(shù):
//初始化_this.init=function(){_this.scene();_this.camera();_this.addSphere();_this.renderer();//軸道控制器。相機(jī)對象作為參數(shù),控件可以監(jiān)聽鼠標(biāo)的變化,改變相機(jī)對象屬性var controls = new OrbitControls(camera);controls.enabled = true;//鼠標(biāo)控制是否可用//滾輪是否可控制zoom,zoom速度默認(rèn)1controls.enableZoom = false;controls.zoomSpeed = 1.0;// controls.minDistance = 20;// 最小距離// controls.maxDistance = 25; //最大距離controls.noPan = true; // 禁用右鍵拖動controls.minPolarAngle = Math.PI / 180; // 視角不能低于水平面controls.maxPolarAngle = Math.PI / 2; // 視角不能低于水平面_this.renderFun();//渲染}
寫在最后
以上就是此次案例的核心代碼,大家可以動手嘗試一下修改構(gòu)造函數(shù)的參數(shù)值,如:基礎(chǔ)材質(zhì)的紋理貼圖、網(wǎng)格模型的旋轉(zhuǎn)方向等,通過它們的巧妙組合,可以讓場景更加絢麗多彩,快去動手實(shí)踐吧~
如果你對本文內(nèi)容有任何建議,歡迎與小編溝通交流,一起學(xué)習(xí)成長!關(guān)注公眾號回復(fù)three.js,獲取完整案例代碼。 |

你“在看”我嗎?

