three.js上传模型文件并加载显示

news2025/2/27 16:32:41

 效果大概这样,这个宝箱模型是直接初始化就显示的,人物模型是自己本地添加上去的,代码如下。

<template>
  <div class="container" ref="container">
    <el-row>
      <el-col :span="24">
        <div class="grid-content ep-bg-purple-dark"></div>
        <el-tabs  v-model="activeTab" class="demo-tabs" @tab-click="handleClick">
          <el-tab-pane label="3d模型" name="first">
            <input type="file" accept=".obj,.pltf,.fbx" @change="handleFileUpload">
            <div ref="modelContainer"></div>
          </el-tab-pane>
        </el-tabs>
      </el-col>
    </el-row>
    
  </div>
</template>

<script>
import { ref, reactive, onMounted,getCurrentInstance} from 'vue'
import * as THREE from 'three'
import { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
import { AmbientLight, DirectionalLight } from 'three';

export default {
  setup() {
    const model = ref(null);
    const container = ref(null)
    const modelContainer = ref(null)
    const previewContainer = ref(null);

    const pond = FilePond.create(inputElement);
    const state = reactive({
      uploadedFile: null,
      modelLoaded: false
    })

    let scene = null 
    let controls = null


  
    
    onMounted(() => {
      // 初始化场景
      scene = new THREE.Scene() // 将 scene 赋值

      // 初始化相机c
      let camera = new THREE.PerspectiveCamera(
        75,
        container.value.clientWidth / container.value.clientHeight,//纵横比
        0.1,//近截面距离
        1000//远截面距离
      )
      camera.position.z = 5

      // 初始化渲染器
      let renderer = new THREE.WebGLRenderer({ antialias: true })
      renderer.setSize(container.value.clientWidth, container.value.clientHeight)
      modelContainer.value.appendChild(renderer.domElement)

       // 添加光源
       const ambientLight = new THREE.AmbientLight(0xffffff, 0.5); // 环境光
      const directionalLight = new THREE.DirectionalLight(0xffffff, 1); // 平行光
      directionalLight.position.set(1, 1, 1);

      scene.add(ambientLight);
      scene.add(directionalLight);

      // 初始化控制器
      initOrbitControls(camera, renderer)

      // 加载obj模型
      // const loader = new OBJLoader()
      // loader.load(
      //   './public/static/obj/man.obj',
      //   (object) => {
      //     // 加载成功后的回调函数
      //     // 在这里处理加载的模型对象
      //     handleModelLoaded(object, scene) // 将 scene 作为参数传递
      //   },
      //   (xhr) => {
      //     // 加载过程中的回调函数
      //     console.log((xhr.loaded / xhr.total) * 100 + '% loaded')
      //   },
      //   (error) => {
      //     // 加载失败的回调函数
      //     console.error('加载失败', error)
      //   }
      // )




        // 加载gltf模型
        const loader = new GLTFLoader();
         loader.load(
        './public/static/obj/scene.gltf',
        (gltf) => {
          scene.add(gltf.scene);
        },
        undefined,
        (error) => {
          console.error('加载失败', error);
        }
      );

      // 循环渲染
      const animate = () => {
        requestAnimationFrame(animate)
        renderer.render(scene, camera)     
      }
      animate()
    })

    // 更改颜色
    const handleModelLoaded = (object, scene) => {
      if (scene) {
        object.traverse((child) => {
          if (child instanceof THREE.Mesh) {
            child.material.color.set('#ff0000') 
          }
        })
        scene.add(object)
      } else {
        console.error('Scene is not defined')
      }
    }
    
    


    // 控制器
    function initOrbitControls(camera, renderer) {
      controls = new OrbitControls(camera, renderer.domElement)
      controls.enableDamping = true
      controls.enableZoom = true
      controls.autoRotate = false
      // 禁用自动旋转
      controls.autoRotateSpeed = 3
      // 设置自动旋转速度
      controls.enablePan = true
      // 启用相机平移
      controls.enableKeys = true
      // 启用键盘控制
      controls.keyPanSpeed = 7
      //平移速度
      controls.keys = {
        LEFT: 37,
        UP: 38,
        RIGHT: 39,
        BOTTOM: 40
      }
      // 键盘控制按键码设置
    }
    const getBigectURL = (event) => {
      const current = event.target.files[0]
      const fileReader = new FileReader()
      fileReader.readAsDataURL(current)
      fileReader.onload = (e) => {
        state.videoSrc = e.currentTarget.result
      }
    }
    return {
      container,
      modelContainer,
      ...state,
      initOrbitControls,
      activeTab: 'first',
      videoSrc: '',
      container,
      state,
      model,
    }
  }
}
</script>

<style>
.container {
  height: 100%;
  width: 100%;
}

</style>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

固态硬盘恢复数据,5步搞定!

“不知咋回事&#xff0c;我的固态硬盘突然就有问题了&#xff0c;很多重要的文件也一起丢失了。我正在很努力的解决这个问题&#xff0c;但可惜我对电脑的使用了解比较少&#xff0c;有没有电脑高手可以帮帮我呀&#xff1f; 固态硬盘&#xff0c;通常被称为SSD&#xff0c;它…

stable-diffusion 模型效果+prompt

摘自个人印象笔记&#xff0c;图不完整可查看原笔记&#xff1a;https://app.yinxiang.com/fx/55cda0c6-2af5-4d66-bd86-85da79c5574ePrompt运用规则及技巧 &#xff1a; 1. https://publicprompts.art/&#xff08;最适用于OpenArt 线上模型 https://openart.ai/&#xff09;…

近地面无人机植被定量遥感与生理参数反演技术

遥感&#xff08;RS-Remote Sensing&#xff09;——不接触物体本身&#xff0c;用传感器收集目标物的电磁波信息&#xff0c;经处理、分析后&#xff0c;识别目标物&#xff0c;揭示其几何、物理性质和相互关系及其变化规律的现代科学技术。 换言之&#xff0c;即是“遥远的感…

领克08,开创「芯」时代

中国汽车产业&#xff08;自主品牌&#xff09;的持续向上&#xff0c;正带动本土智能化核心供应链&#xff0c;尤其是关键算力芯片&#xff08;SoC&#xff09;的本土创新。 高工智能汽车研究院监测数据显示&#xff0c;今年1-6月中国市场&#xff08;不含进出口&#xff09;自…

Unity游戏源码分享-精品即时战略游戏_官网60美刀素材

Unity游戏源码分享-精品即时战略游戏_官网60美刀素材 下载地址&#xff1a;https://download.csdn.net/download/Highning0007/88204017

visual studio 2022安装本地的nuget包

工具->选项->Nuget包管理器->程序包源 然后右击解决方案->管理解决方案的Nuget包

探秘Java的Map集合:键值映射的奇妙世界

文章目录 1. 单列集合 vs. 双列集合2. Map接口&#xff1a;键与值的契约3. 深入探索HashMap3.1 特性与构造方法3.2 常用方法3.3 遍历HashMap 4. 美妙的LinkedHashMap 在Java编程中&#xff0c;集合是不可或缺的重要部分&#xff0c;它为我们提供了各种数据结构和算法的实现。其…

(一)创建型设计模式:3、建造者模式(Builder Pattern)

目录 1、建造者模式含义 2、建造者模式的讲解 3、使用C实现建造者模式的实例 4、建造者模式的优缺点 5、建造者模式VS工厂模式 1、建造者模式含义 The intent of the Builder design pattern is to separate the construction of a complex object from its representatio…

实例036 使窗体标题栏文字右对齐

实例说明 窗口标题栏中的文字是窗口的重要说明&#xff0c;该文字可以标示窗口的功能、状态或名称等信息&#xff0c;一般该文字是居左显示的&#xff0c;在本例中设计一个标题栏文字右对齐的窗口。本实例运行结果如图1.36所示。 技术要点 在C# 2.0中实现这一功能非常容易&am…

【LeetCode】45. 跳跃游戏 II - 贪婪算法

目录标题 2023-8-11 09:49:25 45. 跳跃游戏 II 2023-8-11 09:49:25 自己没做出来&#xff0c;废物Orz class Solution {public int jump(int[] nums) {int length nums.length;int end 0;int maxPosition 0;int steps 0;for (int i 0; i < length - 1; i) {maxPosit…

Maven在IDEA2021版本中全局配置(一次配置处处生效)

前言 我们在开发中&#xff0c;Maven是必不可少的&#xff0c;但是每次都需要设置一遍Maven的仓库和settings.xml。真的是心累&#xff0c;今天教大家全局配置一下。再也不要每次项目都配了&#xff0c;Maven还经常出问题。 解决方案 友情提示&#xff1a;小编的IDEA版本为2…

前沿分享-你好,我的括约肌

通过智能主动植入物彻底改变严重压力性尿失禁的治疗&#xff0c;是利用嵌入式系统和微技术领域的最新技术的解决方案。 由 肌机电系统&#xff08;MEMS&#xff09; 驱动&#xff0c;放置在尿道周围&#xff0c;旨在根据患者的活动自动控制&#xff0c;无需手动调整。 当患者从…

Streamlit 入门教程:构建一个Dashboard

Streamlit 是一个用于创建数据科学和机器学习应用程序的开源 Python 库。它的主要目标是使开发人员能够以简单的方式快速构建交互式的数据应用&#xff0c;而无需过多的前端开发经验。Streamlit 提供了一种简单的方法来转换数据脚本或分析代码为具有可视化界面的应用程序&#…

【Tool】win to go 制作随身硬盘

前言 话说我一冲动买了512G固态硬盘&#xff0c;原本是装个ubuntu系统的&#xff0c;这个好装&#xff0c;但是用处太少&#xff0c;就像改成win10的 经历一堆坑之后&#xff0c;终于使用WTG安装好了 步骤 1.下载个WTG辅助工具 Windows To Go 辅助工具|WTG辅助工具 v5.6.1…

【HCIP】BGP基础建邻和宣告实验

题目&#xff1a; 拓扑图&#xff1a; 配置 R1 //配置IP及环回 [r1]int l0 [r1-LoopBack0]ip add 1.1.1.1 24 [r1-LoopBack0]int g0/0/0 [r1-GigabitEthernet0/0/0]int g0/0/1 [r1-GigabitEthernet0/0/1]ip add 13.1.1.1 24 [r1-GigabitEthernet0/0/1]q //建立BGP [r1]bgp 1 […

.NET对象的内存布局

在.NET中&#xff0c;理解对象的内存布局是非常重要的&#xff0c;这将帮助我们更好地理解.NET的运行机制和优化代码&#xff0c;本文将介绍.NET中的对象内存布局。 .NET中的数据类型主要分为两类&#xff0c;值类型和引用类型。值类型包括了基本类型(如int、bool、double、cha…

【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的事件总线EventBus服务功能

手把手教你如何开发一个属于自己的事件总线EventBus服务功能 事件总线 — EventBusEventBus的基本原理 总体架构图定义事件监听器EventListener接口方法 — topic方法 — onMessage 定义事件驱动传输模型定义事件监听器EventListenerRegistry接口initRegistryEventListener注册…

Oracle 知识篇+会话级全局临时表在不同连接模式中的表现

标签&#xff1a;会话级临时表、全局临时表、幻读释义&#xff1a;Oracle 全局临时表又叫GTT ★ 结论 ✔ 专用服务器模式&#xff1a;不同应用会话只能访问自己的数据 ✔ 共享服务器模式&#xff1a;不同应用会话只能访问自己的数据 ✔ 数据库驻留连接池模式&#xff1a;不同应…

风口来临,你真的了解什么是嵌入式吗?

什么是嵌入式&#xff1f; 书本上的定义是这样的&#xff1a; 嵌入式&#xff08;Embedded&#xff09;是指将计算机系统嵌入到被控制对象中的一种技术。它不同于传统的个人电脑或服务器&#xff0c;而是专门设计用来执行特定功能的计算机系统。嵌入式系统通常被用于控制、监测…