threejs展示glb模型

原模型为rvt模型


<template><div ref="threeJsContainer"class="three-js-container"></div>
</template>  <script>  
import { defineComponent } from "vue";
import * as THREE from "three";
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
import { DragControls } from "three/examples/jsm/controls/DragControls";
import { onMounted, ref, onUnmounted } from "vue";
import { DRACOLoader } from "three/examples/jsm/loaders/DRACOLoader.js";
export default {name: 'ThreeJsScene',mounted () {this.initThreeJS();},methods: {initThreeJS () {// 创建场景  const scene = new THREE.Scene();const url = "/glb/1.glb";// 创建相机  const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);camera.position.z = 5;// 创建渲染器  const renderer = new THREE.WebGLRenderer();renderer.setSize(window.innerWidth, window.innerHeight);// 将渲染器的DOM元素添加到Vue组件的容器中  this.$refs.threeJsContainer.appendChild(renderer.domElement);// 创建几何体  // const geometry = new THREE.BoxGeometry(1, 1, 1);// const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });// const cube = new THREE.Mesh(geometry, material);// scene.add(cube);// 添加环境光const ambientLight = new THREE.AmbientLight(0xffffff, 0.5);scene.add(ambientLight);//添加坐标轴// const axesHelper = new THREE.AxesHelper(5)// scene.add(axesHelper)//添加轨道控制器const controls = new OrbitControls(camera, renderer.domElement);// 加载 glb 格式的 3D 模型const loader = new GLTFLoader();const dracoLoader = new DRACOLoader();dracoLoader.setDecoderPath("/gltf/");dracoLoader.preload();loader.setDRACOLoader(dracoLoader);loader.load(url,(gltf) => {console.log('------------')console.log(gltf)// 加载成功后的回调函数const model = gltf.scene;model.scale.set(0.8, 0.8, 0.8); // 缩小模型const box = new THREE.Box3().setFromObject(model);const center = box.getCenter(new THREE.Vector3());model.position.sub(center); // 将模型位置移到原点处scene.add(model);// 创建DragControls实例 拖动模型// const controls = new DragControls([model], camera, renderer.domElement);//controls.addEventListener('dragstart', (event) => {// 拖动开始时的事件处理  //console.log('Drag started:', event.object);// 可以从 event 对象中获取有关拖动开始的信息  //});},(xhr) => {// 加载过程中的回调函数console.log((xhr.loaded / xhr.total) * 100 + "% loaded");},(error) => {// 加载失败的回调函数console.error("Failed to load model", error);});// 渲染循环  const animate = () => {requestAnimationFrame(animate);// 更新物体或相机位置  // cube.rotation.x += 0.01;// cube.rotation.y += 0.01;// 渲染场景  renderer.render(scene, camera);};animate();// 窗口大小变化时调整相机和渲染器大小  window.addEventListener('resize', onWindowResize, false);window.addEventListener('click', onMouseClick, false);function onWindowResize () {camera.aspect = window.innerWidth / window.innerHeight;camera.updateProjectionMatrix();renderer.setSize(window.innerWidth, window.innerHeight);}function onMouseClick (event) {event.preventDefault();const mouseX = (event.clientX / window.innerWidth) * 2 - 1;const mouseY = -(event.clientY / window.innerHeight) * 2 + 1;const vector = new THREE.Vector2(mouseX, mouseY);// vector.unproject(camera);const raycaster = new THREE.Raycaster();raycaster.setFromCamera(vector, camera);const intersects = raycaster.intersectObjects(scene.children, true);// 如果有交点  if (intersects.length > 0) {// 获取最近的交点  const intersect = intersects[0];// 获取相交的物体  const object = intersect.object;// 改变物体的材质以实现高亮效果  // 可以改变颜色或透明度  object.material.color.set(0xff0000); // 设置为红色以高亮  object.material.needsUpdate = true; // 更新材质  }}},},};
</script>  <style scoped>
.three-js-container {width: 100%;height: 100%;
}
</style>

配置文件
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

npm 私服以及使用

在工作中&#xff0c;公司有很多内部的包并不希望发布到npm官网仓库&#xff0c;因为可能涉及到一些私有代码不能暴露。对于前端来讲&#xff0c;这时就可以选择在公司内网搭建npm私有仓库。当前比较主流的几种解决方案&#xff1a;verdaccio、nexus、cnpm。大家可以按照自己的…

GEE遥感云大数据林业应用典型案例实践及GPT模型应用

近年来遥感技术得到了突飞猛进的发展&#xff0c;航天、航空、临近空间等多遥感平台不断增加&#xff0c;数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量猛增&#xff0c;遥感数据已经越来越具有大数据特征。遥感大数据的出现为相关研究提供了前所未有的机遇&#xf…

docker安装php7.4安装(swoole)

容器 docker pull centos:centos7 docker run -dit -p9100:9100 --name“dade” --privilegedtrue centos:centos7 /usr/sbin/init 一、安装前库文件和工具准备 1、首先安装 EPEL 源 yum -y install epel-release2.安装 REMI 源 yum -y install http://rpms.remirepo.net/en…

SDWAN专线,解决银行网络搭建痛点

金融行业的不断发展和数字化转型&#xff0c;银行网络的搭建和管理面临着诸多挑战和痛点。SD-WAN&#xff08;Software-Defined Wide Area Network&#xff0c;软件定义广域网&#xff09;专线作为一种创新的网络解决方案&#xff0c;为银行解决了诸多网络搭建痛点&#xff0c;…

nextjs中怎么import svg,并且使用

在 Next.js 中&#xff0c;导入 SVG 并使用它的方法与常规 React 项目类似。以下是如何在 Next.js 中导入和使用 SVG 的步骤&#xff1a; 1、放置 SVG 文件 首先&#xff0c;将你的 SVG 文件放置在项目的某个目录中&#xff0c;例如 public/static/images。 2、导入 SVG 你…

Python数据处理实战(0)-常用功能以及操作

系列文章&#xff1a; 0、基本常用功能及其操作&#xff08;本文操持更新&#xff09; 1&#xff0c;20G文件&#xff0c;分类&#xff0c;放入不同文件&#xff0c;每个单独处理 2&#xff0c;数据的归类并处理 3&#xff0c;txt文件指定的数据处理并可视化作图 4&#xf…

【教程】uni-app iOS打包解决profile文件与私钥证书不匹配问题

摘要 当在uni-app中进行iOS打包时&#xff0c;有时会遇到profile文件与私钥证书不匹配的问题。本文将介绍如何解决这一问题&#xff0c;以及相关的技术细节和操作步骤。 引言 在uni-app开发过程中&#xff0c;iOS打包是一个常见的操作。然而&#xff0c;有时会出现profile文…

git的密钥管理

配置Git中的SSH密钥主要涉及到生成密钥对和将公钥添加到远程仓库&#xff08;如GitHub&#xff09;的过程。以下是一个详细的配置步骤&#xff1a; 生成SSH密钥对&#xff1a; 首先&#xff0c;确保你已经安装了Git。 打开终端或命令行界面。 输入命令 ssh-keygen -t ed25519 …

【vue.js】文档解读【day 2】 | 响应式基础

如果阅读有疑问的话&#xff0c;欢迎评论或私信&#xff01;&#xff01; 本人会很热心的阐述自己的想法&#xff01;谢谢&#xff01;&#xff01;&#xff01; 文章目录 响应式基础声明响应式状态(属性)响应式代理 vs 原始值声明方法深层响应性DOM 更新时机有状态方法 响应式…

NineData云原生智能数据管理平台新功能发布|2024年2月版

SQL开发&#xff1a;全功能支持百度云 GaiaDB 介绍&#xff1a;支持通过 SQL 开发所有能力管理 GaiaDB 实例。更多信息&#xff0c;请参见&#xff1a;真香&#xff01;NineData SQL 开发全面适配 GaiaDB 场景&#xff1a;企业使用 GaiaDB 管理企业数据&#xff0c;需要一个一…

vue2+vite+@vitejs/plugin-vue2可以使用require引用图片资源

很多文章都说vite不能用require&#xff0c;vue3vite确实是这样的&#xff0c;但今天无意间发现vue2vite中是可以使用require引用资源的 vue3搭配vite一般使用的是vitejs/plugin-vue解析vue语法&#xff0c;而vue2使用的则是另一个插件vitejs/plugin-vue2插件解析vue语法 看下…

【Android】位置修改相关

获取位置服务总开关状态 //获取LOCATION_MODE值&#xff0c;但adb状态下无法获取 //0为关闭&#xff0c;1 gps、2 network、3 高精度等 int state Settings.Secure.getInt(mContext.getContentResolver(),Settings.Secure.LOCATION_MODE,Settings.Secure.LOCATION_MODE_HIGH_…

SpringBoot使用MongoTemplate详解

1.pom.xml引入Jar包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> 2.MongoDbHelper封装 /*** MongoDB Operation class* author HyoJung* date …

进程的奥德赛:并发世界中的核心概念与动态管理

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

图神经网络实战(2)——图论基础

图神经网络实战&#xff08;2&#xff09;——图论基础 0. 前言1. 图属性1.1 有向图和无向图1.2 加权图和非加权图1.3 连通图和非连通图1.4 其它图类型 2. 图概念2.1 基本对象2.2 图的度量指标2.2 邻接矩阵表示法 3. 图算法3.1 广度优先搜索3.2 深度优先搜索 小结系列链接 0. 前…

《Effective C++》条款44

将与参数无关的代码抽离templates 存在这样一种类&#xff1a; template<class T,int n> class A { public:...int func(){...cout << n * n << endl;} }; 和这样的两种实例化对象&#xff1a; A<int, 5> a1; a1.func(); A<int, 10> a2; a2.…

力扣hot10---大根堆+双端队列

题目&#xff1a; 大根堆思路&#xff1a; 维护最大值&#xff0c;应该首先想到大根堆。C中对应着priority_queue&#xff0c;这里用pair<int,int>来记录对应的值和在nums中的索引。所以有priority_queue<pair<int,int>> q。在大根堆中&#xff0c;用q.top()…

使用axios结合access_token和refresh_token进行无感刷新

这里利用到的主要是 axios 请求失败的config配置可以记住本次请求的参数&#xff0c;以及利用拦截器&#xff0c;等待刷新完后通过 axios(config) 再次发起请求。 小技巧&#xff1a;将每次请求失败的config和promise的resolve参数存放到数组中&#xff0c;等待刷新token完成再…

【框架学习 | 第一篇】一篇文章读懂MyBatis

文章目录 1.Mybatis介绍1.1Mybatis历史1.2Mybatis特点1.3与其他持久化框架对比1.4对象关系映射——ORM 2.搭建Mybatis2.1引入依赖2.2创建核心配置文件2.3创建表、实体类、mapper接口2.4创建映射文件2.4.1映射文件命名位置规则2.4.2编写映射文件2.4.3修改核心配置文件中映射文件…

vue中v-if和v-for优先级

在Vue中&#xff0c;v-for的优先级高于v-if。这意味着在同一个元素上使用v-if和v-for时&#xff0c;v-for将首先被解析&#xff0c;然后是v-if。 下面是一个代码示例&#xff1a; <template><div><div v-for"item in items" v-if"item.isDispl…