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路径引入错误,我特意检查了,代码提示路径都是正确的)
谁能解释????
相关文章:
uniapp邪门事件
很久之前在这篇《THREEJS 在 uni-app 中使用(微信小程序)》:THREEJS 在 uni-app 中使用(微信小程序)_uni-app_帶刺的小葡萄-华为开发者空间 中学到了如何在uniapp的微信小程序里接入three.js的3d模型 由于小程序自身很…...
DeepSeek学习教程 从入门到精通pdf下载:快速上手 DeepSeek
下载链接:DeepSeek从入门到精通(清华大学).pdf 链接: https://pan.baidu.com/s/1Ym0-_x9CrFHFld9UiOdA5A 提取码: 2ebc 一、DeepSeek 简介 DeepSeek 是一款由中国团队开发的高性能大语言模型,具备强大的推理能力和对中文的深刻理解。它广泛应用于智能办…...
MATLAB进阶之路:数据导入与处理
在MATLAB的学习旅程中,我们已经初步了解了它的基础操作。如今,我们将沿着这条充满惊喜的道路,迈向下一个重要的站点——数据导入与处理。这部分内容就像是为MATLAB注入了强大的能量,使其能够从现实的数据世界中汲取信息,然后像一位智慧的魔法师一样,巧妙地处理这些数据,…...
百度首页上线 DeepSeek 入口,免费使用
大家好,我是小悟。 百度首页正式上线了 DeepSeek 入口,这一重磅消息瞬间在技术圈掀起了惊涛骇浪,各大平台都被刷爆了屏。 百度这次可太给力了,PC 端开放仅 1 小时,就有超千万人涌入体验。这速度,简直比火…...
安全见闻
今天学了Windows操作系统和驱动程序的相关知识 Windows注册表 注册表是windows系统中具有层次结构的核心数据库 储存的数据对windows 和Windows上运行的应用程序和服务至关重要。注册表时帮助windows控制硬件、软件、用户环境和windows界面的一套数据文件。 打开注册表编辑器…...
PLC通讯
PPI通讯 是西门子公司专为s7-200系列plc开发的通讯协议。内置于s7-200 CPU中。PPI协议物理上基于RS-485口,通过屏蔽双绞线就可以实现PPI通讯。PPI协议是一种主-从协议。主站设备发送要求到从站设备,从站设备响应,从站不能主动发出信息。主站…...
Image Downloader下载文章图片的WordPress插件
源码介绍 一个用于下载图片的WordPress插件,包含下载统计功能,支持任何主题使用 用户点击下载后自动打包该文章所有原始图片,并把文章标题作为压缩包的文件名。 不占用服务器空间,也不占网盘空间,直接利用浏览器的性…...
乐享数科:供应链金融—三个不同阶段的融资模式
供应链金融是与产业链紧密结合的融资模式,它主要体现在订单采购、存货保管、销售回款这三个不同的业务阶段,并针对这些阶段提供了相应的金融服务。以下是这三个阶段中主要的融资模式及其特点: 供应链金融融资模式主要分为以下几种࿱…...
Jenkins 创建 Node 到 Windows
Jenkins 创建 Node 到 Windows 一. 新建 Node Dashboard -> Manage Jenkins -> Manage Nodes and Clouds Dashboard -> Nodes -> New Node 二. 配置节点 Node:节点名 Description:节点描述 Number of executors:节点最大同…...
halcon机器视觉深度学习对象检测,物体检测
目录 效果图操作步骤软件版本halcon参考代码本地函数 get_distinct_colors()本地函数 make_neighboring_colors_distinguishable() 效果图 操作步骤 首先要在Deep Learning Tool工具里面把图片打上标注文本, 然后训练模型,导出模型文件 这个是模型 mod…...
【分布式数据一致性算法】Gossip协议详解
在分布式系统中,多个节点同时提供服务时,数据一致性是核心挑战。在多个节点中,若其中一个节点的数据发生了修改,其他节点的数据都要进行同步。 一种比较简单粗暴的方法就是 集中式发散消息,简单来说就是一个主节点同时…...
蓝桥杯笔记——递归递推
递归 0. 函数的概念 我们从基础讲起,先了解函数的概念,然后逐步引入递归,帮助同学们更好地理解递归的思想和实现方式。 函数是程序设计中的一个基本概念,简单来说,它是一段封装好的代码,可以在程序中多次…...
Vue 3 + Vite 项目中配置代理解决开发环境中跨域请求问题
在 Vue 3 Vite 项目中,配置代理是解决开发环境中跨域请求问题的常见方法。通过在 Vite 的配置文件中设置代理,可以将前端请求转发到后端服务器,从而避免浏览器的同源策略限制。 1. 创建 Vue 3 Vite 项目 首先,确保你已经安装了…...
【复现DeepSeek-R1之Open R1实战】系列7:GRPO原理介绍、训练流程和源码深度解析
【复现DeepSeek-R1之Open R1实战】系列博文链接: 【复现DeepSeek-R1之Open R1实战】系列1:跑通SFT(一步步操作,手把手教学) 【复现DeepSeek-R1之Open R1实战】系列2:没有卡也能训模型!Colab跑Op…...
【Qt】可爱的窗口关闭确认弹窗实现
文章目录 实现思路界面构建交互逻辑实现颜色渐变处理圆形部件绘制 代码在主窗口的构造函数中创建弹窗实例ExitConfirmDialog 类代码ColorCircleWidget 类代码 今天在Qt实现了这样一个可互动的窗口(上图由于录屏工具限制没有录制到鼠标) 实现…...
服务器通过 ollama 运行deepseek r1
1、服务器环境简介 56核 CPU64G 内存无显卡已安装 Ollama 2、下载模型与配置 正常可以通过 ollama pull 或 ollama run 命令直接下载,但通常会遇到连接超时、找不到网址等总理。因此,可以使用国内的模型站进行下载,在这里使用魔塔查找模型…...
计算机毕业设计SpringBoot+Vue.jst网上购物商城系统(源码+LW文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
自制操作系统前置知识汇编学习
今天要做什么? 为了更好的理解书中内容,需要学习下进制分析和汇编。 汇编语言其实应该叫叫机器指令符号化语言,目前的汇编语言是学习操作系统的基础。 一:触发器 电路触发器的锁存命令默认是断开的,是控制电路触发器…...
Unity制作游戏——前期准备:Unity2023和VS2022下载和安装配置——附安装包
1.Unity2023的下载和安装配置 (1)Unity官网下载地址(国际如果进不去,进国内的官网,下面以国内官网流程为例子) unity中国官网:Unity中国官网 - 实时内容开发平台 | 3D、2D、VR & AR可视化 …...
深度学习(5)-卷积神经网络
我们将深入理解卷积神经网络的原理,以及它为什么在计算机视觉任务上如此成功。我们先来看一个简单的卷积神经网络示例,它用干对 MNIST数字进行分类。这个任务在第2章用密集连接网络做过,当时的测试精度约为 97.8%。虽然这个卷积神经网络很简单…...
LeetCodehot 力扣热题100 课程表
题目背景 这个问题要求我们判断是否可以完成所有课程的学习。每门课程可能依赖其他课程作为前置课程,构成了一个有向图。我们需要确定是否存在环,若存在环,说明课程之间互相依赖,无法完成所有课程;如果不存在环&#x…...
彻底卸载kubeadm安装的k8s集群
目录 一、删除资源 二、停止k8s服务 三、重置集群 四、卸载k8s安装包 五、清理残留文件和目录 六、删除k8s相关镜像 七、重启服务器 一、删除资源 # 删除集群中的所有资源,包括 Pod、Deployment、Service,任意节点执行 kubectl delete --all pod…...
【HarmonyOS Next】拒绝权限二次申请授权处理
【HarmonyOS Next】拒绝权限二次申请授权处理 一、问题背景: 在鸿蒙系统中,对于用户权限的申请,会有三种用户选择方式: 1.单次使用允许 2.使用应用期间(长时)允许 3.不允许 当用户选择不允许后࿰…...
便携式动平衡仪Qt应用层详细设计方案(基于Qt Widgets)
便携式动平衡仪Qt应用层详细设计方案(基于Qt Widgets) 版本:1.0 日期:2023年10月 一、系统概述 1.1 功能需求 开机流程:长按电源键启动,全屏显示商标动画(快闪3~4次)。主界面&…...
2 20 数据开发面试题汇总
下面是我在实习中协助面试 然后在牛客上挑选了一些完整的面试问题借助豆包完成的面经答案思路汇总 滴滴数据研发日常实习 一面 数据仓库认识维度建模之外还有哪些建模,有什么区别项目中数据仓库分了哪几层,为什么要分层Hadoop架构,你这些组…...
跟着李沐老师学习深度学习(十四)
注意力机制(Attention) 引入 心理学角度 动物需要在复杂环境下有效关注值得注意的点心理学框架:人类根据随意线索和不随意线索选择注意力 注意力机制 之前所涉及到的卷积、全连接、池化层都只考虑不随意线索而注意力机制则显示的考虑随意…...
Websocket——心跳检测
1. 前言:为什么需要心跳机制? 在现代的实时网络应用中,保持客户端和服务端的连接稳定性是非常重要的。尤其是在长时间的网络连接中,存在一些异常情况,导致服务端无法及时感知到客户端的断开,可能造成不必要…...
基于YOLO11深度学习的半导体芯片缺陷检测系统【python源码+Pyqt5界面+数据集+训练代码】
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...
Spring Boot3.x集成Flowable7.x(一)Spring Boot集成与设计、部署、发起、完成简单流程
一、Flowable简介 Flowable 是一个轻量级、开源的业务流程管理(BPM)和工作流引擎,旨在帮助开发者和企业实现业务流程的自动化。它支持 BPMN 2.0 标准,适用于各种规模的企业和项目。Flowable 的核心功能包括流程定义、流程执行、任…...
Dify 工作流分类器技巧
在使用 Dify 工作流中的分类器(如问题分类器,Question Classifier)时,想要实现高效且准确的分类,可以遵循以下技巧和最佳实践。这些建议基于 Dify 的工作流功能,帮助你更好地设计和优化分类过程:…...
