目录
效果展示
1. 简单使用
解决报错
问题1 由于参考的代码太旧了,报了一个CubeGeometry的错误
问题2 addEventListener报错
问题3 canvas type有问题
展示
2. 使用TextureLoader
问题1 createElementNS
展示
3. 使用OrbitControls
问题1 addEventListener
问题2 事件触发后怎么通知OrbitControls
问题3 触摸事件触发的参数问题,小程序事件触发拿到的参数和h5拿到的数据格式不一致,需要调整。
问题4 无法旋转
问题4 无法缩放
4 使用OBJLoader
问题1 Request和fetch为undefined
问题2 模型默认显示太小了,
问题3 模型显示很暗,需要把灯光强度调到很高才能看清
5 真机调试
解决问题
问题1 模型太大
问题2 githubusercontent访问不稳定,经常挂
问题3 码云大于1m的资源需要登录
总结
首页 微信小程序 小程序开发 浅析小程序中要怎么用threejs

浅析小程序中要怎么用threejs

Dec 24, 2021 am 10:21 AM
threejs 小程序

小程序中要怎么用threejs?下面本篇文章就来和大家一起聊聊微信小程序中使用threejs的方法,希望对大家有所帮助!

浅析小程序中要怎么用threejs

微信小程序本身提供了适配版,但是版本太旧了, 而且适配的不全,尝试自己手动适配一下。 这是官方适配threejs的github链接https://github.com/wechat-miniprogram/threejs-miniprogram

效果展示

适配后的小程序代码片段
https://developers.weixin.qq.com/s/y5tDPImr7xvs

1. 简单使用

GitHub地址: https://github.com/mrdoob/three.js,将整个项目拉下来,后面需要修改其中的代码。build目录下已有三个编译好的文件,由于大小超过500k,会跳过es6转es5,不能使用three.module.js,为了调试方便看报错的位置,将未压缩的three.js放到项目中。尝试引用。

import * as THREE from '../libs/three.js'
登录后复制

报错!!!

1.jpg

