Three.js搭建小米SU7三维汽车实战(2)场景搭建

场景搭建

使用three.js需要这样几步 1. 创建一个三维场景(Scene) 2. 创建一个相机(Camera) 3. 创建渲染器渲染(Renderer)

1) 创建三维场景

```javascript const scene = new THREE.Scene() ```

2) 创建相机

```javascript // 2. 创建透视相机 const camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 1000 ) camera.position.z = 5 ```

3) 创建渲染器

render这一步需要放在最后面,如果在render后面再去进行scene.add来添加物体,会看不到物体,因为render已经完成了拍照

javascript 复制代码
// 3. 创建渲染器
const renderer = new THREE.WebGLRenderer()
renderer.setSize(window.innerWidth, window.innerHeight)
document.body.appendChild(renderer.domElement)
// 4. 渲染
renderer.render(scene, camera)

如何理解渲染

渲染就是拿相机在场景中拍照, 拍的照片显示在canvas画布上

上述完整示例

javascript 复制代码
// 导入threejs
import * as THREE from 'three'

// 1. 创建场景
const scene = new THREE.Scene()
// 2. 创建透视相机
const camera = new THREE.PerspectiveCamera(
  45,
  window.innerWidth / window.innerHeight,
  1,
  1000
)
camera.position.z = 5
// 3. 创建渲染器
const renderer = new THREE.WebGLRenderer()
renderer.setSize(window.innerWidth, window.innerHeight)
document.body.appendChild(renderer.domElement)
// 4. 渲染
renderer.render(scene, camera)

4) 添加物体

创建一个立方体, 添加到场景中 在three.js中, 使用Mesh(网格)表示一个物体, 包括 ●几何形状(Geometry) ●表面材质(Material)

javascript 复制代码
// 5. 创建立方体(几何+材质)
const cubeGeometry = new THREE.BoxGeometry(1, 1, 1)
const cubeMaterial = new THREE.MeshNormalMaterial()
const cube = new THREE.Mesh(cubeGeometry, cubeMaterial)
// 添加到场景
scene.add(cube)

上述代码

  1. 创建了长宽高均为1个单位的立方体BoxGeometry

  2. 使用法向量材质MeshNormalMaterial

  3. 基于几何形状和材质创建立方体

  4. 添加到场景中

效果

5) 添加动画

为了方便观察三维效果, 我们可以使用两种方式 ●物体不变, 相机围绕物体旋转, 从不同的位置观察 ●相机不变, 物体旋转 这里, 为了便于大家理解, 我们先固定相机, 通过动画旋转物体演示

6) 渲染优化

上述我们会看到明显的锯齿, 显示也不够清晰, 这里我们通过设置两个参数, 改善渲染效果。

javascript 复制代码
const renderer = new THREE.WebGLRenderer({ antialias: true })
renderer.setPixelRatio(window.devicePixelRatio)
renderer.setSize(window.innerWidth, window.innerHeight)
document.body.appendChild(renderer.domElement)

上述代码

  1. 通过设置渲染器的antialias属性为true, 开启抗锯齿

  2. 设置DPI, 使用更多的像素点来描述同一个物体

完整示例

javascript 复制代码
// 导入threejs
import * as THREE from 'three'

// 1. 创建场景
const scene = new THREE.Scene()
// 2. 创建相机
const camera = new THREE.PerspectiveCamera(
  45,
  window.innerWidth / window.innerHeight,
  1,
  1000
)

camera.position.z = 5

// 5. 创建立方体(几何+材质)
const cubeGeometry = new THREE.BoxGeometry(1, 1, 1)
const cubeMaterial = new THREE.MeshNormalMaterial()
const cube = new THREE.Mesh(cubeGeometry, cubeMaterial)
// 添加到场景
scene.add(cube)

// 3. 创建渲染器
const renderer = new THREE.WebGLRenderer({ antialias: true })
renderer.setPixelRatio(window.devicePixelRatio)
renderer.setSize(window.innerWidth, window.innerHeight)
document.body.appendChild(renderer.domElement)
// 4. 渲染
function animation() {
  // 改变角度
  cube.rotation.x += 0.01
  cube.rotation.y += 0.01
  // 重新渲染
  renderer.render(scene, camera)

  // 下一帧渲染回调
  requestAnimationFrame(animation)
}

