微信小程序使用ThreeX开发3d

注意:本代码是用uniapp开发微信小程序,模型使用.glb格式,以下出现(glb模型压缩)代表改代码是使用压缩时需要使用的,不压缩可以不写

Demo:gitee地址  焦明玉/vue2_threex_demo

1.微信小程序后台添加Threex插件

2.manifest.json

/* 小程序特有相关 */"mp-weixin": {"appid": "wx3402c0e00773fc5a","setting": {"urlCheck": false,"es6": true, // glb模型压缩"minified": false},"usingComponents": true,"workers": { // glb模型压缩"path": "workers","isSubpackage": true},"plugins": {"ThreeX": {"version": "3.1.0","provider": "wx5d6376b4fc730db9","export": "threex.js"}}},

3.threex.js

module.exports = {getApp() {return getApp()},getCurrentPages() {return getCurrentPages()},wx_downloadFile() {return wx.downloadFile},wx_request() {return wx.request}
}

 

4.vue.config.js.js (glb模型压缩)


const path = require('path');module.exports = {configureWebpack: {devServer: {disableHostCheck: true},resolve: {alias: {'@workers': path.resolve(__dirname, 'workers')}}},chainWebpack: config => {config.module.rule('js').include.add(path.resolve(__dirname, 'workers')).end().use('babel-loader').loader('babel-loader').tap(options => {// modify the options...return options;});}
};

5.workers目录放置在根目录与pages同级(glb模型压缩)

6.jsm_weixin目录放置在pages下

7.页面使用

<template><view id="page"><canvas id="canvas_webgl2" type="webgl2" @touchstart="webgl_touch" @touchmove="webgl_touch"@touchend="webgl_touch" @touchcancel="webgl_touch"></canvas></view>
</template><script>const THREE = requirePlugin("ThreeX")const {document,window,HTMLCanvasElement,requestAnimationFrame,cancelAnimationFrame,core,Event,Event0} = THREE.DHTMLimport {OrbitControls} from '../jsm_weixin/controls/OrbitControls.js';import {OrbitControls0} from '../jsm_weixin/controls/OrbitControls0.js';import {GLTFLoader} from '../jsm_weixin/loaders/GLTFLoader.js';import {DRACOLoader} from '../jsm_weixin/loaders/DRACOLoader.js'; // glb模型压缩let requestId;export default {data() {return {canvas: {},renderer: {},}},onUnload() {cancelAnimationFrame(requestId, this.canvas)this.worker && this.worker.terminate()if (this.canvas) this.canvas = nullsetTimeout(() => {if (this.renderer instanceof THREE.WebGLRenderer) {this.renderer.dispose()this.renderer.forceContextLoss()this.renderer.context = nullthis.renderer.domElement = nullthis.renderer = null}}, 10)},onLoad() {uni.showLoading({title: '模型加载中...',mask: true})document.createElementAsync("canvas", 'webgl2', this).then(canvas => {this.canvas = canvasthis.run(canvas).then()})},methods: {// 手指事件webgl_touch(e) {const web_e = (window.platform == "devtools" ? Event : Event0).fix(e)this.canvas.dispatchEvent(web_e)},// 初始化渲染模型async run(canvas) {// 渲染器this.renderer = new THREE.WebGLRenderer({antialias: true,canvas});this.renderer.setPixelRatio(window.devicePixelRatio);this.renderer.setSize(window.innerWidth, window.innerHeight);this.renderer.outputEncoding = THREE.sRGBEncoding;// 场景let scene = new THREE.Scene();scene.background = new THREE.Color(0xe7e5e0);// 相机let camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 100);camera.position.set(7, 7, 7);camera.lookAt(scene.position);// 控制器const controls = new(window.platform == "devtools" ? OrbitControls : OrbitControls0)(camera, this.renderer.domElement);controls.enablePan = true;controls.enableZoom = true;controls.update();// 坐标系	x轴:红色;Y轴:绿色;Z轴:蓝色// let axes = new THREE.AxesHelper(5);// scene.add(axes);// 环境光const light0 = new THREE.AmbientLight(0xf7f7dd, 1);scene.add(light0);// 平行光// 平行光源1	头,右const dLight1 = new THREE.DirectionalLight(0xFFFFFF, 0.5);dLight1.position.set(5, 0, 10);scene.add(dLight1);// 平行光源2	顶,左,后(补充光)const dLight2 = new THREE.DirectionalLight(0xFFFFFF, 0.5);dLight2.position.set(-3, 5, 10);scene.add(dLight2);// 平行光源3	后,左const dLight3 = new THREE.DirectionalLight(0xFFFFFF, 0.5);dLight3.position.set(-5, 0, -10);scene.add(dLight3);// 加载模型// let dracoLoader = new DRACOLoader(); // glb模型压缩// dracoLoader.setDecoderPath('jsm/libs/draco/gltf/');  // glb模型压缩let loader = new GLTFLoader();// loader.setDRACOLoader(dracoLoader);  // glb模型压缩// 压缩:https://zxgj.sxgokit.com:8443/profile/static/3d/3dmodel/3dmodel/DRACO_Car.glb// 贴图处理:https://zxgj.sxgokit.com:8443/profile/static/3d/3dmodel/3dmodel/car1.glbloader.load('https://zxgj.sxgokit.com:8443/profile/static/3d/3dmodel/3dmodel/car1.glb',function(gltf) {gltf.scene.position.set(0, 1.5, -0.5);gltf.scene.scale.set(1.5, 1.5, 1.5);scene.add(gltf.scene);uni.hideLoading()},null,function(e) {uni.hideLoading();uni.showToast({title: '模型加载失败!',icon: 'none'})console.error(e);});// 动画及渲染const animate = () => {requestAnimationFrame(() => {animate();});this.renderer.render(scene, camera);};animate();},}}
</script>
<style scoped>page,canvas {overflow: hidden;width: 100%;height: 100vh;background-color: #caeeef;}
</style>

接下来说一下我遇到的问题:

1.模型加载贴图丢失,贴图太大了最好每张图不超过2kb,1kb最好。使用压缩可以正常显示,但是压缩会引进来约500kbjs代码

2.千万记得模板不要动,不要动,不要动。(模板有问题canvas会报错)下面的js可以修改

3.使用了压缩没有开启es6转es5会报错$gwx啥

4.这玩意儿很耗模拟器内存,模型体积越小越好,太大可能会加载不出来或者出现贴图丢失,模型渲染出来就是黑色

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

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

相关文章

web刷题记录

[HDCTF 2023]SearchMaster 打开环境&#xff0c;首先的提示信息就是告诉我们&#xff0c;可以用post传参的方式来传入参数data 首先考虑的还是rce&#xff0c;但是这里发现&#xff0c;不管输入那种命令&#xff0c;它都会直接显示在中间的那一小行里面&#xff0c;而实际的命令…

视觉与运动控制6

基于驱动器的控制功能 驱动器的系统性能和运算能力有限需要单独的运动控制器。 V/F恒压频比控制 开环控制方法&#xff0c;应用最广泛、最简单&#xff0c;只需要电机数据即可。适用于控制精度和动态响应要求不高的应用。控制原理&#xff1a;保持点击内磁通量恒定&#xff…

Emacs之显示blame插件:blamer、git-messenger(一百四十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

【ARMv8/v9 GIC 系列 2.3 -- GIC SPI 中断的 GICD_CLRSPI_NSR寄存器】

文章目录 GICD_CLRSPIN_NSR寄存器功能INTID 位 [12:0]中断触发类型的影响小结 GICD_CLRSPIN_NSR 在 ARMv9 架构下&#xff0c;GIC&#xff08;Generic Interrupt Controller&#xff09;是负责中断管理的关键组件&#xff0c;它支持复杂的中断处理需求&#xff0c;包括多处理器…

免费下载电子书的网站

在如今的数字化时代&#xff0c;电子书已成为许多人书籍阅读的首选。下面小编就和大家分享一些提供免费查找下载电子书服务的网站&#xff0c;这些网站不仅资源丰富&#xff0c;而且操作简便。 免费下载电子书的网站&#xff1a;https://www.bgrdh.com/favorites/1355.html 1…

没有查到相同已注册商标名称,就可以注册下来?

曾聊了许多网友&#xff0c;他们对普推商标知产老杨说&#xff0c;认为没有查到相同已注册商标名称&#xff0c;就可以申请注册成功&#xff0c;其实不是这样的&#xff0c;还要考虑多种因素。 有的商标名称起的很长&#xff0c;是广告语&#xff0c;一检索没有相同&#xff0…

【JavaScript脚本宇宙】图形魔术:探索领先的图像处理库及其独特功能

深入了解HTML5视频&#xff1a;最受欢迎的库及其功能 前言 图像处理是现代数字媒体开发中不可或缺的一部分&#xff0c;从调整图像大小到创建复杂的图形场景。有许多库可用&#xff0c;每个库都有其特定的优点和适用场景。在本文中&#xff0c;我们将探讨六种流行的图像处理库…

ChatGPT API技术教程OpenAI APIKey在线对接-Chat Completion对象

表示模型根据提供的输入返回的聊天完成响应。 {"id": "chatcmpl-123","object": "chat.completion","created": 1677652288,"model": "gpt-3.5-turbo-0125","system_fingerprint": "fp…

net Framework OAuth2.0

安装四个包 密码模式&#xff08;Password Grant&#xff09;&#xff1a; 用户将用户名和密码发送给第三方应用程序&#xff0c;第三方应用程序直接向授权服务器请求访问令牌。

佣金的定义和类型

1. 佣金的定义 基本定义&#xff1a;佣金是指在商业交易中&#xff0c;代理人或中介机构为促成交易所获得的报酬。它通常是按交易金额的一定比例计算和支付的。支付方式&#xff1a;佣金可以是固定金额&#xff0c;也可以是交易金额的百分比。 2. 佣金的类型 销售佣金&#…

python中的导入方式

目录 一、不同的导入方式 1.1 导入整个模块 1.2 导入整个模块并使用别名 1.3 从模块中导入特定的对象 1.4 从模块中导入所有对象 1.5 条件导入 1.6 导入时使用具体的层级 二、import的本质 2.1 模块查找 2.2 模块加载 2.3 模块编译 2.4 模块初始化 2.5 命…

密码学:用随机函数隐藏指纹

英文中e的出现频率高&#xff0c;加密后&#xff0c;频率最高的那个符号代表e。这是历史上的一次真实案例。这些符号的概率&#xff0c;叫做“指纹”。 把e加密成2个符号&#xff0c;用随机函数选择&#xff0c;例如70%概率下选择符号1&#xff0c;30%选择符号2。解密时&#…

Web Worker 学习及使用

了解什么是 Web Worker 提供了可以在后台线程中运行 js 的方法。可以不占用主线程&#xff0c;不干扰用户界面&#xff0c;可以用来执行复杂、耗时的任务。 在worker中运行的是另一个全局上下文&#xff0c;不能直接获取 Window 全局对象。不同的 worker 可以分为专用和共享&…

文心一言使用笔记

目录 让文心一言提炼已有的内容&#xff0c;模仿给出的案例写一段宣传稿方法例子 发现写出的内容有瑕疵&#xff0c;如何微调&#xff1f;比如文心一言介绍的领导不全如何让文心一言检查语法和表达问题&#xff1f; 如何让文心一言将每个片段用一两句话总结&#xff1f;为了防止…

通用性I2C接口的应用之驱动SHT20(N32G45XVL-STB)

目录 概述 1 软硬件接口 1.1 MCU与SHT20接口 1.2 开发软硬件信息 1.3 SHT-20模块电路 2 I2C软件接口实现 2.1 MCU相关接口 2.2 软件接口实现 2.3 初始化struct I2C 3 SHT20驱动程序实现 3.1 SHT20驱动调用I2C接口 ​3.2 驱动源代码文件 4 测试 4.1 测试代码实现…

第三十九章 添加和使用 WS-Addressing 标头元素 - 响应消息中的默认 WS-Addressing 标头元素

文章目录 第三十九章 添加和使用 WS-Addressing 标头元素 - 响应消息中的默认 WS-Addressing 标头元素响应消息中的默认 WS-Addressing 标头元素手动添加 WS-Addressing 标头元素处理 WS-Addressing 标头元素 第三十九章 添加和使用 WS-Addressing 标头元素 - 响应消息中的默认…

【Vision Transformers-VIT】: 计算机视觉中的Transformer探索

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

Docker中修改TiDB数据库密码(类似mysql)

1.Docker容器运行TiDB pingcap/tidb:last 2.登陆容器系统&#xff1a; 3.在容器中安装mysql客户端&#xff1a; 4.空密码登陆TiDB 5.修改TiDB密码并退出 6.使用修改后的密码登陆验证&#xff1a;

Unity【GUI】基础知识

什么是UI系统 Ul是UserInterface(用户界面)的简称系统的主要学习内容 1.UI控件的使用 2.U控件的事件响应 3.U的分辨率自适应文章目录 基础知识1、工作原理和主要作用2、基本控件1、文本和按钮控件2、多选框和单选框3、输入框和拖动条4、图片绘制和框 3、复合控件1、工具栏和…

微信小程序画布

canvas&#xff1a; 微信小程序中的canvas组件提供了绘制图片、文字、图形等功能&#xff0c;可以实现丰富的图形和动画效果。以下是关于canvas的使用方法和属性&#xff1a; 1.属性 canvas-id&#xff1a;&#xff08;必选&#xff09;Canvas 组件的唯一标识符&#xff0c;用…