当前位置: 首页 > news >正文

vue3中使用three.js记录

记录一下three.js配合vite+vue3的使用。

安装three.js

使用npm安装:

npm install --save three

开始使用

1.定义一个div

<template><div ref="threeContainer" class="w-full h-full"></div>
</template>

可以给这个div定义一个ref,之后会使用ref获取该页面的宽和高以及插入canvas,或者直接插入document.body。这里有一个前提,这个div需要被定义确定的宽和高,例如style="width:100vw;height:100vh"

2.定义script

引入threejs以及可能会用到的组件

import * as THREE from 'three';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';
import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js';
import { Water } from 'three/examples/jsm/objects/Water2.js';
import gsap from 'gsap';

定义一些常用的变量以及初始化方法

let scene: any, camera: any, renderer: any, controls: any, dracoLoader: any, gltfLoader: any, starsInstance: any;
onUnmounted(() => {// 退出时清理资源if (renderer) renderer.dispose();
});
const initThree = () => {// 初始化场景scene = new THREE.Scene();// 初始化相机camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);camera.position.set(-3.23, 2.98, 4.06);camera.updateProjectionMatrix();// 初始化渲染器renderer = new THREE.WebGLRenderer({// 设置抗锯齿antialias: true});renderer.setSize(window.innerWidth, window.innerHeight);// 渲染完成后插入bodydocument.body.appendChild(renderer.domElement);// 设置色调映射renderer.outputEncoding = THREE.sRGBEncoding;renderer.toneMapping = THREE.ACESFilmicToneMapping;renderer.toneMappingExposure = 0.5;renderer.shadowMap.enabled = true;renderer.physicallyCorrectLights = true;// 初始化控制器controls = new OrbitControls(camera, renderer.domElement);controls.target.set(-8, 2, 0);controls.enableDamping = true;// 初始化loader以及设置压缩模型的解压缩地址dracoLoader = new DRACOLoader();dracoLoader.setDecoderPath('./draco/');gltfLoader = new GLTFLoader();gltfLoader.setDRACOLoader(dracoLoader);// 加载环境纹理,天空鱼眼图片const rgbeLoader = new RGBELoader();rgbeLoader.load('./textures/sky.hdr', (texture) => {texture.mapping = THREE.EquirectangularReflectionMapping;scene.background = texture;scene.environment = texture;});// 加载模型gltfLoader.load('./model/scene.glb', (gltf: any) => {const model = gltf.scene;model.traverse((child: any) => {if (child.name === 'Plane') {child.visible = false;}if (child.isMesh) {child.castShadow = true;child.receiveShadow = true;}});scene.add(model);});// 设置灯光initLight();
};
const initLight = () => {// 添加平行光const light = new THREE.DirectionalLight(0xffffff, 1);light.position.set(0, 50, 0);scene.add(light);
};
const render = () => {requestAnimationFrame(render);renderer.render(scene, camera);controls.update();
};
initThree();
render();
// 监听鼠标事件
window.addEventListener('click',(e) => {if (isAnimate) return;isAnimate = true;index.value++;if (index.value > scenes.length - 1) {index.value = 0;restoreHeart();}scenes[index.value].callback();setTimeout(() => {isAnimate = false;}, 1000);},false
);
http://www.lryc.cn/news/267438.html

相关文章:

  • MySQL——表的内外连接
  • 基于IPP-FFT的线性调频Z(Chirp-Z,CZT)的C++类库封装并导出为dll(固定接口支持更新)
  • 【C语言】指针
  • PostgreSql 索引使用技巧
  • 【华为数据之道学习笔记】6-7打造业务自助分析的关键能力
  • K8S从harbor中拉取镜像的规则imagePullPolicy
  • LeetCode刷题--- 优美的排列
  • 关于edge浏览器以及插件推荐【亲测好用】
  • 关于“Python”的核心知识点整理大全43
  • Android Framework一些问题思考
  • 2024年安全员-C证证考试题库及安全员-C证试题解析
  • 推广主要指标及定义
  • 【Proteus仿真】【Arduino单片机】水质监测报警系统设计
  • 随机问卷调查数据的处理(uniapp)
  • 开源分布式搜索引擎ElasticSearch结合内网穿透远程连接
  • Leetcode2928. 给小朋友们分糖果 I
  • go-zero开发入门之网关往rpc服务传递数据2
  • Cron介绍,以及常见的cron表达式
  • 智能优化算法应用:基于协作搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码
  • 分布式训练通信NCCL之Ring-Allreduce详解
  • os_util 工具类和方法的实现
  • uview表单校验带星号
  • vue+element实现动态表格:根据后台返回的属性名和字段动态生成可变表格
  • 云渲染UE4像素流送搭建(winows、ubuntu单实例与多实例像素流送)
  • Unity VR Pico apk安装失败:INSTALL_FAILED_UPDATE_INCOMPATIBLE
  • Prompt 提示工程学习笔记
  • STM32实现三个小灯亮
  • 1861_什么是H桥
  • 【计算机四级(网络工程师)笔记】操作系统运行机制
  • Swagger快速入门