animation()

7)开发辅助

```javascript // 导入threejs import * as THREE from 'three'

// 1. 创建场景

const scene = new THREE.Scene()

// 2. 创建相机

const camera = new THREE.PerspectiveCamera(

45,

window.innerWidth / window.innerHeight,

1,

1000

)

camera.position.z = 100

// 5. 创建立方体(几何+材质)

const cubeGeometry = new THREE.BoxGeometry(1, 1, 1)

const cubeMaterial = new THREE.MeshNormalMaterial()

const cube = new THREE.Mesh(cubeGeometry, cubeMaterial)

// 添加到场景

scene.add(cube)

// 6. 显示坐标轴(x轴: 红色; y轴: 绿色; z轴: 蓝色 rgb)

// x轴水平方向(右正); y轴垂直方向(上正); z轴垂直xy平面即屏幕(外正)

const axesHelper = new THREE.AxesHelper(10)

scene.add(axesHelper)

// 3. 创建渲染器

const renderer = new THREE.WebGLRenderer({ antialias: true })

renderer.setPixelRatio(window.devicePixelRatio)

renderer.setSize(window.innerWidth, window.innerHeight)

document.body.appendChild(renderer.domElement)

// 4. 渲染

renderer.render(scene, camera)

复制代码
1. <font style="color:rgb(38, 38, 38);">将相机的z坐标设置为100, 在远处观察</font>
2. <font style="color:rgb(38, 38, 38);"> 通过坐标辅助对象AxesHelper显示三维坐标系</font>

<font style="color:rgb(38, 38, 38);">10表示显示的坐标的长度为10个单位(立方体的宽高为1个单位)  
</font><font style="color:rgb(38, 38, 38);">3将坐标辅助对象添加到场景中  
</font><font style="color:rgb(38, 38, 38);">但是我们并没有看到z轴  
</font><font style="color:rgb(38, 38, 38);">这是因为我们相机就位于z轴上在观察, 相当于顶视图</font><font style="color:rgb(38, 38, 38);">  
</font>

![](https://cdn.nlark.com/yuque/0/2023/png/25807822/1683514313222-eaf476ce-23bb-4979-add8-a4bf57b57d2b.png?x-oss-process=image%2Fformat%2Cwebp)

![](https://cdn.nlark.com/yuque/0/2023/png/25807822/1683514326124-b475d346-fd1e-4cb1-88b0-dd51645c60e0.png?x-oss-process=image%2Fformat%2Cwebp)

<font style="color:rgb(38, 38, 38);">  
</font><font style="color:rgb(38, 38, 38);">为了方便调试与观察.   
</font><font style="color:rgb(38, 38, 38);">我们可以使用</font>`<font style="color:rgb(38, 38, 38);">OrbitControls</font>`<font style="color:rgb(38, 38, 38);">(轨道控制器)控制相机的位置</font>
相关推荐
aashuii19 分钟前
go客户端ssh交换机
开发语言·golang·ssh
是紫焅呢24 分钟前
E结构体基础.go
开发语言·后端·golang·学习方法·visual studio code
clt12332126 分钟前
golang excel导出时需要显示刷新
开发语言·后端·golang
Silverdew*28 分钟前
vs code配置go开发环境以及问题解决 could not import cannot find package in GOROOT or GOPATH
开发语言·后端·golang
周圣贤2 小时前
九尾狐编程语言新算法“超维时空演算体”
开发语言·算法
CaracalTiger3 小时前
HTTP 协议的基本概念(请求/响应流程、状态码、Header、方法)问题解决方案大全
开发语言·网络·python·深度学习·网络协议·http·pip
随缘而动,随遇而安3 小时前
第八十二篇 大数据开发基础:树形数据结构深度解析与实战指南(附创新生活案例)
大数据·开发语言·数据结构
codingandsleeping3 小时前
重读《你不知道的JavaScript》(上)- this
前端·javascript
西猫雷婶4 小时前
python学智能算法(十三)|机器学习朴素贝叶斯方法进阶-简单二元分类
开发语言·人工智能·python·深度学习·机器学习·矩阵·分类
武子康5 小时前
Java-49 深入浅出 Tomcat 手写 Tomcat 实现【02】HttpServlet Request RequestProcessor
java·开发语言·后端·学习·spring cloud·tomcat