第190期:threejs最简单的例子[立方体]

封面图

这部分的目的是简单介绍threejs的开发流程,从创建场景、设置相机、添加几何体到将几何体渲染到节界面上。同时引出几个在开发过程中容易忽略的概念,在后面的小节中将做详细的介绍。

创建立方体

虽然这个例子看起来很古老,是入门threejs必须看的例子,但是大部分文章对这个例子讲解的并非十分详细,只是简单的说明了如何在场景中添加一个物体这么一个过程,但是其中有几个值得去深入思考的问题,下面我们一起来学习一下。

按照threejs开发的基本流程,我们先创建场景、相机、渲染器,然后用渲染器将相机和场景渲染到界面中,代码如下:

xml 复制代码
<template>
  <div id="cube-container" ref="cubeContainer"></div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import * as THREE from 'three'
// console.log('THREE', THREE)
let cubeContainer = ref()
console.log('cubeContainer', cubeContainer)
// 创建场景
const scene = new THREE.Scene()
// 创建相机
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)
// 创建渲染器
const renderer = new THREE.WebGLRenderer()
onMounted(() => {
  if (cubeContainer.value) {
    renderer.setSize(cubeContainer.value.clientWidth, cubeContainer.value.clientHeight)
    renderer.render(scene, camera)
    cubeContainer.value.appendChild(renderer.domElement)
  }
})
</script>

<style scoped>
#cube-container {
  width: 100%;
  height: 100%;
}
</style>

此时,我们观察页面,会发现页面上一片漆黑。

这是因为虽然我们创建了场景、相机和渲染器,但是我们并没有向场景中添加物体,所以接下来我们在代码中加入下面的代码:

csharp 复制代码
// 创建几何体
const geom = new THREE.BoxGeometry(5, 5, 5)
// 创建材质 这里使用的是基础材质
const mater = new THREE.MeshBasicMaterial({
  color: new THREE.Color('blue')
})
// 创建立方体
const cube = new THREE.Mesh(geom, mater)
// 将立方体添加到场景中
scene.add(cube)

这里我们创建了一个长、宽、高单位为5的立方体,一个颜色为蓝色的基础材质对象,并通过Mesh网格对象将它们两个联系起来,最终通过scene.add()方法将这个立方体添加到了场景之中。

我们再次查看页面,发现页面仍热是一片漆黑。明明我们已经向场景中添加了一个蓝色的立方体,为什么我们却看不到它呢?是相机的问题。

相机好比人的眼睛

在现实生活中,假设在理想条件下,光线充足、物体摆放的位置正确,我们的视力都正常的情况下,只要物体出现在我们的视野范围内,我们就可以看到这个物体,除非我们是闭着眼睛。

同理,threejs中的相机就好比是一双眼睛,我们这里使用的是透视相机PerspectiveCamera,它的构造函数有四个参数:

  • fov,( field of view )视野。相机的视野有多宽,以度为单位。
  • aspect, ****纵横比。场景的宽度与高度的比率。
  • near , 近裁剪平面。任何比这更靠近相机的东西都是不可见的。
  • far , 远裁剪平面。任何比这更远离相机的东西都是不可见的。
ini 复制代码
// 示例
const fov = 35; //  Field of View
const aspect = container.clientWidth / container.clientHeight;
const near = 0.1; // 近裁剪平面
const far = 100; // 远裁剪平面
const camera = new PerspectiveCamera(fov, aspect, near, far);

睁开眼睛才能看到东西

在现实生活中,虽然有各种各样的漂亮的物体,但是如果我们把眼睛闭起来,就算把好东西放到我们眼前,我们仍旧无法看到它到底是个什么东西。

在threejs 中也一样,场景中添加的物体默认都在原点的位置,我们可以将相机和立方体的位置信息打印出来:

yaml 复制代码
// 相机.position _Vector3 {x: 0, y: 0, z: 0}
// 立方体.position _Vector3 {x: 0, y: 0, z: 0}

会发现他们都出现在原点的位置,就好比一个物体放在我们眼前,我们却闭着眼睛,看不到这个物体就变得理所了。

我们改变一下相机的位置,加入以下代码:

scss 复制代码
// 设置相机位置
camera.position.set(0, 10, 10)
// 设置镜头方向
camera.lookAt(0, 0, 0)

然后再次查看页面,立方体就正确的展示到页面中了。

小结

这一节主要通过创建简单的立方体来熟悉threejs基本的开发流程。

我们通过创建场景、相机、几何体、材质对象、网格对象通过场景的add方法将网格对象添加到场景中,并通过渲染器的render方法将场景和相机渲染到界面上。

我们用人的眼睛和相机做了简单的比较,并且发现相机和物体的初始位置都在原点处。到目前为止,我们已经可以将物体正确的展示到界面上,但是其中还有很多问题需要思考,接下来让我们一起来发现和解决这些问题吧。

相关推荐
Fan_web9 分钟前
jQuery——事件委托
开发语言·前端·javascript·css·jquery
安冬的码畜日常11 分钟前
【CSS in Depth 2 精译_044】第七章 响应式设计概述
前端·css·css3·html5·响应式设计·响应式
莹雨潇潇1 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
Jiaberrr1 小时前
Element UI教程:如何将Radio单选框的圆框改为方框
前端·javascript·vue.js·ui·elementui
Tiffany_Ho2 小时前
【TypeScript】知识点梳理(三)
前端·typescript
安冬的码畜日常3 小时前
【D3.js in Action 3 精译_029】3.5 给 D3 条形图加注图表标签(上)
开发语言·前端·javascript·信息可视化·数据可视化·d3.js
太阳花ˉ3 小时前
html+css+js实现step进度条效果
javascript·css·html
小白学习日记4 小时前
【复习】HTML常用标签<table>
前端·html
john_hjy4 小时前
11. 异步编程
运维·服务器·javascript