vue3+vite+three加载glb模型文件

页面结构
在这里插入图片描述

展示页面

<template><div class="login flex flex-col"><div class="scene" id="scene"></div></div>
</template><script lang="ts" setup>
import { computed, onMounted, reactive, ref, shallowRef } from "vue";
import type { InputInstance, FormInstance } from "element-plus";
import useAppStore from "@/stores/modules/app";
import useUserStore from "@/stores/modules/user";
import cache from "@/utils/cache";const passwordRef = shallowRef<InputInstance>();
const formRef = shallowRef<FormInstance>();
const appStore = useAppStore();
const userStore = useUserStore();
const route = useRoute();
const router = useRouter();
const config = computed(() => appStore.config);import Base3d from "@/utils/glb";
const data = reactive({base3d: {},
});
onMounted(() => {data.base3d = new Base3d("#scene");
});
</script>

glb.js文件

import * as THREE from 'three' //导入整个 three.js核心库
import { EquirectangularReflectionMapping } from 'three' //导入纹理映射模块
import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader' //导入RGB加载器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls' //导入控制器模块,轨道控制器
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader' //导入GLTF模块,模型解析器,根据文件格式来定class Base3d {constructor(selector) {this.container = document.querySelector(selector)this.camerathis.scenethis.rendererthis.controlsthis.init()this.animate()}init() {//初始化场景this.initScene()//初始化相机this.initCamera()//初始化渲染器this.initRender()//初始化控制器,控制摄像头,控制器一定要在渲染器后this.initControls()// 添加物体模型this.addMesh()//监听场景大小改变,跳转渲染尺寸window.addEventListener("resize", this.onWindowResize.bind(this))}initScene() {this.scene = new THREE.Scene()this.setEnvMap('079')}initCamera() {this.camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.25, 200)this.camera.position.set(-1.8, 0.6, 20)}initRender() {this.renderer = new THREE.WebGLRenderer({ antialias: true }) //设置抗锯齿//设置屏幕像素比this.renderer.setPixelRatio(window.devicePixelRatio)//渲染的尺寸大小this.renderer.setSize(window.innerWidth, window.innerHeight)//色调映射this.renderer.toneMapping = THREE.ACESFilmicToneMapping//曝光this.renderer.toneMappingExposure = 3this.container.appendChild(this.renderer.domElement)}setEnvMap(hdr) { //设置环境背景new RGBELoader().setPath('').load('http://xx.xx/image/' + hdr + '.hdr', (texture) => {texture.mapping = EquirectangularReflectionMapping  //圆柱形形纹理映射this.scene.background = texturethis.scene.environment = texture})}render() {this.renderer.render(this.scene, this.camera)}animate() {this.renderer.setAnimationLoop(this.render.bind(this))}initControls() {this.controls = new OrbitControls(this.camera, this.renderer.domElement)}//加载模型setModel(modelName) {return new Promise((resolve, reject) => {const loader = new GLTFLoader().setPath('')loader.load('http://xx.xx/image/ff.glb', (gltf) => {console.log(gltf);this.model = gltf.scene.children[0]this.scene.add(this.model)resolve(this.modelName + '模型添加成功')})})}addMesh() {this.setModel('ff.glb')}onWindowResize() { //调整屏幕大小this.camera.aspect = window.innerWidth / window.innerHeight //摄像机宽高比例this.camera.updateProjectionMatrix() //相机更新矩阵,将3d内容投射到2d面上转换this.renderer.setSize(window.innerWidth, window.innerHeight)}
}
export default Base3d
上边的http://xx.xx/image/为服务器资源地址,记得开启Nginx配置跨源资源共享(CORS)请求
设置 add_header Access-Control-Allow-Origin *; 即可 例如:location /image/ {add_header Access-Control-Allow-Origin *********
}也可以把静态资源放在项目中 setPath('./')设置为./new RGBELoader().setPath('./').load('/xxx/xxx/xxx' + hdr + '.hdr', (texture) => {texture.mapping = EquirectangularReflectionMapping  //圆柱形形纹理映射this.scene.background = texturethis.scene.environment = texture})

还有部署到服务器后进入页面第一次正常刷新404的问题

在conf文件中添加属性
try_files $uri $uri/ /index.html;
尝试解析下列2个文件/文件夹(分辨IP后面的路径是文件还是文件夹), $uri/$uri/,解析到则返回 否则就跳转index.thmltry_files  固定语法
$uri       指代home文件(ip地址后面的路径,假如是127.0.0.1/index/a.png,那就指代index/a.png)
$uri/      指代home文件夹
/index.html  向ip/index.html 地址发起请求location / {root   /deplay/dist;index  index.html index.htm;try_files $uri $uri/ /index.html;}

还有打包时 如果静态文件在本地,结构如图hdr和glb文件引用路径会错
在这里插入图片描述

第一种方式在dist里创建一个public文件夹 再把文件放进去即可
第二种方式是服务器引入则无需改动
第三种

引入对应资源文件

在vite.config.ts文件中配置
assetsInclude: [‘/*.hdr’, '/*.glb’]

我的配置 供参考
export default defineConfig({base: './',server: {host: '0.0.0.0',},plugins: [vue(),vueJsx(),AutoImport({imports: ['vue', 'vue-router'],resolvers: [ElementPlusResolver()],eslintrc: {enabled: true}}),Components({directoryAsNamespace: true,resolvers: [ElementPlusResolver()]}),createStyleImportPlugin({resolves: [ElementPlusResolve()]}),createSvgIconsPlugin({// 配置路劲在你的src里的svg存放文件iconDirs: [fileURLToPath(new URL('./src/assets/icons', import.meta.url))],symbolId: 'local-icon-[dir]-[name]'}),vueSetupExtend()// legacyPlugin({//     targets: ['defaults', 'IE 11']// })],resolve: {alias: {'@': fileURLToPath(new URL('./src', import.meta.url))}},assetsInclude: ['**/*.hdr', '**/*.glb'],build: {rollupOptions: {manualChunks(id) {if (id.includes('node_modules')) {return id.toString().split('node_modules/')[1].split('/')[0].toString()}},output: {assetFileNames: (assetInfo: any) => {if (/\.(mp4|webm|ogg|mp3|wav|flac|aac)$/.test(assetInfo.name)) { // 匹配资源文件后缀return `media/[name].[hash][ext]`;  // 创建media文件夹存放匹配的资源文件,name为该文件的原名,hash为哈希值,ext为文件后缀名,以[name].[hash][ext]命名规则}// else if (/\.(glb|hdr)$/.test(assetInfo.name)) { // 匹配资源文件后缀 可以自定义存放位置//   return `public/[name].[ext]`;  // 创建media文件夹存放匹配的资源文件,name为该文件的原名,hash为哈希值,ext为文件后缀名,以[name].[hash][ext]命名规则//    }return `assets/[name]-[hash].[ext]`; // 不匹配的资源文件存放至assets,以[name]-[hash].[ext]命名规则,注意两处的命名规则不同},}}}
})
import hdr from '../assets/079.hdr'
import glb from '../assets/ff.glb'
使用时const loader = hdr.includes('http') ? new RGBELoader().setPath('') : new RGBELoader().setPath('./')const loader = glb.includes('http') ? new GLTFLoader().setPath('') : new GLTFLoader().setPath('./')
判断绝对|相对路径

打包后对应的资源路径
在这里插入图片描述

在这里插入图片描述

最后我还尝试在uniapp中进行配置 发现只能使用服务器引用资源才会成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/319480.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单相 BLDC 风扇电机驱动方案

单相BLDC风扇电机驱动方案可驱动24V单相永磁同步电机&#xff0c;软件上采用 正弦波调制驱动&#xff0c;相比传统方案在效率、噪音、稳定性上有显著提升。驱动板可 通过旋钮实现无极调速&#xff0c;具有过流保护、堵转保护等保护机制。 本方案采用SYNWIT32 位高速MCU芯片SWM…

酷开系统小酷少儿重磅升级!陪伴孩子美好童年!

孩子的成长总是匆匆太匆匆&#xff0c;父母们应该放慢脚步&#xff0c;感悟童心。用心灵和智慧陪伴孩子&#xff0c;在孩子的心中没有什么比幸福的家庭更重要&#xff0c;没有什么比父母的陪伴更美好&#xff01;酷开系统少儿频道全面升级&#xff01;让酷开系统小酷少儿陪伴成…

IOS:Safari无法播放MP4(H.264编码)

一、问题描述 MP4使用H.264编码通常具有良好的兼容性&#xff0c;因为H.264是一种广泛支持的视频编码标准。它可以在许多设备和平台上播放&#xff0c;包括电脑、移动设备和流媒体设备。 使用caniuse查询H.264兼容性&#xff0c;看似确实具有良好的兼容性&#xff1a; 然而…

GAMES101-LAB3

一、作业总览 本次作业框架添加了Object Loader(用于加载三维模型), Vertex Shader 与Fragment Shader&#xff0c;并且支持了纹理映射。 需要完成的任务&#xff1a; 修改函数rasterize_triangle(const Triangle& t) in rasterizer.cpp 在此处实现与作业2类似的插值算法…

金和OA jc6 ntko-upload 任意文件上传漏洞

产品简介 金和网络是专业信息化服务商&#xff0c;为城市监管部门提供了互联网监管解决方案&#xff0c;为企事业单位提供组织协同OA系统升开发平台&#xff0c;电子政务一体化平台智慧电商平合等服务 漏洞概述 金和OA jc6系统ntkoUpload接口处存在任意文件上传漏洞&#xf…

21. Mysql 事件或定时任务,解放双手,轻松实现自动化

文章目录 概念常见操作事件调度器操作查看事件创建事件删除事件启动与关闭事件 精选示例构造实时数据定时统计数据 总结参考资料 概念 Mysql 事件是一种在特定时间点自动执行的数据库操作&#xff0c;也可以称呼为定时任务&#xff0c;它可以自动执行更新数据、插入数据、删除…

软件测试技术复习点

1 术语含义&#xff08;故障、错误、失效、测试用例&#xff09; 故障&#xff08;Fault&#xff09;&#xff1a;故障是软件中的静态缺陷&#xff1b; 故障屏蔽&#xff1a;软件中的某个故障可能被其他一个或多个故障屏蔽&#xff1b; 错误&#xff08;Error&#xff09;&…

在docekr中运行openwrt镜像

1镜像下载 地址&#xff1a; https://archive.openwrt.org/releases/23.05.1/targets/x86/64/ #linux 下下载命令为 wget https://archive.openwrt.org/releases/23.05.1/targets/x86/64/openwrt-23.05.1-x86-64-rootfs.tar.gz ./#加载镜像 docker import openwrt-23.05.1-x…

基于ElementUI封装的下拉树选择可搜索单选多选清空功能

效果&#xff1a; 组件代码 /*** 树形下拉选择组件&#xff0c;下拉框展示树形结构&#xff0c;提供选择某节点功能&#xff0c;方便其他模块调用* author wy* date 2024-01-03 * 调用示例&#xff1a;* <tree-select * :height"400" // 下拉框中树形高度* …

springboot+redisTemplate多库操作

单库操作 我做了依赖管理&#xff0c;所以就不写版本号了添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>配置文件 spring:redis:database: 2…

mac环境下安装部署mysql5.7

下载安装包 进入官网下载MySQL5.7的安装包 https://www.mysql.com/downloads/ 安装包下载完成后双击pkg文件进行安装&#xff0c;无脑点下一步即可&#xff0c;注意安装完成后记得保存最后弹出框的密码 进入系统偏好设置&#xff0c;找到mysql&#xff0c;开启mysql服务…

【python入门】day12:bug及其处理思路

bug的常见类型 粗心 / 没有好习惯 思路不清 lst[{rating:[9.7,2062397],id:1292052,type:[犯罪,剧情],title:肖申克的救赎,actors:[蒂姆罗宾斯,摩根弗里曼]},{rating:[9.6,1528760],id:1291546,type:[剧情,爱情,同性],title:霸王别姬,actors:[张国荣 ,张丰毅 , 巩俐 ,葛优]},{r…