WebGL2 ---点,线,面的学习(1)

          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;

还有敲代码的时候一定要细心,如果出现问题可以查看谷歌控制台看报错;

原文地址:https://www.cnblogs.com/sunqq/p/10401561.html