• Threejs入门教程


    一、本地搭建Threejs官方文档网站

    1.官网地址

    Githubhttps://github.com/mrdoob/three.js 

    我们可以直接下载压缩包并解压或使用 git clone

    若 github 过慢,则使用 gitee 对应镜像仓库:three.js: mrdoob/three.js 同步库

    2.目录解析

    3.启动方式

    在three.js项目根目录下执行如下命令,yarn可使用 npm install yarn -g 安装

    1. # 安装依赖
    2. yarn install
    3. # 启动项目
    4. yarn start

    浏览器访问:

    二、parcel搭建three.js开发环境

    1.简介

    目的:方便模块化进行three.js项目的学习和开发

    Parcel官网:Building a web app with Parcel | Parcel 中文网

    2.部署步骤

    1.为项目创建一个目录,并在项目根目录下执行

    yarn add --dev parcel

    创建src目录,并在其下创建index.html

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8" />
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    7. <title>Documenttitle>
    8. <link rel="stylesheet" href="./assets/css/style.css" />
    9. head>
    10. <body>
    11. <script src="./main/main.js" type="module">script>
    12. body>
    13. html>

    style.css

    1. * {
    2. margin: 0;
    3. padding: 0;
    4. }
    5. body {
    6. background-color: skyblue;
    7. }

    main.js

    1. import * as THREE from "three";
    2. // console.log(THREE);
    3. // 目标:了解three.js最基本的内容
    4. // 1、创建场景
    5. const scene = new THREE.Scene();
    6. // 2、创建相机
    7. const camera = new THREE.PerspectiveCamera(
    8. 75,
    9. window.innerWidth / window.innerHeight,
    10. 0.1,
    11. 1000
    12. );
    13. // 设置相机位置
    14. camera.position.set(0, 0, 10);
    15. scene.add(camera);
    16. // 添加物体
    17. // 创建几何体
    18. const cubeGeometry = new THREE.BoxGeometry(1, 1, 1);
    19. const cubeMaterial = new THREE.MeshBasicMaterial({ color: 0xffff00 });
    20. // 根据几何体和材质创建物体
    21. const cube = new THREE.Mesh(cubeGeometry, cubeMaterial);
    22. // 将几何体添加到场景中
    23. scene.add(cube);
    24. // 初始化渲染器
    25. const renderer = new THREE.WebGLRenderer();
    26. // 设置渲染的尺寸大小
    27. renderer.setSize(window.innerWidth, window.innerHeight);
    28. // console.log(renderer);
    29. // 将webgl渲染的canvas内容添加到body
    30. document.body.appendChild(renderer.domElement);
    31. // 使用渲染器,通过相机将场景渲染进来
    32. renderer.render(scene, camera);

    3.打包脚本

    1. {
    2. "name": "ch01",
    3. "version": "1.0.0",
    4. "description": "",
    5. "main": "index.js",
    6. "scripts": {
    7. "dev": "parcel src/index.html",
    8. "build": "parcel build src/index.html"
    9. },
    10. "author": "",
    11. "license": "ISC",
    12. "devDependencies": {
    13. "parcel": "^2.4.1"
    14. },
    15. "dependencies": {
    16. "dat.gui": "^0.7.9",
    17. "gsap": "^3.10.3",
    18. "three": "^0.139.2"
    19. }
    20. }
    1. # 安装依赖
    2. yarn install
    3. # 运行项目
    4. yarn dev

    访问如下网址即可:

    三、基本概念 

    1.三大基本概念:场景、相机、渲染器 

    1.创建场景

    1. // 1、创建场景
    2. const scene = new THREE.Scene();

    2.创建相机

    1. // 2、创建相机
    2. const camera = new THREE.PerspectiveCamera(
    3. 75,
    4. window.innerWidth / window.innerHeight,
    5. 0.1,
    6. 1000
    7. );
    8. // 设置相机位置
    9. camera.position.set(0, 0, 10);
    10. scene.add(camera);

    three.js里有几种不同的相机,在这里,我们使用的是PerspectiveCamera(透视摄像机)。

    第一个参数是视野角度(FOV)。视野角度就是无论在什么时候,你所能在显示器上看到的场景的范围,它的单位是角度(与弧度区分开)。

    第二个参数是长宽比(aspect ratio)。 也就是你用一个物体的宽除以它的高的值。比如说,当你在一个宽屏电视上播放老电影时,可以看到图像仿佛是被压扁的。

    接下来的两个参数是近截面(near)和远截面(far)。 当物体某些部分比摄像机的远截面远或者比近截面近的时候,该这些部分将不会被渲染到场景中。或许现在你不用担心这个值的影响,但未来为了获得更好的渲染性能,你将可以在你的应用程序里去设置它。

    下图椎体就是上面设置视野角度、长宽比、近截面和远截面的演示的相机透视椎体。

     3.渲染器

    1. // 初始化渲染器
    2. const renderer = new THREE.WebGLRenderer();
    3. // 设置渲染的尺寸大小
    4. renderer.setSize(window.innerWidth, window.innerHeight);
    5. // console.log(renderer);
    6. // 将webgl渲染的canvas内容添加到body
    7. document.body.appendChild(renderer.domElement);
    8. // 使用渲染器,通过相机将场景渲染进来
    9. renderer.render(scene, camera);

    除了创建一个渲染器的实例之外,我们还需要在我们的应用程序里设置一个渲染器的尺寸。比如说,我们可以使用所需要的渲染区域的宽高,来让渲染器渲染出的场景填充满我们的应用程序。因此,我们可以将渲染器宽高设置为浏览器窗口宽高。对于性能比较敏感的应用程序来说,你可以使用setSize传入一个较小的值,例如window.innerWidth/2和window.innerHeight/2,这将使得应用程序在渲染时,以一半的长宽尺寸渲染场景。

    接下来将renderer(渲染器)的dom元素(renderer.domElement)添加到我们的HTML文档中。渲染器用来显示场景给我们看的元素。

    最后就是对将相机对场景进行拍照渲染啦。这一句就可以将画面渲染到canvas上显示出来

    4.加入立方体

    1. // 添加物体
    2. // 创建几何体
    3. const cubeGeometry = new THREE.BoxGeometry(1, 1, 1);
    4. const cubeMaterial = new THREE.MeshBasicMaterial({ color: 0xffff00 });
    5. // 根据几何体和材质创建物体
    6. const cube = new THREE.Mesh(cubeGeometry, cubeMaterial);
    7. // 将几何体添加到场景中
    8. scene.add(cube);

    要创建一个立方体,我们需要一个BoxGeometry(立方体)对象. 这个对象包含了一个立方体中所有的顶点(vertices)和面(faces)。

    接下来,对于这个立方体,我们需要给它一个材质,来让它有颜色。这里我们使用的是MeshBasicMaterial。所有的材质都存有应用于他们的属性的对象。为了简单起见,我们只设置一个color属性,值为0x00ff00,也就是绿色。这里和CSS或者Photoshop中使用十六进制(hex colors)颜色格式来设置颜色的方式一致。

    第三步,我们需要一个Mesh(网格)。 网格包含一个几何体以及作用在此几何体上的材质,我们可以直接将网格对象放入到我们的场景中,并让它在场景中自由移动。

    默认情况下,当我们调用scene.add()的时候,物体将会被添加到(0,0,0)坐标。但将使得摄像机和立方体彼此在一起。为了防止这种情况的发生,我们只需要将摄像机稍微向外移动一些即可。

    汇总代码 main.js

    1. import * as THREE from "three";
    2. // console.log(THREE);
    3. // 目标:了解three.js最基本的内容
    4. // 1、创建场景
    5. const scene = new THREE.Scene();
    6. // 2、创建相机
    7. const camera = new THREE.PerspectiveCamera(
    8. 75,
    9. window.innerWidth / window.innerHeight,
    10. 0.1,
    11. 1000
    12. );
    13. // 设置相机位置
    14. camera.position.set(0, 0, 10);
    15. scene.add(camera);
    16. // 添加物体
    17. // 创建几何体
    18. const cubeGeometry = new THREE.BoxGeometry(1, 1, 1);
    19. const cubeMaterial = new THREE.MeshBasicMaterial({ color: 0xffff00 });
    20. // 根据几何体和材质创建物体
    21. const cube = new THREE.Mesh(cubeGeometry, cubeMaterial);
    22. // 将几何体添加到场景中
    23. scene.add(cube);
    24. // 初始化渲染器
    25. const renderer = new THREE.WebGLRenderer();
    26. // 设置渲染的尺寸大小
    27. renderer.setSize(window.innerWidth, window.innerHeight);
    28. // console.log(renderer);
    29. // 将webgl渲染的canvas内容添加到body
    30. document.body.appendChild(renderer.domElement);
    31. // 使用渲染器,通过相机将场景渲染进来
    32. renderer.render(scene, camera);

    四、轨道控制器

    1.创建轨道控制器

    const controls = new OrbitControls(camera, renderer.domElement);
    

    两个参数: 

    相机,让哪一个相机围绕目标运动。默认目标是原点。立方体在原点处。

    渲染的画布dom对象,用于监听鼠标事件控制相机的围绕运动。

    2.根据控制器更新画面 

    1. function render(){
    2. //如果后期需要控制器带有阻尼效果,或者自动旋转等效果,就需要加入controls.update()
    3. renderer.renderer(scene,camera)
    4. requestAnimationFrame(render)
    5. }

    因为控制器监听鼠标事件之后,要根据鼠标的拖动,来控制相机围绕目标运动,并根据运动之后的效果,显示出画面来。为了保证画面流畅渲染,选择使用请求动画帧requestAnimationFrame,在屏幕渲染下一帧画面时触发回调函数来执行画面的渲染。 

    requestAnimationFrame
    是HTML5的新特性,区别于setTimeout和setInterval。requestAnimationFrame比后两者精确,采用系统时间间隔,保持最佳绘制效率,不会因为间隔时间过短,造成过度绘制,增加开销;也不会因为间隔时间太长,使动画卡顿不流畅,让各种网页动画效果能够有一个统一的刷新机制,从而节省系统资源,提高系统性能,改善视觉效果。

    requestAnimationFrame是由浏览器专门为动画提供的API,在运行时浏览器会自动优化方法的调用,并且如果页面不是激活状态下的话,动画会自动暂停,有效节省了CPU开销。 

    汇总代码 main.js

    1. import * as THREE from "three";
    2. // 导入轨道控制器
    3. import {OrbitControls} from "three/examples/jsm/controls/OrbitControls"
    4. // console.log(THREE);
    5. // 目标:了解three.js最基本的内容
    6. // 1、创建场景
    7. const scene = new THREE.Scene();
    8. // 2、创建相机
    9. const camera = new THREE.PerspectiveCamera(
    10. 75,
    11. window.innerWidth / window.innerHeight,
    12. 0.1,
    13. 1000
    14. );
    15. // 设置相机位置
    16. camera.position.set(0, 0, 10);
    17. scene.add(camera);
    18. // 添加物体
    19. // 创建几何体
    20. const cubeGeometry = new THREE.BoxGeometry(1, 1, 1);
    21. const cubeMaterial = new THREE.MeshBasicMaterial({ color: 0xffff00 });
    22. // 根据几何体和材质创建物体
    23. const cube = new THREE.Mesh(cubeGeometry, cubeMaterial);
    24. // 将几何体添加到场景中
    25. scene.add(cube);
    26. // 初始化渲染器
    27. const renderer = new THREE.WebGLRenderer();
    28. // 设置渲染的尺寸大小
    29. renderer.setSize(window.innerWidth, window.innerHeight);
    30. // console.log(renderer);
    31. // 将webgl渲染的canvas内容添加到body
    32. document.body.appendChild(renderer.domElement);
    33. // 使用渲染器,通过相机将场景渲染进来
    34. // renderer.render(scene, camera);
    35. const controls = new OrbitControls(camera, renderer.domElement);
    36. const AxesHelper = new THREE.AxesHelper(5);
    37. scene.add(AxesHelper);
    38. function render(){
    39. renderer.render(scene,camera)
    40. requestAnimationFrame(render)
    41. }
    42. render()

    文章参考:Threejs入门课程最全教程文档

    注意:上面这篇文章参考的教程文档已经由原作者下架(可能是由于比较过时),如果大家想要更深入学习 Threejs 的话,可以移步原作者的 2023 最新 Threejs 教程视频:2023全新Threejs快速入门课程【带你突破前端天花板】_哔哩哔哩_bilibili

  • 相关阅读:
    C++基础——对象模型和this指针
    STM32MP157A驱动开发 | 04 - Linux DRM显示驱动框架
    【工程应用五】 opencv中linemod模板匹配算法诸多疑惑和自我解读。
    网络拓扑图怎么画最好?
    Python 教程之控制流(11)无限迭代器
    持续的敏捷转型--我们的经验
    使用Python将时间列数据处理到当周星期三
    Spring ioc aop
    Day88.七牛云: 房源图片、用户头像上传
    Pytorch转TensorRT相关代码及其报错解决方法
  • 原文地址:https://blog.csdn.net/m0_63748493/article/details/127561828