• 主页
  • 归档
  • 分类
  • 照片墙
所有文章 友情链接 关于我

  • 主页
  • 归档
  • 分类
  • 照片墙
  1. 1. 页面结构
  2. 2. Hello World
    1. 2.1. 添加多个几何体
    2. 2.2. 循环渲染
  3. 3. 场景控制
  4. 4. 辅助坐标系
  5. 5. 材质与光源

Three.js初见(1)

2022-04-03 10:54:35
总字数 1.1k
预计阅读时间 4 分钟

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

页面结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title>Three.js DEMO</title>
<style>
body { margin: 0; }
canvas { width: 100%; height: 100% }
</style>
</head>
<body>
<script src="./js/lib/three.js"></script>
<script src="./js/index.js"></script>
</body>
</html>

在脚手架项目当中
也可以使用npm install three来添加依赖

Hello World

index.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
(function(){
// 创建场景
const scene = new THREE.Scene()

// 创建相机
// 1.视野角度 2.长宽比 3.远剪切面 4.近剪切面
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)

// 创建WebGL渲染器
const renderer = new THREE.WebGLRenderer()
renderer.setSize(window.innerWidth, window.innerHeight)
// 将canvas添加到页面当中
document.body.appendChild(renderer.domElement)

// 创建一个立方体
const geometry = new THREE.BoxGeometry(1, 1, 1)
// 创建材质
const material = new THREE.MeshBasicMaterial({ color: 0x92d667 })
// 创建网格, 可以将材质和立方体放入其中
// 网格可以直接放入场景中, 并让它在场景中自由移动
const cube = new THREE.Mesh(geometry, material)
scene.add(cube)

// 将摄像机向外移动一些 防止与物体重叠
camera.position.z = 5

// 使用渲染器 渲染到场景当中
renderer.render(scene, camera)
})()

添加到场景中的几何体默认位于场景的坐标原点(0, 0, 0)

添加多个几何体

1
2
3
4
5
6
// 圆柱网格模型
const geometry2 = new THREE.CylinderGeometry( 8, 8, 8, 100 )
const material2 = new THREE.MeshBasicMaterial({ color: 0x92d667 })
const mesh2 = new THREE.Mesh(geometry2, material2)
mesh2.translateY(20) // 向Y轴正方向移动20
scene.add(mesh2)

为防止几何体重叠无法看到, 可以调整网格的位置

循环渲染

上面的代码, 已经可以显示出一个立方体
如果要让它有一个动画效果
需要改变网格的旋转
并且进行循环渲染

1
2
3
4
5
6
7
8
// 循环渲染
function animate() {
requestAnimationFrame(animate)
cube.rotation.x += 0.01
cube.rotation.y += 0.01
renderer.render(scene, camera)
}
animate()

requestAnimationFrame主要的好处是当前页面隐藏时不会进行渲染
如果是使用定时器
那么它在后台也会一直执行, 占用的资源比较多
其次是它执行的频率由屏幕刷新率决定, 效果可以更加流畅

场景控制

要使用鼠标或键盘控制三维场景, 可以使用OrbitControls控件
首先引入它

1
<script src="./js/lib/OrbitControls.js"></script>

调用方式

1
2
3
4
5
6
// 创建控件对象
const controls = new THREE.OrbitControls(camera, renderer.domElement)
// 监听鼠标、键盘事件
controls.addEventListener('change', function(){
renderer.render(scene, camera)
})

场景操作

  • 缩放:滚动—鼠标中键
  • 旋转:拖动—鼠标左键
  • 平移:拖动—鼠标右键

如果代码中通过requestAnimationFrame实现渲染器渲染方法render的周期性调用,当通过OrbitControls操作改变相机状态的时候,没必要在通过controls.addEventListener('change', render)监听鼠标事件调用渲染函数,因为requestAnimationFrame就会不停的调用渲染函数。

辅助坐标系

为了方便调试预览threejs提供了一个辅助三维坐标系AxesHelper

1
2
3
// 辅助坐标系  参数代表轴的线段长度,可以根据场景大小去设置
const axesHelper = new THREE.AxesHelper(100);
scene.add(axesHelper);

辅助坐标系

红色代表 X 轴, 绿色代表 Y 轴, 蓝色代表 Z 轴

材质与光源

除了基本的材质类型之外, three还提供了多种材质效果

材质类型功能
MeshBasicMaterial基础网格材质,不受光照影响的材质
MeshLambertMaterialLambert网格材质,与光照有反应,漫反射
MeshPhongMaterial高光Phong材质,与光照有反应
MeshStandardMaterialPBR物理材质,相比较高光Phong材质可以更好的模拟金属、玻璃等效果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 创建一个球体
const geometry1 = new THREE.SphereGeometry(6, 40, 40)
const material1 = new THREE.MeshPhongMaterial({
color: 0x0000ff,
specular: 0x4488ee, // 高光颜色
shininess: 12, // 高亮程度
})
const mesh1 = new THREE.Mesh(geometry1, material1)
scene.add(mesh1)

// 创建一个圆柱
const geometry2 = new THREE.CylinderGeometry( 8, 8, 8, 100 )
const material2 = new THREE.MeshLambertMaterial({
color: 0xffffff,
})
const mesh2 = new THREE.Mesh(geometry2, material2)
mesh2.translateY(20) // 向Y轴正方向移动20
scene.add(mesh2)

MeshLambertMaterial和MeshPhongMaterial都是对光照有反应的
但是此时我们还需要添加一个光源, 才能看到效果

1
2
3
4
// 点光源
const pointLight = new THREE.PointLight(0xffffff)
pointLight.position.set(100, 100, 0) // 点光源位置
scene.add(pointLight) // 点光源添加到场景中

材质与光源

  • 前端
  • Three.js
  • 前端杂烩

扫一扫,分享到微信

Three.js初见(2)
Vue3新特性总结 
© 2024 夏夜梦星辰
鲁ICP备19028444号
Power By Hexo
  • 所有文章
  • 友情链接
  • 关于我
{{searchItem.query}}
标签: 分类:
  • maven
  • 持续集成
  • JMS
  • 线程
  • JavaScript
  • ECMAScript6
  • 单元测试
  • Promise
  • Web Worker
  • 函数
  • prototype
  • 模块化
  • 正则表达式
  • 数据库
  • MongoDB
  • 索引
  • 集群
  • 全文检索
  • flutter
  • dart
  • git
  • 版本控制
  • linux
  • shell
  • docker
  • nginx
  • jenkins
  • opencv
  • vim
  • react
  • react native
  • 前端
  • css
  • HTML5
  • Hexo
  • sass
  • Three.js
  • TypeScript
  • Vue
  • 组件化
  • base64
  • webpack
  • nodejs
  • gulp
  • TensorFlow
  • 机器学习
  • 算法
  • 动态规划
  • 数据结构
  • Java
  • JavaScript
  • MongoDB
  • flutter
  • Git
  • linux
  • react
  • 前端杂烩
  • 男生女生
  • 算法
  • 十年饮冰,难凉热血
  • †少女癌†
  • 猫与向日葵
  • coderfun
  • JENKINS
  • API管理后台
愿你最终能接纳每一面每一种的自己
独自活着便是团圆