3D世界的组成
在计算机世界中,3D世界是由点组成,两个点能够组成一条直线,三个不在一条直线上的点就能够组成一个三角形面,无数三角形
面就能够组成各种形状的物体;我们通常称这种网络模型为Mesh模型;
1、点
在三维空间中的某一个点可以用一个坐标点来表示。一个坐标点有X,Y,Z三个分量构成;在three.js中,点可以在右手坐标系中表示;
空间几何中,点可以用一个向量来表示;
THREE.Vecotor3 = function(x,y,z){
this.x = x || 0;
this.y = y || 0;
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);
2、如何绘制一条线?
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; 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;
还有敲代码的时候一定要细心,如果出现问题可以查看谷歌控制台看报错;