uniapp邪门事件

很久之前在这篇《THREEJS 在 uni-app 中使用(微信小程序)》:THREEJS 在 uni-app 中使用(微信小程序)_uni-app_帶刺的小葡萄-华为开发者空间 中学到了如何在uniapp的微信小程序里接入three.js的3d模型

由于小程序自身很多不兼容原因,博主建议去用GitHub一个大佬改写的js库来引入适合小程序的three.js,于是我去照搬模仿,然后手动检查了一下,确实可以正常运行

很简单,就是去GitHub - yannliao/threejs-example-for-miniprogram: 这是一个 three.js 在微信小程序里的使用示例
这个地方,把这两个工具目录拿到自己的目录

然后在代码里引入就好,源代码(已测试过正常运行的)

<template><view><!-- 要在微信小程序使用three.js必须要用canvas画布来实现 --><!-- 一定要写上canvas-id='canvas的id',这是微信小程序的必须条件 --><!-- 还有一定要设置宽高,这里可以用动态的js获取屏幕大小 --><!-- type="webgl"是微信小程序特有的属性,它指定了<canvas>元素应该使用WebGL染上下文,WebGL是一种在网页浏览器中渲染高性能3D图形的API --><canvasclass='scene' id='scene' canvas-id="scene"  type="webgl":style="'width:'+mSceneWidth+'px; height:'+mSceneHeight+'px;'" @touchstart="touchStart" @touchmove="touchMove" @touchend="touchEnd"></canvas></view>
</template><script>// 导入 threejs 的相关依赖// 适配微信小程序的 three.js 包import * as THREE from '../../libs/three.weapp.js'// 控制器:这个控制器允许用户通过鼠标或触摸操作来围绕一个对象进行旋转、缩放和平移。import { OrbitControls } from '../../jsm/controls/OrbitControls.js'// GLTF加载器:这个加载器用于加载GLTF格式的3D模型import GLTF from '../../jsm/loaders/GLTFLoader.js'export default {data() {return {mSceneWidth: 0, // 手机屏幕宽度mSceneHeight: 0, // 手机屏幕高度worldFocus: null, // 世界焦点(模型放置,相机围绕的中心)mCanvasId: null, //canvas的idmSence: null, //three.js的场景对象mCamera: null, //three.js的摄像机对象renderAnimFrameId: null, // 渲染帧动画id};},// 页面加载时onLoad(option){// 获取手机屏幕宽高(作为相机、渲染器大小的依据单位)this.mSceneWidth = uni.getWindowInfo().windowWidth;this.mSceneHeight = uni.getWindowInfo().windowHeight;// 设置世界中心(作为相机的初始位置的坐标单位)this.worldFocus = new THREE.Vector3(0, 0, 0);},// 页面加载完毕后onReady(){// 获取 canvas 元素, 初始化 Three// uni.createSelectorQuery()是微信小程序提供的一个API,用于创建一个选择器查询对象,这个对象可以查询页面上所有的元素信息// .select('#scene'): 选择页面上ID为scene的元素// .node(): 获取选择的节点信息。这个方法用于获取页面元素的详细信息,如位置、尺寸等。// .exec((res) => { ... }): 执行查询,并在查询完成后执行回调函数。res参数可以访问查询到的元素信息。// 由于.select('#scene') 只选择了一个元素,所以res数组中只有一个元素,可以通过 res[0] 来访问这个元素的信息。uni.createSelectorQuery().select('#scene').node().exec((res) => {// 获取 canvasId// 在微信小程序中,每个<canvas>元素都有一个唯一的 canvas-id,用于标识这个canvas,Three.js需要知道它将要渲染到哪一个canvas上this.mCanvasId = res[0].node._canvasId;// 注册画布// THREE.global.registerCanvas 是Three.js提供的一个方法,用于将小程序的canvas元素与Three.js的渲染环境对接// 这是必须的步骤,因为小程序的 canvas 与浏览器中的 canvas 在渲染机制上有所不同const mCanvas = THREE.global.registerCanvas(this.mCanvasId, res[0].node);// 开始初始化this.init(mCanvas);});},// 页面卸载时onUnload() {// 清理渲染帧动画THREE.global.canvas && THREE.global.canvas.cancelAnimationFrame(this.renderAnimFrameId);// 清理canvas对象THREE.global.unregisterCanvas(this.mCanvasId);console.log("Unload");},methods: {// 初始化init(canvas) {//--------------------------------------3大基础要素--------------------------------------------// 创建场景this.mScene = new THREE.Scene();this.mScene.background = new THREE.Color("#e6e6e6"); // 场景背景颜色// 创建摄像机this.mCamera = new THREE.PerspectiveCamera(75, //相机视角this.mSceneWidth / this.mSceneHeight, //宽高比 0.1, //近平面距离100  //远平面距离);this.mCamera.position.set(0, 0, 20);  // 相机所处的位置this.mCamera.lookAt(this.worldFocus); // 可设置可不设置,一般默认就是看向原点// 创建渲染器const renderer = new THREE.WebGLRenderer({ antialias: true, //是否启用抗锯齿,减少图像中边缘的锯齿状外观,使图像看起来更平滑alpha: true ,    //允许你渲染出具有透明背景或其他透明效果的场景});renderer.setSize(this.mSceneWidth, this.mSceneHeight); //  设置渲染器也是手机屏幕的大小//---------------------------------------------------------------------------------------------// 创建光线const light1 = new THREE.HemisphereLight(0xffffff, 0x444444); // 半球光(天空颜色,地面颜色,光照强度)light1.position.set(0, 20, 0);this.mScene.add(light1);const light2 = new THREE.DirectionalLight(0xffffff); // 平行光(颜色, 光照强度)light2.position.set(0, 0, 20);this.mScene.add(light2);// 创建控制器,传2参数(摄像机对象,渲染器创建的canvas的DOM元素)const controls = new OrbitControls(this.mCamera, renderer.domElement);controls.target.set(this.worldFocus.x, this.worldFocus.y, this.worldFocus.z);// 摄像机围绕旋转的中心controls.enablePan = false; // 禁止摄像机平移controls.enableDamping = true; // 设置阻尼惯性,需要在 update 调用controls.dampingFactor = 0.03; // 设置阻尼系数(越小滑得越久)controls.autoRotate = true // 让它自动转// 创建 glb 加载器let GLTFloader = GLTF(THREE)const loader = new GLTFloader();// 异步加载模型// 微信小程序不允许加载本地模型,必须通过 https 获取loader.load("https://threejs.org/examples/models/gltf/Stork.glb", (gltf) => {const model = gltf.scene;model.position.set( 0, 0, 0 );// 设置模型位置model.scale.set( 0.1, 0.1, 0.1 );// 设置模型大小this.mScene.add( model );// 模型加载到场景后,开启渲染render();});// 渲染(闭包)var render = () => {// 帧动画//canvas.requestAnimationFrame是一个浏览器提供的API,告诉浏览器希望执行一个动画,并且请求在下次重绘之前调用指定的回调函数来更新动画//this.renderAnimFrameId 保存了上一次 requestAnimationFrame 返回的请求IDthis.renderAnimFrameId = canvas.requestAnimationFrame(render);//光源跟随相机var vector = this.mCamera.position.clone(); //获取当前相机的位置,这样可以对vector进行修改而不会影响到原始的相机位置light2.position.set(vector.x,vector.y,vector.z);//这样做是为了让物体随着相机的视角变化、阴影也变化// 控制器更新//controls.enabled是判断控制器是否开启状态if (controls.enabled) {// 这个方法是当有动画、重新渲染这些操作,控制器可以重新更新controls.update();}// 渲染场景// renderer.render(场景对象,摄像机对象)renderer.render(this.mScene, this.mCamera);};},// 触摸开始touchStart(e){//这是是微信小程序中使用 Three.js 时的一个特定函数//touchStart(e)使用THREE.global.touchEventHandlerFactory来生成一个处理触摸开始事件的函数,并传入事件对象 e。//也就是传入2参数给THREE.global.touchEventHandlerFactory:('使用canvas操作','是什么事件触发的?')THREE.global.touchEventHandlerFactory('canvas', 'touchstart')(e)},// 触摸移动中touchMove(e){THREE.global.touchEventHandlerFactory('canvas', 'touchmove')(e)},// 触摸结束touchEnd(e){THREE.global.touchEventHandlerFactory('canvas', 'touchend')(e)},}}
</script><style lang="scss">
</style>

