likes
comments
collection
share

three.js + vue3 (一) 基础封装拆解

作者站长头像
站长
· 阅读数 51

three.js + vue3 (一) 基础封装拆解

由于大家都太卷了,导致行情发生了特大的变化,然后.所以,再我失望的时候突然看到了webgl诞生了好多岗位,最重要的是❗️,有些岗位招了好久还是没招到人,然后我就不知不觉的来了。

今天主要分享的是three.js 如何在vue3中的拆解代码封装实现,相信大家看过一遍就可以直接冲了。

一、创建项目

vue create three_project

three.js + vue3 (一) 基础封装拆解

three.js + vue3 (一) 基础封装拆解 相信大家都会创建项目,今天只是分享如何拆解three.js基础分解,所以怎么样安装都可以,大家随意! 并创建一个vue文件引入app.vue中

three.js + vue3 (一) 基础封装拆解

二、three.js 基础材质(小方块)

npm i three

先搭建一个3d的方块,官方的案例,我就直接敲出来了

<template>
  <div class="container" ref="container"></div>
</template>

<script setup>
import * as THREE from "three";
import { ref, onMounted } from "vue";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";

// 引入场景
const scene = new THREE.Scene();
// 引入摄像机
const camera = new THREE.PerspectiveCamera(75,window.innerWidth/ window.innerHeight, 0.1, 1000);
camera.position.set(0,0,5)

scene.add(camera);

const container = ref(null);

// 初始化渲染
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.shadowMap.enabled = true;

// 创建材质 几何体
const geometry = new THREE.BoxGeometry(1,1,1);
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00});
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);

function render () {
  renderer.render(scene, camera);
  requestAnimationFrame(render);
}

// 页面更新变化,渲染页面
window.addEventListener('resize', () => {
  // 更新摄像头
  camera.aspect = window.innerWidth / window.innerHeight;
  // 更新摄像头的投影矩阵
  camera.updateProjectionMatrix();
  // 更新渲染器
  renderer.setSize(window.innerWidth, window.innerHeight);
  // 设置渲染器像素比
  renderer.setPixelRatio(window.devicePixelRatio);
})

onMounted(() => {
  const controls = new OrbitControls(camera, container.value);
  controls.enableDamping = true;
  controls.update();
  container.value.appendChild(renderer.domElement)
  render()
})

</script>


<style>
.container {
  width: 100vw;
  height: 100vh;
}
</style>

三、分解拆分

终于到了主要的地方了,有没有发现这里光基础搭建就这么多行代码了,以后要是再慢慢的加东西就非常的臃肿,所以咱们就拆! 再src目录下创建一个three文件夹,然后把各个步骤一步一步分装进去

three.js + vue3 (一) 基础封装拆解

1、scene.js

three.js + vue3 (一) 基础封装拆解

2、camera.js

three.js + vue3 (一) 基础封装拆解

3、renderer.js

three.js + vue3 (一) 基础封装拆解

4、render.js

three.js + vue3 (一) 基础封装拆解

5、resize.js

three.js + vue3 (一) 基础封装拆解

6、axesHelper.js

three.js + vue3 (一) 基础封装拆解

7、gui.js

three.js + vue3 (一) 基础封装拆解

8、objControls.js

three.js + vue3 (一) 基础封装拆解

9、boxgemery.js

three.js + vue3 (一) 基础封装拆解

拆分后的代码

<template>
  <div class="container" ref="container"></div>
</template>

<script setup>
import { ref, onMounted } from "vue";
import gsap from "gsap";
// 场景
import scene from '@/three/common/scene'
// 相机
import camera from '@/three/common/camera'
import renderer from '@/three/common/renderer'
import createMesh from '@/three/boxgemery.js'
import resizePage from '@/three/common/resize'
import objControls from '@/three/common/objControls'
import render from '@/three/common/render'
import axesHelper from '@/three/common/axesHelper'
// 初始化渲染器

// 场景添加摄像机
scene.add(camera)

const container = ref(null);
// 辅助坐标
scene.add(axesHelper(3))

// 创建物体 材质
createMesh(0x00ff00);

// 页面伸缩
resizePage();

onMounted(() => {
  objControls(camera,container);
  container.value.appendChild(renderer.domElement)
  render()
})
</script>
<style>
.container {
  height: 100vh;
  width: 100vw;
  background-color: #f0f0f0;
}
.label {
  color: #fff;
  text-shadow: 0 0 10px #000;
  font-size: 16px;
}
</style>



全部拆出来之后,scene主文件立马瘦了好几圈,然后要再加新的东西还可以创建新的文件加进去,这样的代码是不是特别的干净,也很好找有没有!

转载自:https://juejin.cn/post/7220671243959648314
评论
请登录