zoukankan      html  css  js  c++  java
  • 3.点线面后篇

    坐标系

    Threejs使用的是右手坐标系,这源于opengl默认情况下,也是右手坐标系。
    坐标系

    WebGL中的点线面

    线条的深入理解

    在Threejs中,一条线由点,材质和颜色组成。

    点由THREE.Vector3表示,Threejs中没有提供单独画点的函数,它必须被放到一个THREE.Geometry形状中,这个结构中包含一个数组vertices,这个vertices就是存放无数的点(THREE.Vector3)的数组。这个表示可以如下图所示:three.js向量

    点的存储方式

    为了绘制一条直线,首先我们需要定义两个点,如下代码所示:

    var p1 = new THREE.Vector3( -100, 0, 100 );
    
    var p2 = new THREE.Vector3( 100, 0, -100 );
    

    请大家思考一下,这两个点在坐标系的什么位置,然后我们声明一个THREE.Geometry,并把点加进入,代码如下所示:

    var geometry = new THREE.Geometry();

    geometry.vertices.push(p1);

    geometry.vertices.push(p2);

    geometry.vertices的能够使用push方法,是因为geometry.vertices是一个数组。这样geometry 中就有了2个点了。

    然后我们需要给线加一种材质,可以使用专为线准备的材质,THREE.LineBasicMaterial。

    最终我们通过THREE.Line绘制了一条线,如下代码所示:

    var line = new THREE.Line( geometry, material, THREE.LinePieces );

    ok,line就是我们要的线条了。
    6、画高中时深爱的坐标平面

    我还深爱着高中时的那个坐标平面,它勾起了我关于前排同学的细细长发的回忆…

    这个平面的效果如下所示:three.js画坐标系

    它横竖分别绘制了20条线段,在摄像机的照射下,就形成了这般模样。

    完整代码如下

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8">
            <title>网格线</title>
            <script src="../three.js"></script>
            <style type="text/css">
                div#canvas-frame {
                    border: none;
                    cursor: pointer;
                     100%;
                    height: 1000px;
                    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();
                    geometry.vertices.push( new THREE.Vector3( - 500, 0, 0 ) );
                    geometry.vertices.push( new THREE.Vector3( 500, 0, 0 ) );
    
                    for ( var i = 0; i <= 20; i ++ ) {
    
                        var line = new THREE.Line( geometry, new THREE.LineBasicMaterial( { color: 0x000000, opacity: 0.2 } ) );
                        line.position.z = ( i * 50 ) - 500;
                        scene.add( line );
    
    
                        var line = new THREE.Line( geometry, new THREE.LineBasicMaterial( { color: 0x000000, opacity: 0.2 } ) );
                        line.position.x = ( i * 50 ) - 500;
                        line.rotation.y = 90 * Math.PI / 180;//沿y轴旋转90du
                        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>
    
    

    学习的资料和源码我都共享到我的gitHub仓库中去了,大家有兴趣的可以去下载,欢迎foke,clone,加星星,也算是对我的一个鼓励吧

    three学习资料的github地址
    或者复制链接地址到浏览器
    https://github.com/kingder-c/LearnThree.js

    里面除了源码和笔记之外再document中还有我推荐的两本教材的电子书,希望能帮助到大家
    如果大家有更好的学习资料一欢迎提交的上面去供大家一起交流和学习,对大家发出的PR我一定及时接受

  • 相关阅读:
    js 使用${}解析变量代替++
    laravel 返回自定义错误
    Java集合之HashMap源码解析
    Java集合之ArrayList源码解析
    Java集合之LinkedList源码解析
    保证消息可靠性传输以及幂等性
    Java分布式系统---消息中间件
    Java中的日期与时间
    Java时区问题
    数据测试002:利用Jmeter推送测试数据(上)
  • 原文地址:https://www.cnblogs.com/zj-kingder/p/7381020.html
Copyright © 2011-2022 走看看