结果,很久没用,我现在想在另一个项目引入的时候,一样的流程,给老子疯狂报错!!!!

21:07:15.960 "Vector3" is not exported by "../../../../../C:/Users/岑梓铭/Documents/HBuilderProjects/自学/utils/libs/three.weapp.js", imported by "../../../../../C:/Users/岑梓铭/Documents/HBuilderProjects/自学/utils/jsm/controls/OrbitControls.js".
21:07:15.971 at utils/jsm/controls/OrbitControls.js:17:1
21:07:15.983   15:   TOUCH,
21:07:15.995   16:   Vector2,
21:07:16.006   17:   Vector3,
21:07:16.019         ^
21:07:16.029   18:   global as window
21:07:16.040   19: } from "../../libs/three.weapp.js";

就nm离谱,人家大佬写得好好的js库,我动都没动一点,一个项目可以用,另一个不能(不是path路径引入错误,我特意检查了,代码提示路径都是正确的)

谁能解释????

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

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

相关文章

C#项目04——递归求和

实现逻辑 利用递归&#xff0c;求取1~N以内的和 知识点 正常情况下&#xff0c;C#每条线程都会分配1MB的地址空间&#xff0c;因此执行递归的层次不能太深&#xff0c;否则就会出现溢出的风险&#xff0c; 业务设计 程序代码 private void button1_Click(object sender, E…

