之前看过一点webgl编程指南,确实很难消化。所以过段时间再来朝花夕拾。
这次直接使用webgl的一个库three.js,能更方便的实现功能。
先可以点击这里看最终效果。
基本的几步就是:定义舞台,定义透视摄像机,定义渲染器,定义灯光,画爱心,填充爱心,向舞台中心增加爱心,随机向外扩散。
下面是html代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>test3d3</title> <style type="text/css"> body{ margin: 0; overflow: hidden; } </style> </head> <body> <div id="webgl"></div> <script type="text/javascript" src="https://threejs.org/build/three.js"></script> <script type="text/javascript"> function init(){ var scene=new THREE.Scene(); scene.fog=new THREE.Fog(0xffffff,15,300); var camera=new THREE.PerspectiveCamera(45,window.innerWidth/window.innerHeight,0.1,1000); camera.position.set(100,100,100); camera.lookAt(scene.position); var renderer=new THREE.WebGLRenderer(); renderer.setClearColor(0xEEEEEE); renderer.setSize(window.innerWidth,window.innerHeight); var spotLight=new THREE.DirectionalLight(0xffffff); spotLight.position.set(200,40,200); scene.add(spotLight); function drawShape(){ var shape=new THREE.Shape(); shape.moveTo(0, 0); shape.quadraticCurveTo(-3.8, 2, 4, 9); shape.quadraticCurveTo(11, 2, 8, 0); shape.quadraticCurveTo(5, -1.2, 4, 2); shape.quadraticCurveTo(3, -1.2, 0, 0); return shape; } function createMesh(goem){ var meshMaterial=new THREE.MeshPhongMaterial({color:0xffffff * Math.random()}); meshMaterial.side=THREE.DoubleSide; var mesh=THREE.SceneUtils.createMultiMaterialObject(goem,[meshMaterial]); mesh.position.set(0,0,0); return mesh; } var vx=[1],vy=[1],vpy=[1],vpx=[1], vpz=[1]; function addinitShape(){ vx.push(Math.random()*0.02); vy.push(Math.random()*0.02); vpy.push(-0.15+Math.random()*0.3); vpx.push(-0.15+Math.random()*0.3); vpz.push(-0.15+Math.random()*0.3); var shape=createMesh(new THREE.ShapeGeometry(drawShape())); shape.rotation.z=Math.PI; shape.rotation.y=Math.random()*Math.PI; scene.add(shape); } for(var i=0;i<100;i++){ addinitShape(); } setInterval(function(){ if(scene.children.length<1000){ addinitShape(); }else{ scene.children.splice(1,1); vx.shift(); vy.shift(); vpx.shift(); vpy.shift(); vpz.shift(); } },80) document.getElementById("webgl").appendChild(renderer.domElement); function rendererScene(){ for(let i=1;i<scene.children.length;i++){ scene.children[i].rotation.y += vy[i]; scene.children[i].rotation.x += vx[i]; scene.children[i].position.y -= vpy[i]; scene.children[i].position.x += vpx[i]; scene.children[i].position.z += vpz[i]; } requestAnimationFrame(rendererScene); renderer.render(scene,camera); } rendererScene(); } window.onload=init; </script> </body> </html>
这还是three.js最基础的一部分,之后会继续加特技啦!
版权声明:本文为原创文章,转载请注明出处和作者,不得用于商业用途,请遵守
CC BY-NC-SA 4.0协议。
赞赏一下