美文网首页
THREE.js 快速入门教程

THREE.js 快速入门教程

作者: 圣_狒司机 | 来源:发表于2020-01-18 23:28 被阅读0次

    THREE.js 是javascript的一个三维库,Github网址
    https://github.com/mrdoob/three.js,官网https://threejs.org/

    这个项目的目的在于默认使用WebGL渲染器创建一个易于使用、轻量的三维库,这个库还提供Canvas2D、SVG 和CSS3D 支持。


    THREE.js

    用法

    1. 工程环境创建

    1. 编译器VScode;
    2. 安装npm

    2. 创建项目

    1. 基本网页文件index.html:
      写入 html:5 会自动补全全部的网页文件;
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        
        
        <link rel="stylesheet" href="main.css">
    </head>
    <body>
        
    </body>
    </html>
    

    不要看他多,你只要敲5个字母: html:5

    为了项目显示好看还得加个CSS文件,写入:

    body{
        margin: 0;
        padding: 0;
        box-sizing: border-box;
    }
    

    2. 导入

    从官网或者github下载最小库文件,在项目中引进库:
    在titile 空行的下方写入:

    <script src="js/three.min.js"></script>
    <script src="main.js"></script>
    

    3. 创建三大件:场景、相机、渲染器

    每个THREE.js项目都必须基于三大件:场景、相机、渲染器组成,你可以把他们封装成一个函数。

        var [scene,renderer,camera] = (function initSRC(){
            var scene = new THREE.Scene()
            scene.background = new THREE.Color(0x605050)
            scene.fog = new THREE.Fog(0x605050,10,100)
            var renderer = new THREE.WebGLRenderer()
            renderer.setSize( window.innerWidth, window.innerHeight)
            document.body.appendChild(renderer.domElement)
            var camera = new THREE.PerspectiveCamera( 75,window.innerWidth / window.innerHeight, 0.1, 1000 )
            camera.position.set(0,4,7)
            camera.lookAt(new THREE.Vector3(0,0,0))
            scene.add(camera)
            return [scene,renderer,camera]
        })()
    

    这是个取巧的方法,执行这个函数,能一次性得到三大件。

    4. 初始化辅助网格

        var grid = new THREE.GridHelper(200,80)
        scene.add(grid)
    

    初始化辅助网格,第二句添加进场景中。

    安装完liveserver插件后,按ctrl+shift+v 调出项目网页:

    场景

    是不是有那么点意思?

    5. 添加环境光源

        var ambint = new THREE.HemisphereLight(0xffffbb,0x080820)
        scene.add(ambint)
    

    6. 添加基础物体

    1. 球体

        var ball = new THREE.Mesh(new THREE.SphereGeometry(1,20,20),new THREE.MeshStandardMaterial({color:"skyblue"}))
        scene.add(ball)
    
    球体

    2. 多拿滋

        var torus = new THREE.Mesh(new THREE.TorusGeometry(1,0.5,20,20),new THREE.MeshStandardMaterial({color:"skyblue"}))
        scene.add(torus)
    
    多拿滋

    3. 全家福:

    3.1 CircleGeometry 圆

    new THREE.CircleGeometry(redius,segments,thetaStart,thetaLength)
    

    3.2 RingGeometry 扇形

    new THREE.RingGeometry()
    

    3.3 BoxGeometry 立方体

    new THREE.BoxGeometry(width,height,depth,widthSegment,heightSegment,depthSegment)
    

    3.4 CylinderGeometry 圆柱体

    new THREE.CylinderGeometry()
    

    3.5 TorusKnotGeometry 一个打结的圆环

    new THREE.TorusKnotGeometry()
    

    3.6 PolyhedronGeometry 多面体

    new THREE.PolyhedronGeometry(vertices,indices,radius,detail)
    
    IcoshahedronGeometry 正二十面体
    TetrahedronGeometry 正四面体
    OctahedronGeometry 正八面体
    DodecahedronGeometry 正十二面体

    3.7 ConvexGeometry 根据一组点创造一个凸包

    new THREE.ConvexGeometry(points)
    

    3.8 LatheGeometry由一条曲线创造一个旋转体

    new THREE.LatheGeometry(points,segments,phiStart,phiLength)
    

    3.9 ExtrudeGeometry 将一个二维图形拉伸成三维图形

    new THREE.ExtrudeGeometry(shapes,options)
    

    3.10 TubeGeometry 沿着一条曲线拉伸出一条管

    new THREE.TubeGeometry(new THREE.SplineCurve3(points),segments,radius,radiusSegments,closed)
    

    3.11 ParametricGeometry 根据一组等式创建几何体

    new THREE.ParametricGeometry(function,slices,stacks)
    
    f = function (u, v) {
                var r = 50;
    
                var x = Math.sin(u) * r;
                var z = Math.sin(v / 2) * 2 * r;
                var y = (Math.sin(u * 4 * Math.PI) + Math.cos(v * 2 * Math.PI)) * 2.8;
    
                return new THREE.Vector3(x, y, z);
            };
    

    3.12 TextGeometry 创建三维的文本

    new THREE.TextGeometry(text,options)
    

    7. 动态渲染场景

    其实这时你已经看见这些三维物体了,只要动态改变物体性质(位置、颜色、等等)它还可以渲染成动画,动画需要一个window新版函数,叫做
    requestAnimationFrame,他有个回调函数,一般是回调自身;

        function update(){
            renderer.render(scene,camera)
            requestAnimationFrame(update)
        }
        update()
    

    8. 杂项

    在JavaScript中使用类始终是很麻烦的事,你可以适当使用TypeScript封装一些常用类;
    创建main.ts文件,在terminal中输入:

    npm install -g typescript
    

    全局安装TypeScript;
    在项目中terminal输入:

    tsc --init
    

    用TypeScript编写项目,用vscode插件自动生成js文件。

    文件如下:

    ./
      inade.html
      main.css
      main.ts
      main.js
      three.js
      tsconfig.json
    

    随机颜色:

    Math.random()*0xffffff
    

    9. 本文使用的main.ts文件:

    window.onload = function(){
    
        window.addEventListener("resize",function(){
            renderer.setSize( window.innerWidth, window.innerHeight)
            camera.aspect = window.innerWidth / window.innerHeight
            camera.updateProjectionMatrix()
            })
    
        var [scene,renderer,camera] = (function initSRC(){
            var scene = new THREE.Scene()
            scene.background = new THREE.Color(0x605050)
            scene.fog = new THREE.Fog(0x605050,10,100)
            var renderer = new THREE.WebGLRenderer()
            renderer.setSize( window.innerWidth, window.innerHeight)
            document.body.appendChild(renderer.domElement)
            var camera = new THREE.PerspectiveCamera( 75,window.innerWidth / window.innerHeight, 0.1, 1000 )
            camera.position.set(0,4,7)
            camera.lookAt(new THREE.Vector3(0,0,0))
            scene.add(camera)
            return [scene,renderer,camera]
        })()
    
        var grid = new THREE.GridHelper(200,80)
        scene.add(grid)
        var ambint = new THREE.HemisphereLight(0xffffbb,0x080820)
        scene.add(ambint)
        var ball = new THREE.Mesh(new THREE.SphereGeometry(1,20,20),new THREE.MeshStandardMaterial({color:Math.random()*0xffffff}))
        scene.add(ball)
        ball.position.set(-3,0,0)
    
        var torus = new THREE.Mesh(new THREE.TorusGeometry(1,0.5,20,20),new THREE.MeshStandardMaterial({color:Math.random()*0xffffff,wireframe: true}))
        scene.add(torus)
        torus.position.set(3,0,0)
        renderer.render(scene,camera)
    
        function update(){
            renderer.render(scene,camera)
            requestAnimationFrame(update)
        }
        update()
    
    }
    
    
    基础物体.png

    提问或转载请联系作者:

    狒司机

    微信 411315698

    相关文章

      网友评论

          本文标题:THREE.js 快速入门教程

          本文链接:https://www.haomeiwen.com/subject/kbdlzctx.html