Three.js 零基础保姆级教程

文章目录


一、Three.js 是什么?

1.介绍

Three.js是基于原生WebGL封装运行的三维引擎,在所有WebGL引擎中,Three.js是国内文资料最多、使用最广泛的三维引擎。

2.环境配置

js作为一个跨端语言,可作为IDE的软件有很多,笔者这里使用的是 websotrm,它的好处是改动一处便可直接显示。

在此给出Three.js的官方GitHub库,[Three.js-GitHub](https://github.com/mrdoob/three.js),请提前下载

3.WebGL和Three.js学习顺序?

引用自Three教程
如果你急于要实现一个Web3D功能,时间有限,也没有图形学基础,个人建议直接学习先Three.js即可,以后想深入掌握,可以学习原生WebGL和图形学相关知识。

如果时间比较充足,又希望有更大的成长空间,学习底层原生WebGL肯定是必要的,可以WebGL和Threejs结合着学习,顺序也不是非常重要。

二、麻雀虽小而五脏俱全的例子

1.引入资源包

<head>
    <meta charset="UTF-8">
    <title>第一个three.js文件_WebGL三维场景</title>
    <style>
        body {
            margin: 0;
            overflow: hidden;
            /* 隐藏body窗口区域滚动条 */
        }
    </style>
    <!--    引入three.js三维引擎-->
    <script src="./three.js-r95/build/three.js"></script>
    <!--    引入OrbitControls.js鼠标操作三维场景-->
    <script src="./three.js-r95/examples/js/controls/OrbitControls.js"></script>


</head>

2.创建场景和添加2个以上的3D对象

    /**
     * 创建场景对象Scene
     */
    var scene = new THREE.Scene();

    /**
     * 创建网格模型,并添加到场景
     */
    var geometry = new THREE.BoxGeometry(25, 50, 50); //创建一个立方体几何对象Geometry
    var material = new THREE.MeshLambertMaterial({
        color: 0xff00ff,  //颜色 16进制
        opacity:0.9,      //透明度 0-1
        transparent:true, //开启透明度,默认关闭
        wireframe:false   //线框,默认关闭
    }); //材质对象Material
    var mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh
    scene.add(mesh); //网格模型添加到场景中

    var geometry2 = new THREE.BoxGeometry(25, 50, 50); //创建一个球体几何对象
    var material2 = new THREE.MeshLambertMaterial({
        color: 0xffffff,
        opacity:0.9,      //透明度 0-1
        transparent:true  //开启透明度
    }); //材质对象Material2
    var mesh2 = new THREE.Mesh(geometry2,material2)
    mesh2.translateX(-100);
    mesh2.translateZ(-30);
    // mesh2.translateY(30); //球体网格模型沿Y轴正方向平移
    scene.add(mesh2)

(可选)3.添加辅助坐标系

    /**
     * 辅助坐标系  参数1000表示坐标系大小
     */
    var axisHelper = new THREE.AxisHelper(1000);
    scene.add(axisHelper)

4.光源和相机设置

    /**
     * 光源设置
     */
        //点光源
    var point = new THREE.PointLight(0xfffffff);
    point.position.set(100, 100, 100); //点光源位置
    scene.add(point); //点光源添加到场景中
    //环境光
    var ambient = new THREE.AmbientLight(0x444444);
    scene.add(ambient);


    /**
     * 相机设置
     */
    var width = window.innerWidth; //窗口宽度
    var height = window.innerHeight; //窗口高度
    var k = width / height; //窗口宽高比
    var s = 100; //三维场景显示范围控制系数,系数越大,显示的范围越大
    //创建相机对象
    // var camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000);
    var camera = new THREE.PerspectiveCamera( 45, width / height, 1, 1000 );
    camera.position.set(200, 0, 0); //设置相机位置
    camera.lookAt(scene.position); //设置相机方向(指向的场景对象)position

5.渲染得到结果

    /**
     * 创建渲染器对象
     */
    var renderer = new THREE.WebGLRenderer();
    renderer.setSize(width, height);//设置渲染区域尺寸
    renderer.setClearColor(0xb9d3ff, 1); //设置背景颜色
    document.body.appendChild(renderer.domElement); //body元素中插入canvas对象

    function render() {
        console.log(camera.position)
        renderer.render(scene,camera);//执行渲染操作
    }
    render();
    var controls = new THREE.OrbitControls(camera,renderer.domElement);//创建控件对象
    controls.addEventListener('change', render);//监听鼠标、键盘事件

结果图如下:
Three.js 零基础保姆级教程

总结及完整源码

以上就是今天要讲的内容,本文仅仅简单介绍了Three.js的使用。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>第一个three.js文件_WebGL三维场景</title>
    <style>
        body {
            margin: 0;
            overflow: hidden;
            /* 隐藏body窗口区域滚动条 */
        }
    </style>
    <!--    引入three.js三维引擎-->
    <script src="./three.js-r95/build/three.js"></script>
    <!--    引入OrbitControls.js鼠标操作三维场景-->
    <script src="./three.js-r95/examples/js/controls/OrbitControls.js"></script>


</head>

<body>
<script>
    /**
     * 创建场景对象Scene
     */
    var scene = new THREE.Scene();

    /**
     * 创建网格模型,并添加到场景
     */
    var geometry = new THREE.BoxGeometry(25, 50, 50); //创建一个立方体几何对象Geometry
    var material = new THREE.MeshLambertMaterial({
        color: 0xff00ff,  //颜色 16进制
        opacity:0.9,      //透明度 0-1
        transparent:true, //开启透明度,默认关闭
        wireframe:false   //线框,默认关闭
    }); //材质对象Material
    var mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh
    scene.add(mesh); //网格模型添加到场景中

    var geometry2 = new THREE.BoxGeometry(25, 50, 50); //创建一个球体几何对象
    var material2 = new THREE.MeshLambertMaterial({
        color: 0xffffff,
        opacity:0.9,      //透明度 0-1
        transparent:true  //开启透明度
    }); //材质对象Material2
    var mesh2 = new THREE.Mesh(geometry2,material2)
    mesh2.translateX(-100);
    mesh2.translateZ(-30);
    // mesh2.translateY(30); //球体网格模型沿Y轴正方向平移
    scene.add(mesh2)

    /**
     * 辅助坐标系  参数1000表示坐标系大小
     */
    var axisHelper = new THREE.AxisHelper(1000);
    scene.add(axisHelper)

    /**
     * 光源设置
     */
        //点光源
    var point = new THREE.PointLight(0xfffffff);
    point.position.set(100, 100, 100); //点光源位置
    scene.add(point); //点光源添加到场景中
    //环境光
    var ambient = new THREE.AmbientLight(0x444444);
    scene.add(ambient);


    /**
     * 相机设置
     */
    var width = window.innerWidth; //窗口宽度
    var height = window.innerHeight; //窗口高度
    var k = width / height; //窗口宽高比
    var s = 100; //三维场景显示范围控制系数,系数越大,显示的范围越大
    //创建相机对象
    // var camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000);
    var camera = new THREE.PerspectiveCamera( 45, width / height, 1, 1000 );
    camera.position.set(200, 0, 0); //设置相机位置
    camera.lookAt(scene.position); //设置相机方向(指向的场景对象)position

    /**
     * 创建渲染器对象
     */
    var renderer = new THREE.WebGLRenderer();
    renderer.setSize(width, height);//设置渲染区域尺寸
    renderer.setClearColor(0xb9d3ff, 1); //设置背景颜色
    document.body.appendChild(renderer.domElement); //body元素中插入canvas对象

    function render() {
        console.log(camera.position)
        renderer.render(scene,camera);//执行渲染操作
    }
    render();
    var controls = new THREE.OrbitControls(camera,renderer.domElement);//创建控件对象
    controls.addEventListener('change', render);//监听鼠标、键盘事件
</script>
</body>

</html>
上一篇:解决three加载 GLTF模型材质丢失造成发黑的问题。


下一篇:Three.js中使用材质覆盖属性