目錄
效果顯示
#解決報錯
問題1 由於參考的程式碼太舊了,報了一個CubeGeometry的錯誤
解決,可以使用Texture了
问题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'
登入後複製

報錯! ! !

淺析小程式要怎麼用threejs

經過測試,是基礎庫最新幾個版本的bug, 給微信官方反饋了,反饋地址(https://developers.weixin.qq.com/community /develop/doc/0002ca77aa420880162d1b08d5b800),官方人員解決問題很快,

其實,不解決也不影響,調低版本庫版本到2.19.6或使用require導入也可以解決

#解決報錯

問題1 由於參考的程式碼太舊了,報了一個CubeGeometry的錯誤

淺析小程式要怎麼用threejs ##查找發現這個CubeGeometry早改名了

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

淺析小程式要怎麼用threejs

問題2 addEventListener報錯

淺析小程式要怎麼用threejs#微信小程式沒有addEventListener,會自動管理canvas的重載,註解掉在three.js下面的程式碼

_canvas.addEventListener('webglcontextlost', onContextLost, false);
_canvas.addEventListener('webglcontextrestored', onContextRestore, false);
登入後複製

問題3 canvas type有問題

淺析小程式要怎麼用threejs仔細查看程式碼發現是_canvas.getContext這裡報錯了,類型改為webgl。

const context = _canvas.getContext('webgl', contextAttributes);
登入後複製

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

const contextNames = ['webgl2', 'webgl', 'experimental-webgl'];
登入後複製

而且contextNames裡沒有2d,程式碼裡只有圖片相關的方法用到了2d。 解決完上面的問題,就能跑起來了。

展示

淺析小程式要怎麼用threejs手機調試時發現一個警告,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

淺析小程式要怎麼用threejs仔細看邏輯:TextureLoader -> ; ImageLoader ->createElementNS

微信小程式沒有createElementNS,找了一圈發現有個替代方法,就是canvas的createImage,但是canvas去哪拿,沒有方法能直接創建,為了方便,直接在new TextureLoader的時候傳進去,注意第一個參數是有意義的,傳空即可

const texture = new THREE.TextureLoader(undefined, canvas)
登入後複製

展示

解決,可以使用Texture了

淺析小程式要怎麼用threejs

3. 使用OrbitControls

#解決報錯

問題1 addEventListener

淺析小程式要怎麼用threejs微信小程式沒有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(输出展示)

淺析小程式要怎麼用threejs

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

参考文章

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

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

展示

淺析小程式要怎麼用threejs

5 真机调试

真机调试2.0支持canvas

1淺析小程式要怎麼用threejs

解决问题

问题1 模型太大

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

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

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

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

1淺析小程式要怎麼用threejs

最後選擇使用某雲,有免費空間可以用。就是如果沒有自己域名的話,測試域名只有一個月的有效期,剛好之前申請了個域名,綁定,修改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