WebGL是在浏览器中实现三维效果的一套规范。是浏览器中的3D引擎,是利用js代码来实现加载3D模型,渲染、输出等功能,从而实如今浏览器和微信中浏览三维文件的效果。javascript
three.js是基于WebGL的开源图形库,里面提供了大量的WebGL的图形函数,直接使用three.js可更快的开发一个web3D项目。java
Web3D又称网络三维,是一种在虚拟现实技术的基础上,将现实世界中有形的物品,经过互联网进行虚拟的三维应用展现,并可互动浏览操做的一种虚拟现实基础。web
3Dview框架是基于three.js图形库,实现的3D文件加载,360度浏览、平移、爆炸、刨切、批注、文件树、动画等功能的一个浏览控件。canvas
3Dview的基本架构:api
用户 服务器端后台 viewer加载浏览器
上传ics、obj等三维渲染模型文件 服务器自动转换为web可加载格式 加载文件,并实现浏览各类功能服务器
three.js学习:微信
1.三大组建,网络
场景(scene)、相机(camera)、渲染器(renderer)架构
关键句:有了这三样东西,咱们才可以使用相机讲场景渲染到网页上去。
二、画线条与画平面
若是不报错但没有效果的时候,注意新版本有的地方的方法是写法是不同的。
好比:
1.THREE.LinePieces 换成 THREE.LineSegments
2.camera.lookAt(0, 0, 0)的写法
这时候能够参考https://threejs.org/docs/#api 参考最新的api文档的定义。
<script src="three.js-dev/build/three.js"></script>
<script> //渲染器 var renderer; function initThree() { width = document.getElementById('canvas-frame').clientWidth; height = document.getElementById('canvas-frame').clientHeight; renderer = new THREE.WebGLRenderer({ antialias : true }); renderer.setSize(width, height); document.getElementById('canvas-frame').appendChild(renderer.domElement); renderer.setClearColor(0xFFFFFF, 1.0); } //相机 var camera; function initCamera() { camera = new THREE.PerspectiveCamera(45, width / height, 1, 10000); camera.position.x = 0; camera.position.y = 1000; camera.position.z = 0; camera.up.x = 0; camera.up.y = 0; camera.up.z = 1; camera.lookAt(0,0,0); } //场景 var scene; function initScene() { scene = new THREE.Scene(); } //光 var light; function initLight() { light = new THREE.DirectionalLight(0xFF0000, 1.0, 0); light.position.set(100, 100, 200); scene.add(light); } //立方体 var cube; //初始化 画线条 // function initObject() { // //声明一个几何体geometry vertices变量用来存放点 // var geometry = new THREE.Geometry(); // var material = new THREE.LineBasicMaterial( { vertexColors: THREE.VertexColors } ); // var color1 = new THREE.Color( 0x444444 ), color2 = new THREE.Color( 0xFF0000 ); // // // 线的材质能够由2点的颜色决定 // // vertor3D表示3D世界的点,点有THREE.Vector3表示,必须被放到THREE.Geometry // var p1 = new THREE.Vector3( -100, 0, 100 ); // var p2 = new THREE.Vector3( 100, 0, -100 ); // geometry.vertices.push(p1); // geometry.vertices.push(p2); // geometry.colors.push( color1, color2 ); // //定义线条 // var line = new THREE.Line( geometry, material, THREE.LineSegments ); // scene.add(line); // } //初始化 画平面 function initObject() { var geometry = new THREE.Geometry(); geometry.vertices.push( new THREE.Vector3( - 500, 0, 0 ) ); geometry.vertices.push( new THREE.Vector3( 500, 0, 0 ) ); for ( var i = 0; i <= 20; i ++ ) { var line = new THREE.Line( geometry, new THREE.LineBasicMaterial( { color: 0x000000, opacity: 0.2 } ) ); line.position.z = ( i * 50 ) - 500; scene.add( line ); var line = new THREE.Line( geometry, new THREE.LineBasicMaterial( { color: 0x000000, opacity: 0.2 } ) ); line.position.x = ( i * 50 ) - 500; line.rotation.y = 90 * Math.PI / 180; scene.add( line ); } } function threeStart() { initThree(); initCamera(); initScene(); initLight(); initObject(); renderer.clear(); renderer.render(scene, camera); } </script>
三、让场景动起来:与静态区别加了requestAnimationFrame(animation)函数,传递callback参数。 camera.position.x =camera.position.x +1;相机向右移动
第一种相机动 //物体设置 var mesh; function initObject() { var geometry = new THREE.CylinderGeometry( 100,150,400); var material = new THREE.MeshLambertMaterial( { color:0xFFFFFF} ); mesh = new THREE.Mesh( geometry,material); mesh.position = new THREE.Vector3(0,0,0); scene.add(mesh); } function threeStart() { initThree(); initCamera(); initScene(); initLight(); initObject(); animation(); }
function animation()
{
//renderer.clear();
camera.position.x =camera.position.x +1;
renderer.render(scene, camera);
requestAnimationFrame(animation);
}
第二种 物体动
function animation() { mesh.position.x -=1; renderer.render(scene, camera); requestAnimationFrame(animation); }
四、性能
FPS表示:上一秒的帧数,这个值越大越好,通常都为60左右。点击上面的图,就会变成下面的另外一个视图。参数0
MS表示渲染一帧须要的毫秒数,这个数字是越小越好。再次点击又能够回到FPS视图中。参数1
关键代码
添加<script src="three.js-dev/examples/js/libs/stats.min.js"></script>
var stats; 在定义渲染器renderer的initThree函数里添加 //性能 stats = new Stats(); stats.domElement.style.position = 'absolute'; stats.domElement.style.left = '0px'; stats.domElement.style.top = '0px'; document.getElementById('canvas-frame').appendChild(stats.domElement);