利用Three.js實(shí)現(xiàn)3D三棱錐立體特效
演示
技術(shù)棧
3D特效的話最容易讓人想到的應(yīng)該是three.js吧。我們今天來(lái)說(shuō)說(shuō)它。
Three.js是基于原生WebGL封裝運(yùn)行的三維引擎,在所有WebGL引擎中,Three.js是國(guó)內(nèi)文資料最多、使用最廣泛的三維引擎。
Threejs是一款WebGL三維引擎,它可以用來(lái)做什么許多許多地場(chǎng)景應(yīng)用
一個(gè)小案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>第一個(gè)three.js文件_WebGL三維場(chǎng)景</title> <style> body { margin: 0; overflow: hidden; /* 隱藏body窗口區(qū)域滾動(dòng)條 */ } </style> <!--引入three.js三維引擎--> <!-- <script src="http://www.yanhuangxueyuan.com/versions/threejsR92/build/three.js"></script>--> <script src="js/three/build/three.js"></script> <!-- <script src="http://www.yanhuangxueyuan.com/threejs/build/three.js"></script> --> </head> <body> <script> /** * 創(chuàng)建場(chǎng)景對(duì)象Scene */ var scene = new THREE.Scene(); /** * 創(chuàng)建網(wǎng)格模型 */ // var geometry = new THREE.SphereGeometry(60, 40, 40); //創(chuàng)建一個(gè)球體幾何對(duì)象 var geometry = new THREE.BoxGeometry(100, 100, 100); //創(chuàng)建一個(gè)立方體幾何對(duì)象Geometry var material = new THREE.MeshLambertMaterial({ color: 0x0000ff }); //材質(zhì)對(duì)象Material var mesh = new THREE.Mesh(geometry, material); //網(wǎng)格模型對(duì)象Mesh scene.add(mesh); //網(wǎng)格模型添加到場(chǎng)景中 /** * 光源設(shè)置 */ //點(diǎn)光源 var point = new THREE.PointLight(0xffffff); point.position.set(400, 200, 300); //點(diǎn)光源位置 scene.add(point); //點(diǎn)光源添加到場(chǎng)景中 //環(huán)境光 var ambient = new THREE.AmbientLight(0x444444); scene.add(ambient); // console.log(scene) // console.log(scene.children) /** * 相機(jī)設(shè)置 */ var width = window.innerWidth; //窗口寬度 var height = window.innerHeight; //窗口高度 var k = width / height; //窗口寬高比 var s = 200; //三維場(chǎng)景顯示范圍控制系數(shù),系數(shù)越大,顯示的范圍越大 //創(chuàng)建相機(jī)對(duì)象 var camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000); camera.position.set(200, 300, 200); //設(shè)置相機(jī)位置 camera.lookAt(scene.position); //設(shè)置相機(jī)方向(指向的場(chǎng)景對(duì)象) /** * 創(chuàng)建渲染器對(duì)象 */ var renderer = new THREE.WebGLRenderer(); renderer.setSize(width, height);//設(shè)置渲染區(qū)域尺寸 renderer.setClearColor(0xb9d3ff, 1); //設(shè)置背景顏色 document.body.appendChild(renderer.domElement); //body元素中插入canvas對(duì)象 //執(zhí)行渲染操作 指定場(chǎng)景、相機(jī)作為參數(shù) renderer.render(scene, camera); </script> </body> </html>
源碼
css部分
body{ overflow: hidden; margin:0; } canvas{ position: absolute; top: 0; left: 0; width: 100%; height:100%; }
js部分
var w = window.innerWidth, h = window.innerHeight; window.onresize = function(){ var w = window.innerWidth, h = window.innerHeight; camera.aspect = w / h; camera.updateProjectionMatrix(); renderer.setSize( w, h ); } cameraSpeed = .0003; lightSpeed = .001; tubularSegments = 1000; radialSegments = 3; tubeRadius = 2; lightColor = 0xffffff; lightIntensity = 1; lightDistance = 20; var renderer = new THREE.WebGLRenderer({ canvas: document.querySelector("canvas"), antialias: true, }); renderer.setSize(w, h); var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera(60, w / h, .001, 1000); var starsGeometry = new THREE.Geometry(); for(i=0; i<3000; i++){ var star = new THREE.Vector3(); star.x = THREE.Math.randFloatSpread(1500); star.y = THREE.Math.randFloatSpread(1500); star.z = THREE.Math.randFloatSpread(1500); starsGeometry.vertices.push(star); } var starsMaterial = new THREE.PointsMaterial({color: 0xffffff}); var starField = new THREE.Points(starsGeometry,starsMaterial); scene.add(starField); for (i=0; i<p.length; i++) { var x = p[i][0]; var y = p[i][2]; var z = p[i][1]; p[i] = new THREE.Vector3(x,y,z); } var path = new THREE.CatmullRomCurve3(p); var geometry = new THREE.TubeGeometry(path,tubularSegments,tubeRadius,radialSegments,true); for(i=0; i<geometry.faces.length; i++){ geometry.faces[i].color = new THREE.Color("hsl("+i/2+",100%,50%)"); } var material = new THREE.MeshLambertMaterial({ side: THREE.BackSide, vertexColors: THREE.FaceColors, wireframe: true }); var tube = new THREE.Mesh(geometry, material); scene.add(tube); var light = new THREE.PointLight(0xffffff, 1, 50); scene.add(light); var light2 = new THREE.AmbientLight(0x222222); scene.add(light2); var l1 = new THREE.PointLight(lightColor, lightIntensity, lightDistance); scene.add(l1); var l2 = new THREE.PointLight(lightColor, lightIntensity, lightDistance); scene.add(l2); var l3 = new THREE.PointLight(lightColor, lightIntensity, lightDistance); scene.add(l3); var l4 = new THREE.PointLight(lightColor, lightIntensity, lightDistance); scene.add(l4); var l5 = new THREE.PointLight(lightColor, lightIntensity, lightDistance); scene.add(l5); var pct = 0; var pct2 = 0; function render(){ pct += cameraSpeed pct2 += lightSpeed; var pt1 = path.getPointAt(pct%1); var pt2 = path.getPointAt((pct + .01)%1); camera.position.set(pt1.x,pt1.y,pt1.z); camera.lookAt(pt2); light.position.set(pt2.x, pt2.y, pt2.z); l1.position.set(path.getPointAt((pct2+.0)%1).x, path.getPointAt((pct2+.0)%1).y, path.getPointAt((pct2+.0)%1).z); l2.position.set(path.getPointAt((pct2+.2)%1).x, path.getPointAt((pct2+.2)%1).y, path.getPointAt((pct2+.2)%1).z); l3.position.set(path.getPointAt((pct2+.4)%1).x, path.getPointAt((pct2+.4)%1).y, path.getPointAt((pct2+.4)%1).z); l4.position.set(path.getPointAt((pct2+.6)%1).x, path.getPointAt((pct2+.6)%1).y, path.getPointAt((pct2+.6)%1).z); l5.position.set(path.getPointAt((pct2+.8)%1).x, path.getPointAt((pct2+.8)%1).y, path.getPointAt((pct2+.8)%1).z); renderer.render(scene, camera); requestAnimationFrame(render); } requestAnimationFrame(render);
p = [ [389,246,0], [410,255,20], [413,268,7], [431,261,12], [418,244,30], [416,217,25], [420,205,8], [427,227,-20], [432,236,5], [444,228,12], [451,232,41], [446,246,72], [443,264,96], [446,278,65], [463,267,20], [460,258,-10], [464,243,-20], [459,233,0], [475,225,22], [484,225,29], [490,214,51], [476,202,55], [462,202,55], [446,205,42], [440,192,42], [430,183,72], [413,184,58], [406,191,32], [406,207,0], [402,220,0], [390,222,20], [385,228,10], [389,246,0] ];
以上就是利用Three.js實(shí)現(xiàn)3D三棱錐立體特效的詳細(xì)內(nèi)容,更多關(guān)于Three.js 3D三棱錐立體特效的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaScript高階API數(shù)組reduce函數(shù)使用示例
這篇文章主要為大家介紹了JavaScript數(shù)組高階API?reduce函數(shù)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11微信小程序tab左右滑動(dòng)切換功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了微信小程序tab左右滑動(dòng)切換功能的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02基于Three.js實(shí)現(xiàn)360度全景圖片
這篇文章主要為大家詳細(xì)介紹了基于Three.js實(shí)現(xiàn)360度全景圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12一個(gè)可以得到元素真實(shí)的背景顏色的javascript腳本
一個(gè)可以得到元素真實(shí)的背景顏色的javascript腳本...2007-07-07js showModalDialog參數(shù)的使用詳解
本篇文章主要是對(duì)js中showModalDialog參數(shù)的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-01-01JS拖拽的進(jìn)一步練習(xí),移動(dòng)與拉伸實(shí)現(xiàn)代碼
這次增加了一些相關(guān)的功能,增加四個(gè)角的拉伸改變寬度,主要還是用到一些簡(jiǎn)單的坐標(biāo)位置計(jì)算,沒(méi)有什么技術(shù)難度,熟練了一下自己對(duì)拖拽的運(yùn)用2012-05-05js實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)的五種方法推薦
下面小編就為大家?guī)?lái)一篇js實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)的五種方法推薦。小編覺得挺不錯(cuò)的?,F(xiàn)在分享給大家。給大家參考一下。2016-03-03