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 -->
        <canvas
			class='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的id
                mSence: 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 返回的请求ID
					this.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路径引入错误,我特意检查了,代码提示路径都是正确的)

谁能解释????

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【OS安装与使用】part6-ubuntu 22.04+CUDA 12.4运行MARL算法(多智能体强化学习)

文章目录 一、待解决问题1.1 问题描述1.2 解决方法 二、方法详述2.1 必要说明2.2 应用步骤2.2.1 下载源码并安装2.2.2 安装缺失的依赖项2.2.3 训练执行MAPPO算法实例 三、疑问四、总结 一、待解决问题 1.1 问题描述 已配置好基础的运行环境&#xff0c;尝试运行MARL算法。 1…

人工智能(AI)的不同维度分类

人工智能(AI)的分类 对机器学习进行分类的方式多种多样&#xff0c;可以根据算法的特性、学习方式、任务类型等不同维度进行分类这些分类都不是互斥的&#xff1a; 1、按数据模态不同:图像&#xff0c;文本&#xff0c;语音&#xff0c;多态等 2、按目标函数不同:判别式模型…

从零开始用react + tailwindcs + express + mongodb实现一个聊天程序(一)

项目包含5个模块 1.首页 (聊天主页) 2.注册 3.登录 4.个人资料 5.设置主题 一、配置开发环境 建立项目文件夹 mkdir chat-project cd chat-project mkdir server && mkdir webcd server npm init cd web npm create vitelatest 创建前端项目时我们选择javascrip…

【论文精读】VLM-AD:通过视觉-语言模型监督实现端到端自动驾驶

论文地址&#xff1a; VLM-AD: End-to-End Autonomous Driving through Vision-Language Model Supervision 摘要 人类驾驶员依赖常识推理来应对复杂多变的真实世界驾驶场景。现有的端到端&#xff08;E2E&#xff09;自动驾驶&#xff08;AD&#xff09;模型通常被优化以模仿…

基于Springboot学生宿舍水电信息管理系统【附源码】

基于Springboot学生宿舍水电信息管理系统 效果如下&#xff1a; 系统登陆页面 系统用户首页 用电信息页面 公告信息页面 管理员主页面 用水信息管理页面 公告信息页面 用户用电统计页面 研究背景 随着高校后勤管理信息化的不断推进&#xff0c;学生宿舍水电管理作为高校后勤…

POI pptx转图片

前言 ppt页面预览一直是个问题&#xff0c;office本身虽然有预览功能但是收费&#xff0c;一些开源的项目的预览又不太好用&#xff0c;例如开源的&#xff1a;kkfileview pptx转图片 1. 引入pom依赖 我这个项目比较老&#xff0c;使用版本较旧 <dependency><gro…

【JAVA】封装多线程实现

系列文章目录 java知识点 文章目录 系列文章目录&#x1f449;前言&#x1f449;一、封装的目标&#x1f449;二、常见的封装方式及原理&#x1f449;壁纸分享&#x1f449;总结 &#x1f449;前言 在 Java 中&#xff0c;封装多线程的原理主要围绕着将多线程相关的操作和逻辑…

nginx 反向代理 配置请求路由

nginx | 反向代理 | 配置请求路由 nginx简介 Nginx&#xff08;发音为“Engine-X”&#xff09;是一款高性能、开源的 Web 服务器和反向代理服务器&#xff0c;同时也支持邮件代理和负载均衡等功能。它由俄罗斯程序员伊戈尔西索夫&#xff08;Igor Sysoev&#xff09;于 2004…

用Python实现Excel数据同步到飞书文档

目录 一、整体目标 二、代码结构拆解 三、核心逻辑讲解&#xff08;重点&#xff09; 1. 建立安全连接&#xff08;获取access_token&#xff09; 2. 定位文档位置 3. 数据包装与投递 四、异常处理机制 五、函数讲解 get_access_token() 关键概念解释 1. 飞书API访问…

SQLMesh 系列教程8- 详解 seed 模型

