vue-3d-loader 加载多个模型

        

需求

1、在使用three.js进行开发的过程中,需要列表加载多个模型,并根据需要多模型进行加载。

2、当鼠标移动到图片上去的时候,开始加载模型, 模型进行加载和展示。

3、在制作3d沉浸式商城时,需要根据需求,在页面将多个不同的模型展示出来。

遇到的问题

1、在鼠标移动到图片上时,开始加载模型;当鼠标移出图片时,显示图片。

2、按照需求加载,根据当前的需求,进行显示对应的模型。不需要时,不会加载模型。

3、3d模型不能用v-show进行预先加载,需要用v-if进行渲染,比较消耗性能。

4、大模型文件时,模型加载的时间会比较长;建议在列表页面渲染时,准备的都是size比较小的模型,可以在模型中加入一定的动画,这样这个页面渲染的效果更好。

5、一开始在制作时,没有什么思路;首先考虑的是three.js进行加载,这样需要自己进行封装;最后多找资料,使用vue-3d-model,发现没做出来;最后才选用vue-3d-model。

6、在使用vue-3d-loader时,需要注意版本;vue2使用1.0版本;vue3使用2.0版本,重新安装之后,需要将项目重新启动,这样整个页面才会渲染出来。自己一开始做时,未重新启动项目,导致页面一直未渲染出来。


代码案例

<template>
	<main class="pageBox">
		<div class="goodsBox">

			<div class="goodsItem" v-for="(item, index) in goodsLists" :key="item.id" @click="load3d(item)">
				<div class="goodsImg" @mouseover="show3d(item)" @mouseleave="close3d(item)">
					<img src="../assets/img/3d/car1.png" alt="" class="iconImg" v-if="!item.visible">
					<div v-else>
						<div class="progress" v-if="currentInfo.percentage >=0 && currentInfo.percentage <= 99">
							<el-progress :percentage="currentInfo.percentage" color="#0256FF" :show-text="false" />
						</div>
						<div >
							<KeepAlive>
								<vue3dLoader style="height: 120px;width:100%;" :showFps="false" :scale="scale"
									:rotation="rotation" :lights="lights" filePath="robot.glb" :backgroundAlpha="0"
									@load="onLoad" @process="process"></vue3dLoader>
							</KeepAlive>
						</div>

					</div>

				</div>
				<div class="goodsContents">
					<div class="goodsUser">
						<img src="../assets/img/3d/car1.png" alt="" class="iconUser">
						<span>{{ item.username }}</span>
					</div>
					<div class="goodsData">
						<div class="goodsRead">
							<span><el-icon>
									<Reading />
								</el-icon> {{ item.read }}</span>
							<span><el-icon>
									<Download />
								</el-icon>{{ item.download }}</span>

						</div>
						<div class="goodsPrice">
							{{ item.price }}
						</div>
					</div>

				</div>

			</div>


		</div>
	</main>
</template>
<script setup>
import { ref } from 'vue'
import { Download, Reading } from '@element-plus/icons-vue'
import { vue3dLoader } from "vue-3d-loader";

