• 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;

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

  • 相关阅读:
    Springboot + Atomikos + Druid + Mysql 实现JTA分布式事务
    JAVA生成一个二维数组,使中间元素不与相邻的9个元素相等,并限制每一个元素的个数
    java.net.UnknownHostException: lc001 未知的网络服务
    Maven 多模块引用版本的问题 java.lang.NoSuchMethodError
    Maven项目运行Junit测试用例 出现ClassNotFound
    CAS5.X 集群配置 初版
    调试CAS源码步骤
    openhtmltopdf 支持自定义字体、粗体
    Java HTML to PDF 支持SVG
    .Net 框架
  • 原文地址:https://www.cnblogs.com/sunqq/p/10401561.html
Copyright © 2020-2023  润新知