Vue中使用vue-3d-model实现加载3D模型预览展示

场景

要实现在页面中简单快速的加载3D模型用于产品展示。

实现效果如下:

注:

博客:
霸道流氓气质-CSDN博客

实现

3D模型技术方案对比

这里用于快速展示简单3d模型。

3D模型文件下载

可下载的网站较多,比如:

Sketchfab - The best 3D viewer on the web

++3D Models for Free - Free3D.com++

这里去free3d进行模型文件下载

这里下载obj和mtl格式的。

下载之后将其放在项目的public/models/demo目录下

加载模型显示

安装依赖

复制代码
npm install vue-3d-model --save

新建页面,修改代码

复制代码
<template>
  <el-dialog :visible.sync="visible"  :title="title" style="height: 500px;">
      <!-- 3D模型区 -->
      <div class="model-part">
        <model-obj
          ref="modelViewer"
          :src="modelPath"
          :mtl="mtlPath"
          :rotation="modelRotation"
          :scale="modelScale"
          backgroundColor="#050a30"
          @on-load="handleModelLoad"
          @on-error="handleModelError"
          class="model-container"
        ></model-obj>
      </div>
  </el-dialog>
</template>
 
<script>
import { ModelObj } from 'vue-3d-model';
 
export default {
  components: { ModelObj },
  data() {
    return {
      visible: true,
      title: '标题',
      // 模型配置
      // 确保路径指向正确的模型文件
      modelPath: process.env.BASE_URL  + 'models/demo/aa.obj?t='  + Date.now(),
      mtlPath: process.env.BASE_URL  + 'models/demo/aa.mtl?t='  + Date.now(),
      modelRotation: {
        x: -0.3,
        y: 0.5,
        z: 0
      },
      modelScale: { x: 0.8, y: 0.8, z: 0.8 }, // 统一缩放比例
      loadFailed: false
    }
  },// 在mounted中添加验证代码
  mounted() {
    fetch(this.modelPath)
      .then(res => res.text())
      .then(text => {
        console.log(' 文件头信息:', text.substring(0,  50));
        console.assert(!text.includes('<!DOCTYPE  html>'), '错误:加载到HTML文件而非OBJ模型');
      });
  },
  methods: {
    handleModelLoad() {
      console.log('3D 模型加载完成');
      // 可添加模型加载成功后的回调逻辑
    },
    handleModelError(error) {
      console.error(' 模型加载失败:', error);
      this.loadFailed  = true;
    }
  }
}
</script>
 
<style scoped>
/* 模型容器样式 */
.model-container {
  position: relative;
  width: 100%;
  height: 100%;
  min-height: 300px;
}
 
 
/* 备用加载样式 */
.model-fallback {
  text-align: center;
  padding-top: 30%;
  color: rgba(255, 255, 255, 0.5);
}
.model-fallback i {
  font-size: 40px;
  display: block;
  margin-bottom: 10px;
}

</style>
相关推荐
伍哥的传说1 分钟前
React强大且灵活hooks库——ahooks入门实践之开发调试类hook(dev)详解
前端·javascript·react.js·ecmascript·hooks·react-hooks·ahooks
界面开发小八哥30 分钟前
界面控件Kendo UI for Angular 2025 Q2新版亮点 - 增强跨设备的无缝体验
前端·ui·界面控件·kendo ui·angular.js
midsummer_woo1 小时前
基于springboot+vue+mysql的中药实验管理系统设计与实现(源码+论文+开题报告)
vue.js·spring boot·mysql
枷锁—sha2 小时前
从零掌握XML与DTD实体:原理、XXE漏洞攻防
xml·前端·网络·chrome·web安全·网络安全
F2E_Zhangmo2 小时前
基于cornerstone3D的dicom影像浏览器 第二章,初始化页面结构
前端·javascript·vue·cornerstone3d·cornerstonejs
代码的余温2 小时前
如何区别HTML和HTML5?
前端·html·html5
天下无贼!2 小时前
【样式效果】纯CSS从零到一实现动态彩色背景效果
前端·css
DoraBigHead2 小时前
手写 `new`、`call`、`apply`、`bind` + V8 函数调用机制解密
前端·javascript·面试
_pengliang2 小时前
css 音频波浪动画-小程序\PC可用
前端·css·小程序
ai小鬼头2 小时前
AIStarter教你快速打包GPT-SoVITS-v2,解锁AI应用市场新玩法
前端·后端·github