const goodsLists = ref([
	{ id: 1, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
	{ id: 2, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
	{ id: 3, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
	{ id: 4, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
	{ id: 5, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
	{ id: 6, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
	{ id: 7, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
	{ id: 8, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
	{ id: 9, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
	{ id: 10, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
	{ id: 11, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
	{ id: 12, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
	{ id: 13, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
	{ id: 14, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
	{ id: 15, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
	{ id: 16, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
	{ id: 17, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
	{ id: 18, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
	{ id: 19, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
	{ id: 20, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
	{ id: 21, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
	{ id: 22, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
	{ id: 23, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
	{ id: 24, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
	{ id: 25, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
	{ id: 26, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
	{ id: 27, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
	{ id: 28, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
	{ id: 29, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
	{ id: 31, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
	{ id: 32, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },
])

const currentInfo = ref({ id: 3, name: '汽车模型', username: '三维模型@供应商', avatar: '', percentage: 0, visible: false, read: 10, download: 200, price: "69.90" },)


const lights = ref([{
	type: 'HemisphereLight',
	position: { x: 0, y: 1, z: 0 },
	skyColor: 0xffffff,
	// groundColor: 0xFF0000, // 此代码为灯光后颜色
	intensity: 1,
},
{
	type: 'DirectionalLight',
	position: { x: 1, y: 1, z: 1 },
	color: 0xffffff,
	intensity: .8,
}])
const scale = ref({ x: 1.5, y: 1.5, z: 1.3 })
const rotation = ref({
	x: 0,
	y: 0,
	z: 0,
})
const process = (event, fileIndex) => {
	currentInfo.value.percentage = ((event.loaded / event.total).toFixed(2)) * 100;
}
const onLoad = () => {

	rotate()
}
const rotate = () => {
	requestAnimationFrame(rotate);//实现自动旋转效果
	rotation.value.y += 0.001;
}

const show3d = (item) => {
	item.visible = true
	currentInfo.value = item
}

const close3d = (item) => {
	item.visible = false
	currentInfo.value = item
}

</script>


<style  lang="less" scoped>
.pageBox {
	.goodsBox {
		display: flex;
		flex-wrap: wrap;
		align-items: center;

		.goodsItem {
			width: 25%;
			padding: 10px;
			// border: 1px solid;
			// background: green;
			border-radius: 10px;
			position: relative;

			.goodsImg {
				width: 100%;
				height: 122px;
				position: relative;

				.iconImg {
					display: block;
					height: 100%;
					width: 100%;
					object-fit: cover;
					border-radius: 10px;
				}
				.progress {
					position: absolute;
					width: 100%;
					bottom: 10px;
					left: 0;
					// border: 1px solid;
				}
			}

			.goodsContents {
				// border: 1px solid;
				padding: 10px;
				position: relative;

				.goodsUser {
					// border: 1px solid;
					display: flex;
					align-items: center;
					gap: 10px;

					.iconUser {
						height: 2.5rem;
						width: 2.5rem;
						border-radius: 2.5rem;
					}
				}

				.goodsData {
					margin-top: 10px;
					display: flex;
					justify-content: space-between;
					align-items: center;

					// border: 1px solid;
					.goodsRead {
						display: flex;
						gap: 10px;
						align-items: center;

						span {
							display: flex;
							gap: 5px;
							align-items: center;
						}

					}

					.goodsPrice {
						color: #ff901d;
						font-size: 14px;
					}
				}

				
			}


		}
	}
}
</style>

收获

有时候,事情做不出来,不是因为技术问题;而是因为信息差。所以平时需要多了解一些其他的知识点,扩大视野,这样在需要时,可以快速的找到相关的知识点,再进行精细的处理。

我是资深前端之路,感觉这篇文章对你有帮助,记得【点赞】+【收藏】+【关注】。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vscode+conda,选择虚拟环境下的python解释器提示解释器无效?

问题描述 在开发一个python脚本过程中,试用conda管理虚拟环境,用vscode进行开发,遇到的问题是激活虚拟环境后,在vscode中选择对应环境下的python解释器,提示“选择的解释器无效”。 使用的是Miniconda,虚拟环境下python版本为2.7,vscode的python插件为2023.14.0。 解…

存储方式 - 前端学习

1. cookie是什么&#xff1f;你了解cookie吗&#xff1f; 在计算机领域中&#xff0c;特指一种由服务器发送到用户浏览器并保存在用户计算机上的小型文本文件。这个文件可以被服务器用来识别用户身份、跟踪用户活动、保存用户设置等。它通常由名称、值、域名、路径、过期时间等…

液氢产业化进程提速 液氢装备检测市场需求空间广阔

液氢产业化进程提速 液氢装备检测市场需求空间广阔 液氢装备检测试验项目涉及到火烧试验、置换试验、振动试验、燃烧实验、高压氢循环试验、预冷试验、液氢阀门检测试验等。检测试验是推动氢能技术自主化、高质量发展的重要步骤&#xff0c;近年来&#xff0c;随着液氢应用场景…

C++之std::is_trivially_copyable(平凡可复制类型检测)

目录 1.C基础回顾 1.1.平凡类型 1.2.平凡可复制类型 1.3.标准布局类型 2.std::is_trivially_copyable 2.1.定义 2.2.使用 2.3.总结 1.C基础回顾 在C11中&#xff0c;平凡类型&#xff08;Trivial Type&#xff09;、平凡可复制类型&#xff08;TrivialCopyable&#x…

mysql中单表查询方法

大家好。我们知道&#xff0c;mysql有一个查询优化器的模块。当我们用sql语句查询表中记录时&#xff0c;会对这条查询语句进行语法解析&#xff0c;然后就会交给查询优化器来进行优化&#xff0c;优化后生成一个执行计划&#xff0c;这个执行计划表明了应该使用哪些索引进行查…

机器学习之制作数据集(CPU版本)

文章目录 一、配置环境1.1 Anaconda 下载安装1.1.1 Anaconda 官网下载1.1.2 清华镜像站下载1.1.3 Anaconda 安装 1.2 配置虚拟环境1.4 Paddlepaddle 安装&#xff08;CPU版本&#xff09;1.5 PaddleOCR 下载1.6 PPOCRLabel 安装 二、数据集制作2.1 运行 PPOCRLabel2.2 数据标注…

理解I2C总线规范

前言&#xff1a; I2C 总线&#xff0c;也可写作IIC总线&#xff08;Inter-Integrated Circuit&#xff09;&#xff0c;是一种非常流行且功能强大的总线&#xff0c;用于主设备&#xff08;或多个主设备&#xff09;与单个或多个从设备之间的通信。图 1 说明了有多个不同的外…

YOLOV5 改进:替换backbone为EfficientNet

1、介绍 本章将会把yolov5的主干网络替换成EfficientNet V2,这里直接粘贴代码 详细的可以参考之前的内容:YOLOV5 改进:替换backbone(MobileNet为例)_yolov5主干网络更换为mobile-CSDN博客 更多的backbone更换参考本专栏: YOLOV5 实战项目(训练、部署、改进等等)_听风吹…

自养号测评是什么?亚马逊、沃尔玛、Target卖家如何建立自己的护城河?

近期有跨境卖家咨询我自养买家账号测评的事情&#xff0c;他们还是有不了解自养号测评的&#xff0c;所以珑哥觉得有必要再讲一下卖家测评的一些事情&#xff0c;之前文章也说过。这可能是跨境卖家运营的一个趋势。今天珑哥着重来介绍一下自养号测评 一、什么叫做自养号测评&a…

揭秘APP广告变现的高效秘诀:如何让你的APP更赚钱?

在数字化时代&#xff0c;APP已成为人们获取信息、娱乐休闲的重要平台。对于许多内容创作者来说&#xff0c;如何通过APP实现盈利&#xff0c;是一个亟待解决的问题。而APP广告变现项目&#xff0c;正是其中一种备受关注的盈利模式。那么&#xff0c;如何有效地利用APP广告变现…

代数拓扑学

啊&#xff0c;哈喽&#xff0c;小伙伴们大家好。我是#张亿&#xff0c;今天呐&#xff0c;学的是代数拓扑学 代数拓扑学是拓扑学中主要依赖 [1]代数工具来解决问题的一个分支。同调与同伦的理论是代数拓扑学的两大支柱&#xff08;见同调论&#xff0c;同伦论&#xff09;。 …

Vxe UI 表单设计器、零代码平台

vxe-pc-ui Vxe UI 表单设计器、零代码表单设计器 安装 Vxe UI PC端组件库 官方文档 查看 github、gitee // ...import VxeUI from vxe-pc-uiimport vxe-pc-ui/lib/style.css// ...// ...createApp(App).use(VxeUI).mount(#app)// ...使用 vxe-form-design 设计器组件 vxe-fo…

西门子smart line触摸屏软件安装 WinCC Flexible Smart V4SP1 V3

提示&#xff1a;Wincc flexible smart软件为西门子Smart line系列触摸屏的专用组态软件&#xff0c;这款屏不能用博途来组态&#xff0c;只能用这个软件来组态。西门子Smart line系列触摸屏的常用型号为SMART 700 IE V3/V4&#xff0c;SMART 1000 IE V3/V4。 Wincc flexible …

Windows远程桌面是什么?

Windows远程桌面是一种远程桌面协议&#xff0c;允许用户通过网络连接到远程Windows计算机&#xff0c;并在本地操作远程计算机。它为用户提供了访问远程计算机的便利性&#xff0c;可以在不同地区的电脑或设备之间进行信息远程通信。 天联解决方案 在远程桌面技术中&#xff…

香港优才计划需要什么条件?一文给你说清2024优才政策、申请利弊及获批攻略

香港优才计划申请&#xff0c;竞争正逐渐加剧&#xff0c;在正式递交申请前&#xff0c;客观评估自身申请条件&#xff0c;找准个人履历中与香港人才引进的契合点&#xff0c;并在申请材料中详细表明&#xff0c;更有助于获批。 在申请之前&#xff0c;我们必须明白一个事实&a…

Windows 11 HBuilder X的安装和环境搭建教程

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 HBuilder X是一个由DCloud推出的集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要用于构建基于HTML、CSS和JavaScript的跨平台应用程序&#xff0c;如微信小程序、App、H5等。它提供了丰富的功能…

群晖NAS安装web服务器和搭建PHP环境

文章目录 安装Web Station 和 PHP配置PHP配置新站点&#xff08;虚拟主机&#xff09;&#xff1a;配置nginx 安装MariaDB修改数据库配置配置远程连接远程连接 最近折腾了一台群晖NAS&#xff0c;并搭建了一套web服务器&#xff0c;关于其中的一些设置&#xff0c;和传统的Linu…

领导让我调研CI/CD,我给他看了这个

一、概念解释 CI/CD是指持续集成&#xff08;Continuous Integration&#xff09;和持续交付/持续部署&#xff08;Continuous Delivery/Continuous Deployment&#xff09;的缩写&#xff0c;是现代软件开发中的重要实践。它们旨在通过自动化和持续化的方式改善软件开发、测试…

注册表Windows兼容性设置(AppCompatFlags)

属性 - 兼容性 EXE文件属性中有兼容性标签&#xff0c;当有些老版本软件不能正常运行时经常会调整这里的设置。 image.png 上面的所有选项都写在注册表中&#xff0c;其中“更改所有用户的设置”保存在HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AppC…

零售品牌做好差旅报销管理,真的能省钱

一年一度的“618”如期而至,甚至启动更早了。 各大厂商宣布取消延用了十多年的预售机制,主打“现货开卖”,充分回归“消费者价值”。 零售品牌给消费者省钱,更要给自己省钱。而这前提是充分了解“钱花在哪了”、“怎么花更合理”: ● 商业化BD、促销、营销等市场活动频繁,差…