Skip to content

threejs 学习

曦月风尘老师

gitee 地址:

shiotsukikaedesari.gitee.io

启动项目

shell
# 1 , 注意选择 vue-ts
npm create vite@latest
# 2 
npm i three
npm i --save-dev @types/three

资源

官方文档[https://threejs.org/docs/index.html]

three 与 vue 对接

ts
import {WebGLRenderer} from 'three'
export class TEngine{
    private dom:HTMLElement
    private renderer:WebGLRenderer
    constructor(dom:HTMLElement){
        this.dom = dom
        this.renderer = new WebGLRenderer()
        dom.append(this.renderer.domElement)
        // ,设为 true 允许改变 canvas 画面
        this.renderer.setSize(dom.offsetWidth,dom.offsetHeight,true)
    }
}

app.vue

vue
<script setup lang="ts">
import {TEngine} from "./assets/ts/TEngine.ts"
import {ref,onMounted} from "vue"

const threeTarget = ref(null)
onMounted(()=>{
  new TEngine(threeTarget.value)
})
</script>

<template>
  <div class="three-canvas" ref="threeTarget"></div>
</template>

<style>
.three-canvas {
  width: 100%;
  height: 100%;
}
#app {
  width: 100%;
  height: 100%;
}
</style>

渲染一个立方体

渲染一个有颜色的立方体

增加场景辅助

让场景动起来

添加性能监视器

添加轨道控制器

添加抗锯齿处理

ts
        this.renderer = new WebGLRenderer({
            antialias: true
        })

丰富场景物体,进行项目模块切分

添加点光源,让物体更真实

添加光源辅助,可视化光源调适

让物体产生阴影

感受一下 pbr 材质

加载外部贴图

添加物体变换控制器

物体拾取与射线生成器

解决物体变换的 bug

当用物体变换控器控制物体后,再次点击变换控制器操作会失效。

原因是 mouseDown,mouseUp,click 的区别(执行先后顺序)。

我们是监听的 click 事件来拾取物体。当操作变换控制器松手时会触发 click,把变换控制器本身给选择到了,变换的就不是原来的物体。

避免选择到变换控制器

不要选择到辅助轴

有个虚拟方法,可以将其指控,射线就不会选择到了

ts
axesHelper.raycast = ()=>{}

// fasle。是否只选择第一层物体
const intersection = raycaster.intersectObjects(this.scene.children,false)

改变变换控制器模式

监听键盘事件,改变它的模式。

增加物体自定义事件

dispatch 自定义派发事件

ts
wall.addEventListener('mouseenter', () => {
  (wall.material as MeshStandardMaterial).color = new Color('red')
})

wall.addEventListener('mouseleave', () => {
  (wall.material as MeshStandardMaterial).color = new Color('white')
})
// =============
cacheObject.dispatchEvent({
    type: 'mouseleave'
})

Released under the MIT License.