SQLMesh 系列教程6- 详解 Python 模型

本文将介绍 SQLMesh 的 Python 模型&#xff0c;探讨其定义、优势及在企业业务场景中的应用。SQLMesh 不仅支持 SQL 模型&#xff0c;还允许通过 Python 编写数据模型&#xff0c;提供更高的灵活性和可编程性。我们将通过一个电商平台的实例&#xff0c;展示如何使用 Python 模…

docker修改镜像默认存储路径(基于 WSL2 的迁移方法)

文章目录 打开powershell窗口1、停止 WSL2、导出数据3、取消注册4、导入数据到新位置5、确认转移情况6、重新启动 Docker Desktop7、查看 打开powershell窗口 任意地方shift右键 1、停止 WSL wsl --shutdown2、导出数据 wsl --export docker-desktop-data E:\docker\Docke…

Java开发实习面试笔试题(含答案)

在广州一家中大公司面试&#xff08;BOSS标注是1000-9999人&#xff0c;薪资2-3k&#xff09;&#xff0c;招聘上写着Java开发&#xff0c;基本没有标注前端要求&#xff0c;但是到场知道是前后端分离人不分离。开始先让你做笔试&#xff08;12道问答4道SQL题&#xff09;&…

火语言RPA--Excel读取内容

【组件功能】&#xff1a;读取Excel内指定位置的内容或读取整篇Sheet页内容 配置预览 配置说明 读取位置 单元格&#xff1a;读取指定单元格中的内容。 行&#xff1a;读取指定行内容。 列&#xff1a;读取指定列内容。 区域&#xff1a;读取指定区域内容。 整篇sheet页&…

基于Flask的第七次人口普查数据分析系统的设计与实现

【Flask】基于Flask的第七次人口普查数据分析系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 基于Flask的人口普查可视化分析系统 二、项目界面展示 登录/注册 首页/详情 …

国产编辑器EverEdit -告别东找西找!一键打开当前文件所在目录!

1 文件操作 2 应用场景 在文件编辑过程中&#xff0c;有时需要对文件进行一些操作&#xff0c;比如&#xff1a;在命令窗口输入文件路径、文件名&#xff0c;进入到文件目录&#xff0c;对文件进行压缩等&#xff0c;如果没有直达命令&#xff0c;用户需要通过文件管理器找到目…

html网络安全工具源码 网络安全前端

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 前端常见的网络安全包括&#xff1a;xss&#xff08;跨站脚本攻击&#xff09;、csrf&#xff08;跨站请求伪造&#xff09;、sql注入攻击等。 1&#xff09;跨站…

【分布式理论14】分布式数据库存储:分表分库、主从复制与数据扩容策略

文章目录 一、分表分库1. 数据分表的必要性与方式2. 数据分库原则与优势 二、主从复制1. 读写分离架构设计2. 数据复制方式3. MySQL实现主从复制4. MySQL主从复制实践与高可用方案 三、数据扩容 随着业务的不断发展和数据量的增长&#xff0c;传统的单机关系型数据库已经逐渐不…

