Three.js是一个伟大的开源WebGL库,WebGL允许JavaScript操作GPU,在浏览器端实现真正意义的3D。

通过Three.js,你不仅可以创建相机、物体、光线、材质等等,还可以选择着色器,可以决定使用何种技术(WebGL、Canvas或SVG)在网页上渲染你的3D图形。

材质 :毫无疑问,这是Three.js最有用的部分了。这部分提供了几个非常易用的通用材质模型:
1.Basic材质:表示一种不考虑光照的材质,现在只能这么说了。
2.Lambert材质:(译者注:朗伯面,各向同性反射)。
3.Phong材质:(译者注:冯氏面,有光泽的表面,介于镜面反射和朗伯反射之间的反射,描述真实世界的反射)。

three.js核心对象:

场景、object3D ;   相机、渲染器 ;     材质、贴图、灯光

几何体   材质    模型加载器    交互/动画    相机控制器    后期处理    着色脚本的使用

网页可见区域宽: document.body.clientWidth;
网页可见区域高: document.body.clientHeight;
网页可见区域宽: document.body.offsetWidth   (包括边线的宽);
网页可见区域高: document.body.offsetHeight  (包括边线的宽);
网页正文全文宽: document.body.scrollWidth;
网页正文全文高: document.body.scrollHeight;
网页被卷去的高: document.body.scrollTop;
网页被卷去的左: document.body.scrollLeft;
网页正文部分上: window.screenTop;
网页正文部分左: window.screenLeft;
屏幕分辨率的高: window.screen.height;
屏幕分辨率的宽: window.screen.width;
屏幕可用工作区高度: window.screen.availHeight;
屏幕可用工作区宽度:window.screen.availWidth;

Three.js与其他同类引擎的比较:

插件式Web3D引擎:(共同点:需要安装插件,对移动平台的Web环境支持不好。)

.Flash:在PC平台占有率高,有大量开发群体和案例;需要安装插件,更适合2D动画开发,在移动平台支持不好。

.O3D:跨平台,浏览器兼容性高,基于OpenGL和D3D,运行流畅;需要安装插件,不支持移动平台,已停止开发,并转为WebGL实现,API稍繁琐。

.Unity 3D:专业游戏引擎,支持各大操作系统和平台;需要安装插件,移动平台仅支持APP 。

原生WebGL引擎:(共同点:不是过于底层、简单、不易使用,就是过于封装、不易扩展。)

.GLGE:XML描述场景,易于使用;封装度较高,扩展性不佳,开发维护不活跃。

.X3DOM :能像HTML元素一样集成和管理,包括模型、灯光、材质、事件处理等,容易上手;封装度较高,扩展性不佳。

.PhiloGL :更适合于数据可视化分析,较灵活;封装度低,功能简单。

.CopperLicht :比较完善的游戏引擎,易于使用;封装度较高,扩展性不佳。

Three.js的优势:

浏览器原生支持,不需要安装插件。对操作系统、浏览器兼容性高,支持移动平台。基于HTML/WebGL ,是Web开发的主流;开发维护非常活跃。组件及案例丰富,易于学习掌握;设计优雅、灵活。方便扩展以及增加新的特性。

Three.js的六个基本步骤

1.设置three.js渲染器

2.设置摄像机camera

3.设置场景scene

4.设置光源light

5.设置物体object

6.书写主函数执行以上五步

var webgl = document.getElementById('webgl');

var renderer;//定义一个全局变量renderer(含义:渲染)
function initThree(){
 //获取画布的宽高
 width = webgl.clientWidth;
 height = webgl.clientHeight;
 //生成渲染器对象(属性:抗锯齿效果为设置有效)
 renderer = new THREE.WebGLRenderer({antialias:true});
 //指定渲染器的高宽(和画布框大小一致)
 renderer.setSize(width, height );
 //将创建的canvas元素(此处的canvas元素为three.js创建)添加到html文档当中
 webgl.appendChild(renderer.domElement);
 //设置渲染器的清除色
 renderer.setClearColorHex(0xFFFFFF,1.0);
}

renderer=new THREE.WebGLRenderer({
antialias:true,//antialias:true/false是否开启反锯齿
precision:"highp",//precision:highp/mediump/lowp着色精度选择
alpha:true,//alpha:true/false是否可以设置背景色透明
premultipliedAlpha:false,//?
stencil:false,//?
preserveDrawingBuffer:true,//preserveDrawingBuffer:true/false是否保存绘图缓冲
maxLights:1//maxLights:最大灯光数
});

/*
*设置相机
*/
var camera;
function initCamera() {
 camera = new THREE.PerspectiveCamera(45,width/height,1,10000);
 //此处为设置透视投影的相机,默认情况下,相机的上方向为Y轴,右方向为X轴,沿着Z轴垂直朝里(视野角:fov; 纵横比:aspect; 相机离视最近的距离:near; 相机离视体积最远距离:far)
 camera.position.x = 400;//设置相机的位置坐标
 camera.position.y = 0;
 camera.position.z = 0;
 //设置相机的上为z轴方向
 camera.up.x = 0;
 camera.up.y = 0;
 camera.up.z = 1;
 //设置视野的中心坐标

 camera.lookAt({x:0, y:0, z:0});

/*
*设置场景,所有的元素只有在添加到场景当中之后才能够生效
*/
var scene;
function initScene() {
scene = new THREE.Scene();
}

 Three.js中可以设置 [点光源(Point Light)] [聚光灯(Spot Light)] [平行光源(Direction Light)],和 [环境光(Ambient Light)]。在一个场景中可以设置多个光源。 基本上,都是环境光和其他几种光源进行组合。 如果不设置环境光,那么光线照射不到的面会变得过于黑暗。

/*
*设置光源
*/
var light;
function initLight() {
 light = new THREE.DirectionalLight(0x0000FF,1.0,0);//设置平行光DirectionalLight
 light.position.set(50,50,50);//光源向量,即光源的位置

 //还可以添加多个光源,多行注释中即为添加2、3号光源
 /*light2 = new THREE.DirectionalLight(0xFF00CC,1.0,0);
 light2.position.set(0,50,0);
 light3 = new THREE.DirectionalLight(0x0000CC,1.0,0);
 light3.position.set(50,0,0);*/
 scene.add(light);//追加光源到场景
 /*scene.add(light2);
 scene.add(light3);*/
}

/*
*设置物体
*/
var cube=Array();
function initObject() {
for(var i=0;i<4;i++){
cube[i]=new THREE.Mesh(//mesh是three.js的一个类
new THREE.CubeGeometry(50,50,50),//形状 (宽 高 深度)
new THREE.MeshLambertMaterial({color:0x0000FF})//材质
);
scene.add(cube[i]);
cube[i].position.set(0,-120+80*i,0);
}
}

/*
*旋转
*/
var t=0;
function loop(){
t++;
renderer.clear();
cube[0].rotation.set(t/100,0,0);
cube[1].rotation.set(0,t/100,0); 
cube[2].rotation.set(0,0,t/100);
/*camera.position.x = 400*Math.cos(t/100);
camera.position.y = 400*Math.sin(t/200);
camera.position.z = 50*Math.cos(t/100);*/
camera.lookAt( {x:0, y:0, z:0 } );
renderer.render(scene,camera);
window.requestAnimationFrame(loop);
}

/*
*执行
*/
function threeStart() {
initThree();
initCamera();
initScene();
initLight();
initObject();
loop();
renderer.clear();
renderer.render(scene,camera);
}

Canvas画布

PerspectiveCamera

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