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;
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 οnlοad="threeStart();">
<div id="canvas-frame"></div>
</body>
</html>
总结:THREE.LinePieces已经不再使用,更改为THREE.LineSegments;
还有敲代码的时候一定要细心,如果出现问题可以查看谷歌控制台看报错;