什么是Three.js

官方文档
Three.js是基于原生WebGL封装运行的三维引擎,Three.js是一个3D JavaScript库

WebGL(Web Graphics Library:3D绘图协议):

是一种在网页上渲染3D图形的API,允许把js和🤔openGL结合起来,webGL可以为html5的😉canvas提供硬件3D加速器,
1.webgl是一种应用于前端的绘图协议
2.webgl以html为框架,结合opengl + js开发
3.直接调用本机的gpu进行3d硬件加速

是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)
Canvas API(画布)是在HTML5中新增的标签用于在网页实时生成图像,并且可以操作图像内容,基本上它是一个可以用JavaScript操作的位图(bitmap)

threejs三剑客

在threejs中,渲染一个3D世界的必要因素是场景(scene),相机(camera),渲染器(renderer)

场景是一个三维空间,所有的物品的容器,相当于世界,我们创建的所有光源等都必须添加到场景中生效
相机决定场景中哪个角度的景色会显示出来
渲染器决定了渲染的结果因该话在页面上的什么元素

Threejs组成部分

three.js 的一个简单思维导图(拍戏现场)🎬:
Scene:场景,用于放置和组织 3D 对象的场所(空间场地)🏡
Camera:相机,用于捕捉场景的图像(摄像机)📷
Mesh:网格,由几何体和材质组成,是可以放入场景的 3D 对象(演员)🕵️
Geometry:几何体,用于描述 3D 对象的形状(演员外貌)👤
Material:材质,用于描述 3D 对象的外观(演员服饰)👚
这些部分相互协作,在浏览器中创建和渲染 3D 图形。🛠️
Renderer:渲染器,用于将场景的图像渲染到浏览器的 Canvas 中(显示器)🖥️
在这里插入图片描述

threejs创建步骤

1.创建场景

//创建场景
var scene = new THREE.Scene()
//相机设置为世界坐标原点
var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);

2.创建几何对象

//创建几何体
var geometry = new THREE.BoxGeometry(1,1,1);//矩形几何体

3.创建材质对象

//创建材质
var material = new THREE.MeshBasicMaterial({color:0xffff00});

4.创建网格模型 (几何体,材质,传入网格模型实例对象中,网格模型add入场景中)

var cube = new THREE.Mesh(geometry,material);//网格模型
cube.position.set(0,0,10);//设置物体的位置,正前方10米
scene.add(cube);//添加物体

5.点光源设置

//点光源
var point = new THREE.PointLight(0xffffff);
//点光源位置
point.position.set(400,200,300);
//点光源添加到场景中
scene.add(point);

6.环境光源设置

//环境光源
var ambient = new THREE.AmbientLight(0x444444);
scene.add(ambient);

7.相机设置

var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.set(0, 0, 0);//设置相机三维坐标

8.创建渲染器

var renderer = new THREE.WebGLRenderer();//canvas渲染器

9.执行渲染,(将场景和相机)放入render.remder(x,y)

//将渲染好的canvas追加到dom
document.body.appendChild(renderer.domElement); 
renderer.render(scene, camera);//开始渲染

案例

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="http://www.yanhuangxueyuan.com/versions/threejsR92/build/three.js"></script>
    <script src="http://www.yanhuangxueyuan.com/threejs/examples/js/controls/OrbitControls.js"></script>
    <script src="http://www.yanhuangxueyuan.com/threejs/examples/js/loaders/GLTFLoader.js"></script>
    <title>Document</title>
</head>

<body>
    <div id="webgl"></div>
</body>

</html>
<script>
    var scene = new THREE.Scene();
    var axes = new THREE.AxesHelper(50);//添加辅助坐标系
    scene.add(axes);
    //================================地面================================================//
    var plane = new THREE.PlaneGeometry(150, 50);
    var materialPlane = new THREE.MeshLambertMaterial({
        color: 0xcccccc
    });
    var planeMesh = new THREE.Mesh(plane, materialPlane);
    planeMesh.rotation.x = -0.5 * Math.PI; //沿x轴翻转90°,即为展平效果
    planeMesh.position.set(0, 0, 0);

    scene.add(planeMesh);

    //=================================加载模型==================================================//
    initModel();
    async function initModel() {
        let glb = await loadGlb();
        glb.position.set(10, 4, 0);
        scene.add(glb);
    }
    function loadGlb() {
        return new Promise((resolve, reject) => {
            var loader = new THREE.GLTFLoader();
            loader.setCrossOrigin('Anonymous');//跨域问题
            loader.load('./train.glb', (glb) => {
                console.log('glb>>>', glb);
                resolve(glb.scene);
            }, undefined, (error) => {

                console.error(error);
                reject(error);

            });
        });
    }

    //=======================================光源===================================================//
    scene.add(new THREE.AmbientLight(0x444444));//环境光,可以看到所有物体
    var pointLight = new THREE.PointLight(0xffffff);//点光源
    pointLight.position.set(20, 30, 20);
    scene.add(pointLight);


    //=============================相机=============================================//
    var camera = new THREE.PerspectiveCamera(45, 2, 0.1, 2000);
    camera.position.set(50, 20, 0);
    camera.lookAt(scene.position);


    /**
     * 创建渲染器对象
     */
    var renderer = new THREE.WebGLRenderer({
        antialias: true //消除锯齿
    });

    renderer.setSize(1000, 500);
    renderer.setClearColor(0xb9d3ff, 1);

    renderer.render(scene, camera);
    var cont = document.getElementById('webgl');
    cont.appendChild(renderer.domElement);


    //增加鼠标拾取效果
    var controls = new THREE.OrbitControls(camera, renderer.domElement);
    controls.addEventListener('change', () => {
        renderer.render(scene, camera);
    });


</script>

欢迎留言探讨

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