经过测试,是基础库最新几个版本的bug, 给微信官方反馈了,反馈地址(https://developers.weixin.qq.com/community/develop/doc/0002ca77aa420880162d1b08d5b800),官方人员解决问题很快,

其实,不解决也不影响,调低版本库版本到2.19.6或使用require导入也可以解决

解决报错

问题1 由于参考的代码太旧了,报了一个CubeGeometry的错误

2.png

查找发现这个CubeGeometry早改名了

更新日志:https://github.com/mrdoob/three.js/wiki/Migration-Guide

3.png

问题2 addEventListener报错

4.png

微信小程序没有addEventListener,会自动管理canvas的重载,注释掉three.js中下面的代码

_canvas.addEventListener('webglcontextlost', onContextLost, false);
_canvas.addEventListener('webglcontextrestored', onContextRestore, false);
登录后复制

问题3 canvas type有问题

5.png

仔细查看代码发现是_canvas.getContext这里报错了,类型改为webgl。

const context = _canvas.getContext('webgl', contextAttributes);
登录后复制

微信小程序的canvas有两种使用方式,webgl和2d,2d不代表是webgl2,

const contextNames = ['webgl2', 'webgl', 'experimental-webgl'];
登录后复制

而且contextNames里没有2d,代码里只有图片相关的方法用到了2d。 解决完上面的问题,就能跑起来了。

展示

6.png

手机调试时发现一个警告,EXT_blend_minmax扩展不支持,看代码是在threejs里面报的错误。仔细查找一番

MDN地址:https://developer.mozilla.org/en-US/docs/Web/API/EXT_blend_minmax

发现这就是两个常量,而且在webgl2中是默认支持了,

interface EXT_blend_minmax {
  const GLenum MIN_EXT = 0x8007;
  const GLenum MAX_EXT = 0x8008;
};
登录后复制

可以在代码里直接改为对应的值,警告想去掉的话在12551行左右

2. 使用TextureLoader

解决报错

问题1 createElementNS

7.png

仔细看一下逻辑: TextureLoader -> ImageLoader ->createElementNS

微信小程序没有createElementNS,找了一圈发现有个替代方法,就是canvas的createImage,但是canvas去哪拿,没有方法能直接创建,为了方便,直接在new TextureLoader的时候传进去,注意第一个参数是有意义的,传空即可

const texture = new THREE.TextureLoader(undefined, canvas)
登录后复制

展示

解决,可以使用Texture了

8.png

3. 使用OrbitControls

解决报错

问题1 addEventListener

9.png

微信小程序没有addEventListener,但是可以在canvas上绑定事件,仔细看point event和小程序对应的事件

contextmenu // 鼠标右键
wheel // 滚轮滚动
keydown // 键盘事件
// 需要进行适配的
pointerdown  ->  touchstart
pointermove  ->  touchmove
pointerup    ->  touchend
登录后复制

问题2 事件触发后怎么通知OrbitControls

事件有了,怎么通知呢?两个方法没有任何联系,只能用eventbus了,eventbus可以自己写个简单的 。
index.js(触发)

  onTouchStart(e) {
    EventBus.dispatchEvent(e)
  },
  onTouchMove(e) {
    EventBus.dispatchEvent(e)
  },
  onTouchEnd(e) {
    EventBus.dispatchEvent(e)
  },
登录后复制

OrbitControls.js (监听)

EventBus.addEventListener( 'touchstart', onPointerDown );
EventBus.addEventListener( 'touchend', onPointerUp );
EventBus.addEventListener( 'touchmove', onPointerMove);
登录后复制

问题3 触摸事件触发的参数问题,小程序事件触发拿到的参数和h5拿到的数据格式不一致,需要调整。

找了半天,发现微信小游戏这边有一些适配好的东西,developers.weixin.qq.com/minigame/de…

还有这个文章里老哥自己写的库应该是按照上面微信小游戏的适配库改的developers.weixin.qq.com/community/d…

我是直接用TouchEvent,看如何改成pointEvent

问题4 无法旋转

看打印,应该是某些参数有问题,导致scope.object.position计算为NaN,

排查过程:

position -> offset -> spherical -> sphericalDelta -> clientHeight

clientHeight和clientWidth需要赋值

  canvas.clientHeight = canvas.height
  canvas.clientWidth = canvas.width;
登录后复制

问题4 无法缩放

看打印,还是scope.object.position计算为NaN

排查过程:

position -> offset -> spherical.radius -> scale -> pointers

发现pointerId属性缺少,小程序事件有返回identifier,就是pointerId

总共修改的属性:

1.timeStamp
2. pointerType 取touch
3. 多点触摸时点击取touches数组的最后一个
4. pointerId  identifier 多点触摸时标识是某个点击
5. clientHeight
登录后复制

4 使用OBJLoader

解决报错

问题1 Request和fetch为undefined

微信小程序只有wx.request,刚好上面我们发现有个XMLHttpRequest.js的适配文件,可以用,尝试后发现没法直接用,需要编译成es5。 我们第一步就拉了整个threejs项目的代码,里面有可以重新编译的命令,我们可以把XMLHttpRequest复制过去,修改使用,再进行编译, 主要修改的方法:

const request = new XMLHttpRequest();
request.open('GET', url);
request.onreadystatechange = function () {}
request.onerror()
request.send()
登录后复制

问题2 模型默认显示太小了,

以为是还没适配好,加载有问题,看了老半天才发现已经显示了,就是太小了, 解决方法:放大

roup.scale.set(30,30,30)
登录后复制

问题3 模型显示很暗,需要把灯光强度调到很高才能看清

看示例是这行代码没加

renderer.outputEncoding = THREE.sRGBEncoding;
登录后复制

稍微了解了一下颜色空间的概念:
线性空间: 机器对亮度的感受
非线性(Gamma): 人对亮度的感受

流程:  sRGB(导入的图片) -> linear(处理时) -> sRGB(输出展示)

10.png

上图中,下面的实线是实际显示器的亮度和颜色的系数图,如果没有误差,是不需要gamma校正的, 但实际上线性空间里计算出来的光照的中间亮度部分会被压暗,所以需要经过Gamma校正,调高原有的值进行显示。

参考文章

https://www.cnblogs.com/guanzz/p/7416821.html

https://cloud.tencent.com/developer/article/1543647

展示

11.png

5 真机调试

真机调试2.0支持canvas

12.png

解决问题

问题1 模型太大

只能放到线上,放到GitHub上,可以访问raw.githubusercontent.com请求到资源

问题2 githubusercontent访问不稳定,经常挂

放到码云上,码云同样有raw地址可以访问到资源

问题3 码云大于1m的资源需要登录

13.png

最后选择使用某云,有免费空间可以用。就是如果没有自己域名的话,测试域名只有一个月的有效期,刚好之前申请了个域名,绑定,修改cname, 把模型传到上去,可以访问,申请免费的证书,https可以访问,搞定

总结

微信小程序适配threejs的注意点:

  • 事件系统,事件触发和事件参数

  • 请求,

  • doucment上的属性适配

  • canvas上的属性适配

在查找相关问题时发现了下面这位大佬,threejs配套的基本都适配了, 还有demo展示,推荐看一下https://github.com/deepkolos/three-platformize

【相关学习推荐:小程序开发教程

以上是浅析小程序中要怎么用threejs的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

使用Python开发微信小程序 使用Python开发微信小程序 Jun 17, 2023 pm 06:34 PM

随着移动互联网技术和智能手机的普及,微信成为了人们生活中不可或缺的一个应用。而微信小程序则让人们可以在不需要下载安装应用的情况下,直接使用小程序来解决一些简单的需求。本文将介绍如何使用Python来开发微信小程序。一、准备工作在使用Python开发微信小程序之前,需要安装相关的Python库。这里推荐使用wxpy和itchat这两个库。wxpy是一个微信机器

使用PHP和Three.js创建3D可视化应用程序 使用PHP和Three.js创建3D可视化应用程序 May 11, 2023 am 09:22 AM

随着互联网技术不断的发展,Web应用程序的需求已经不仅仅局限于传统的2D页面展示和数据交互,现在有越来越多的应用需要使用3D可视化技术来呈现数据和场景,如3D游戏、3D建模、物理模拟等。在这篇文章中,我们将介绍如何使用PHP和Three.js来创建一个3D可视化应用程序。我们将从三个方面来详细说明:首先,我们将讲解Three.js的基本概念以及如何在Web应

小程序能用react吗 小程序能用react吗 Dec 29, 2022 am 11:06 AM

小程序能用react,其使用方法:1、基于“react-reconciler”实现一个渲染器,生成一个DSL;2、创建一个小程序组件,去解析和渲染DSL;3、安装npm,并执行开发者工具中的构建npm;4、在自己的页面中引入包,再利用api即可完成开发。

实现微信小程序中的卡片翻转特效 实现微信小程序中的卡片翻转特效 Nov 21, 2023 am 10:55 AM

实现微信小程序中的卡片翻转特效在微信小程序中,实现卡片翻转特效是一种常见的动画效果,可以提升用户体验和界面交互的吸引力。下面将具体介绍如何在微信小程序中实现卡片翻转的特效,并提供相关代码示例。首先,需要在小程序的页面布局文件中定义两个卡片元素,一个用于显示正面内容,一个用于显示背面内容,具体示例代码如下:<!--index.wxml-->&l

支付宝上线'汉字拾光-生僻字”小程序,用于征集、补充生僻字库 支付宝上线'汉字拾光-生僻字”小程序,用于征集、补充生僻字库 Oct 31, 2023 pm 09:25 PM

本站10月31日消息,今年5月27日,蚂蚁集团宣布启动“汉字拾光计划”,最近又迎来新进展:支付宝上线“汉字拾光-生僻字”小程序,用于向社会征集生僻字,补充生僻字库,同时提供不同的生僻字输入体验,以帮助完善支付宝内的生僻字输入方法。目前,用户搜索“汉字拾光”、“生僻字”等关键词就可以进入“生僻字”小程序。在小程序里,用户可以提交尚未被系统识别录入的生僻字图片,支付宝工程师在确认后,将会对字库进行补录入。本站注意到,用户还可以在小程序体验最新的拆字输入法,这一输入法针对读音不明确的生僻字设计。用户拆

uniapp如何实现小程序和H5的快速转换 uniapp如何实现小程序和H5的快速转换 Oct 20, 2023 pm 02:12 PM

uniapp如何实现小程序和H5的快速转换,需要具体代码示例近年来,随着移动互联网的发展和智能手机的普及,小程序和H5成为了不可或缺的应用形式。而uniapp作为一个跨平台的开发框架,可以在一套代码的基础上,快速实现小程序和H5的转换,大大提高了开发效率。本文将介绍uniapp如何实现小程序和H5的快速转换,并给出具体的代码示例。一、uniapp简介unia

小程序备案怎么操作 小程序备案怎么操作 Sep 13, 2023 pm 04:36 PM

小程序备案操作步骤:1、准备个人身份证复印件、企业营业执照复印件、法人身份证复印件等备案材料;2、登录小程序管理后台;3、进入小程序设置页面;4、选择“基本设置”;5、填写备案信息;6、上传备案材料;7、提交备案申请;8、等待审核结果,如果备案不通过要根据原因进行修改,并重新提交备案申请;9、备案后续操作即可。

用Python编写简单的聊天程序教程 用Python编写简单的聊天程序教程 May 08, 2023 pm 06:37 PM

实现思路x01服务端的建立首先,在服务端,使用socket进行消息的接受,每接受一个socket的请求,就开启一个新的线程来管理消息的分发与接受,同时,又存在一个handler来管理所有的线程,从而实现对聊天室的各种功能的处理x02客户端的建立客户端的建立就要比服务端简单多了,客户端的作用只是对消息的发送以及接受,以及按照特定的规则去输入特定的字符从而实现不同的功能的使用,因此,在客户端这里,只需要去使用两个线程,一个是专门用于接受消息,一个是专门用于发送消息的至于为什么不用一个呢,那是因为,只

See all articles