3D世界的组成javascript
在计算机世界中,3D世界是由点组成,两个点可以组成一条直线,三个不在一条直线上的点就可以组成一个三角形面,无数三角形css
面就可以组成各类形状的物体;咱们一般称这种网络模型为Mesh模型;html
一、点java
在三维空间中的某一个点能够用一个坐标点来表示。一个坐标点有X,Y,Z三个份量构成;在three.js中,点能够在右手坐标系中表示;canvas
空间几何中,点能够用一个向量来表示;网络
THREE.Vecotor3 = function(x,y,z){app
this.x = x || 0;框架
this.y = y || 0;dom
this.z = z || 0; //当z=null或undefined时,this.z = 0;编辑器
}
在上述函数中THREE是Three.js引擎中的一个全局变量;而Vector3是定义在THREE下面的一个类;
结合上面的函数该如何定义一个点呢?
第一种方法: var point1 = new THREE.Vectors3(4,8,9);
第二种方法: var point2 = new THREE.Vectors(); point2.set(4,8,9);
二、如何绘制一条线?
1)首先,咱们先声明一个几何体geometry,以下:
var geometry = new THREE.Geometry();//几何体里有有一个vertices变量,能够用来存放点;
2)定义一种线条的材质,使用THREE.LineBasicMaterial类型来定义,它接受一个集合做为参数,其原型以下:
LineBasicMaterial(parameters)
parameters是一个定义材质外观的对象,它包含多个属性来定义材质,这些属性是:
Color: 线条的颜色,用16进制来表示,默认的颜色是白色;
LineWidth: 线条的宽度,默认是1个单位宽度;
LineCap :线条两端的外观,,默认是圆角端点,当线条较粗的时候才能看得出效果;
LineJoin: 两个线条的链接点处的外观,默认是“round”,表示圆角;
VertexColors:定义线条材质是否使用顶点颜色,这是一个布尔值;(线条各部分的颜色会根据顶点的颜色来进行插值);
Fog: 定义材质的颜色是否受全局雾效的影响;
3)接下来,定义两种颜色,分别表示线条两个端点的颜色;
var color1 = new THREE.Color( 0x444444 );
var color2 = new THREE.Color( 0xFF0000 );
4)定义2个顶点的位置,并放到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);
5) 为4中定义的2个顶点,设置不一样的颜色,代码以下:
geometry.colors.push(color1,color2); //geometry中colors表示顶点的颜色,必须材质中vertexColors等于THREE.VertexColors时,
颜色值才有效;若是vertexColors等于THREE.NOColors时,颜色就没有效果了,而后就会去材质中color的值;
6) 定义一条线
定义线条,使用THREE.Line类,代码以下:
var line = new THREE.Line( geometry,material,THREE.LinePieces);
最后,将这条线条加入场景中,scene.add(line);
若是你们想练习一下,可使用编辑器敲下面代码;
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Three框架</title> <script src="js/Three.js"></script> <style type="text/css"> div#canvas-frame { border: none; cursor: pointer; width: 100%; height: 600px; background-color: #EEEEEE; } </style> <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({ x : 0, y : 0, z : 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() { var geometry = new THREE.Geometry(); var material = new THREE.LineBasicMaterial( { vertexColors: true } ); var color1 = new THREE.Color( 0x444444 ), color2 = new THREE.Color( 0xFF0000 ); // 线的材质能够由2点的颜色决定 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.LinePieces ); scene.add(line); } function threeStart() { initThree(); initCamera(); initScene(); initLight(); initObject(); renderer.clear(); renderer.render(scene, camera); } </script> </head> <body onload="threeStart();"> <div id="canvas-frame"></div> </body> </html>
总结:THREE.LinePieces已经再也不使用,更改成THREE.LineSegments;
还有敲代码的时候必定要细心,若是出现问题能够查看谷歌控制台看报错;