在数据分析和建模过程中&#xff0c;外部模型&#xff08;External Models&#xff09;在 SQLMesh 中扮演着重要角色。外部模型允许用户引用外部数据源或现有数据库表&#xff0c;从而实现灵活的数据整合和分析。本文将介绍外部模型的定义、生成方法&#xff08;包括使用 CLI 和…

《微软量子芯片:开启量子计算新纪元》:此文为AI自动生成

量子计算的神秘面纱 在科技飞速发展的今天,量子计算作为前沿领域,正逐渐走进大众的视野。它宛如一把神秘的钥匙,有望开启未来科技变革的大门,而微软量子芯片则是这把钥匙上一颗璀璨的明珠。 量子计算,简单来说,是一种遵循量子力学规律调控量子信息单元进行计算的新型计算…

使用FFmpeg将PCMA格式的WAV文件转换为16K采样率的PCM WAV文件

使用FFmpeg将PCMA格式的WAV文件转换为16K采样率的PCM WAV文件 一、FFmpeg 简介二、PCMA 格式简介三、PCM 格式简介四、转换步骤五、注意事项六、总结在当今的数字音频处理领域,FFmpeg 无疑是一款功能强大的多媒体处理工具。它能够处理几乎所有格式的音频和视频文件,包括将特定…

【JavaEE进阶】#{}和${}

&#x1f343;前言 MyBatis参数赋值有两种⽅式,使⽤ #{} 和 ${}进⾏赋值,接下来我们看下⼆者的区别 &#x1f333;#{}和${}使⽤ 我们先来看一下两者在基础数据类型与string类型下的使用 &#x1f6a9;Interger类型的参数&#xff08;基础数据类型&#xff09; &#x1f3c…

【JavaEE进阶】图书管理系统 - 贰

目录 &#x1f332;前言 &#x1f384;设计数据库 &#x1f343;引⼊MyBatis和MySQL驱动依赖 &#x1f333;Model创建 &#x1f38d;约定前后端交互接口 &#x1f340;服务器代码 &#x1f6a9;控制层 &#x1f6a9;业务层 &#x1f6a9;数据层 &#x1f334;前端代码…

cline通过硅基流动平台接入DeepSeek-R1模型接入指南

为帮助您更高效、安全地通过硅基流动平台接入DeepSeek-R1模型&#xff0c;以下为优化后的接入方案&#xff1a; DeepSeek-R1硅基流动平台接入指南 &#x1f4cc; 核心优势 成本低廉&#xff1a;注册即送2000万Tokens&#xff08;价值约14元&#xff09;高可用性&#xff1a;规…

Maven——Maven开发经验总结(1)

摘要 本文总结了 Maven 开发中的多个关键经验&#xff0c;包括如何根据版本号决定推送到 releases 或 snapshots 仓库&#xff0c;如何在构建过程中跳过测试&#xff0c;父项目如何控制子项目依赖版本&#xff0c;父项目依赖是否能传递到子项目&#xff0c;如何跳过 Maven dep…

【微服务优化】ELK日志聚合与查询性能提升实战指南

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

Windows 中的启动项如何打开?管理电脑启动程序的三种方法

在日常使用电脑时&#xff0c;我们经常会发现一些应用程序在开机时自动启动&#xff0c;这不仅会拖慢系统的启动速度&#xff0c;还可能占用不必要的系统资源。幸运的是&#xff0c;通过几个简单的步骤&#xff0c;你可以轻松管理这些开机自启的应用程序。接下来&#xff0c;我…

【Linux网络】认识协议(TCP/UDP)、Mac/IP地址和端口号、网络字节序、socket套接字

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;Linux 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 1、初识协议2、UDP、TCP3、Mac、IP地址4、端口号5、网络字节序6、socket 1、初识协议 协议就是一种约定。如何让不同厂商生产的计…

【架构思维基础:如何科学定义问题】

架构思维基础&#xff1a;如何科学定义问题 一、问题本质认知 1.1 问题矛盾 根据毛泽东《矛盾论》&#xff0c;问题本质是系统内部要素间既对立又统一的关系。例如&#xff1a; 电商系统矛盾演变&#xff1a; 90年代&#xff1a;商品供给不足 vs 消费需求增长00年代&#x…