汇能感知的光谱相机/模块产品有哪些?

CM020A 分辨率&#xff1a;1600H1200V 光谱范围&#xff1a;350~950nm 光谱分辨率&#xff1a;1nm 接口&#xff1a;USB2.0 帧率&#xff1a;16001200 (6帧) 输出格式&#xff1a;Raw 8bit FOV&#xff1a;D73.5H58.8V44.1 相机尺寸&#xff1a;505055mm VM02S10 分辨率…

sentinel集成nacos做持久化配置

sentinel提供了非常强大的控制台来提供流控等功能&#xff0c;但是控制台只是临时的配置&#xff0c;想要将流控配置永久的保存&#xff0c;或者在项目启动的时候就加载&#xff0c;不需要手动设置&#xff0c;就需要使用到nacos与sentinel做集成配置。这里都是不变代码&#x…

SpringBoot速成概括

视频&#xff1a;黑马程序员SpringBoot3Vue3全套视频教程&#xff0c;springbootvue企业级全栈开发从基础、实战到面试一套通关_哔哩哔哩_bilibili 图示&#xff1a;

【含文档+PPT+源码】基于微信小程序的猎兔汽车保养维修美容服务平台的设计与实现

项目介绍 本课程演示的是一款基于微信小程序的猎兔汽车保养维修美容服务平台的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部…

Python在网络安全中的应用 python与网络安全

前言 网络安全是保护网络、系统和程序免受数字攻击的做法。据估计&#xff0c; 2019 年该行业价值 1120 亿美元&#xff0c;到2021 年估计有 350 万个职位空缺。 许多编程语言用于执行与网络安全相关的日常任务&#xff0c;但其中一种已成为行业标准&#xff1a;Python&#…

Mac 清理缓存,提高内存空间

步骤 1.打开【访达】 2.菜单栏第五个功能【前往】&#xff0c;点击【个人】 3.【command shift J】显示所有文件&#xff0c;打开【资源库】 4.删除【Containers】和【Caches】文件 Containers 文件夹&#xff1a;用于存储每个应用程序的沙盒数据&#xff0c;确保应用程序…

基于SpringBoot实现的宠物领养系统平台功能一

一、前言介绍&#xff1a; 1.1 项目摘要 宠物领养需求增加&#xff1a;随着人们生活水平的提高和对宠物养护意识的增强&#xff0c;越来越多的人选择领养宠物作为家庭的一员。这导致了宠物领养需求的显著增加。 传统领养方式存在问题&#xff1a;传统的宠物领养方式&#xf…

智慧能源管理新标杆:安科瑞EMS3.0解锁工业园区经济效益与环保双赢

智慧能源平台是一种集成分布式能源、储能系统、负荷管理和智能控制技术的综合能源管理系统。它能够实现能源的高效利用、优化调度和智能化管理&#xff0c;为用户提供稳定、经济、绿色的能源解决方案。工业园区作为能源消耗和管理的核心场景之一&#xff0c;对微电网能源管理平…

Spotify AI 技术(1)使用 TensorFlow 和 TF-Agents

介绍 我们的许多音乐推荐问题都涉及为用户提供有序的项目集&#xff0c;以满足用户在那个时间点的收听偏好和意图。我们根据以前与应用程序的交互来提供当前的推荐&#xff0c;抽象地说&#xff0c;由于我们不断向用户推荐内容&#xff0c;因此我们面临着一个连续的决策过程。 …

EasyExcel实现excel导入(模版上传)

目录 效果pom.xmlapplication.ymlcontrollerservice依赖类前台vue代码某个功能如果需要添加大量的数据,通过一条条的方式添加的方式,肯定不合理,本文通过excel导入的方式来实现该功能,100条数据导入成功85条,失败15条,肯定需要返回一个表格给前台或者返回1个错误excel给前…

基于Django快递物流管理可视化分析系统(完整系统源码+数据库+详细开发文档+万字详细论文+答辩PPT+详细部署教程等资料)

文章目录 基于Django快递物流管理可视化分析系统&#xff08;完整系统源码数据库详细开发文档万字详细论文答辩PPT详细部署教程等资料&#xff09;一、项目概述二、项目说明三、研究意义四、系统设计技术架构 五、功能实现六、完整系统源码数据库详细开发文档万字详细论文答辩P…