# three-weixin-demo
**Repository Path**: sfidea/three-weixin-demo
## Basic Information
- **Project Name**: three-weixin-demo
- **Description**: Three.js微信小程序版,
完美效果,完美移植。
【效果演示】https://www.bilibili.com/video/BV1Qe4y1Z7x2?share_source=copy_web&vd_source=7c04e28e67346c8e44c9b04db22d7631
- **Primary Language**: JavaScript
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 66
- **Created**: 2023-09-28
- **Last Updated**: 2023-09-28
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README

# three-weixin(全网最强)
# 支持Ammo(WASM/JS双模式)
# 牛逼可用,请点星.
#### 介绍
全网最强 Three.js 微信小程序版(兼容Uni-App版)。
完美效果,完美移植。
问题反馈(QQ群185654475)
#### 软件架构
完美复刻Three.js
[效果演示](https://www.bilibili.com/video/BV1Qe4y1Z7x2?share_source=copy_web&vd_source=7c04e28e67346c8e44c9b04db22d7631)


#### Demo演示(微信小程序/Uni-App)
1. 克隆或下载本仓库。
2. 在demo根目录,安装依赖
```
npm i
```
3. 小程序开发工具打开dmo目录。
4. 小程序开发工具顶部菜单->工具->构建npm
5. 编译(刷新)本demo项目。
6. 本项目所需模型资源访问较慢,可从网盘下载后( https://pan.baidu.com/s/1NU-9y6oeUNCUKpFBvvN7Hg?pwd=4077 ),放置到你本地(推荐IIS)或云web服务器,并修改项目访问默认域名(请在小程序代码App.js中设置)
#### 项目使用(微信小程序/Uni-App)
1. 安装
1.1. 安装依赖
```
npm i dhtml-weixin
npm i three-weixin
```
1.2. 小程序开发工具顶部菜单->工具->构建npm
1.3. 编译(刷新)你的项目。
2. 页面UI上加入
```
```
3. 代码中,使用three换为使用three-wexin
```
import * as THREE from 'three'
```
更换为
```
import * as THREE from 'three-weixin'
```
4. 代码中,替换examples中内容
```
import xxx from 'three/examples/xxx'
```
更换为
```
import xxx from './xxx'
```
5. 复制你的网页版Three.js项目页面代码(建议Vue2项目)代码到本小程序页面onLoad或onReady中。
5.1 异步方式
```
var requestId // 来自 requestId = requestAnimationFrame()
Page({
async onLoad() {
const canvas3d = this.canvas = await document.createElementAsync("canvas","webgl");
//组件中使用 getApp().canvas = await document.createElementAsync("canvas","webgl",this);
const renderer = this.renderer = new THREE.WebGLRenderer( { canvas:canvas3d, antialias: true } );
/*你的代码 */
},
onUnload(){
cancelAnimationFrame(requestId)
this.renderer.dispose()
this.renderer.forceContextLoss()
this.renderer.context = null
this.renderer.domElement = null
this.renderer = null
},
})
```
5.2 同步方式
```
var requestId // 来自 requestId = requestAnimationFrame()
Page({
onLoad() {
document.createElementAsync("canvas","webgl").then(canvas=>{
//组件中使用 document.createElementAsync("canvas","webgl",this).then(canvas=>{
const canvas3d = this.canvas = canvas;
const renderer = this.renderer = new THREE.WebGLRenderer( { canvas:canvas3d, antialias: true } );
/*你的代码 */
})
},
onUnload(){
cancelAnimationFrame(requestId)
this.renderer.dispose()
this.renderer.forceContextLoss()
this.renderer.context = null
this.renderer.domElement = null
this.renderer = null
},
})
```
6. 所有JS文件,若用到网页对象(如window、document),请在页面顶部添加
```
import {document,window,self,URL,requestAnimationFrame,cancelAnimationFrame,Event} from 'dhtml-weixin'
```
7. 添加事件
7.1 页面UI改造为
```
```
7.2 页面代码添加
```
Page({
webgl_touch(e){
const web_e = Event.fix(e)
document.dispatchEvent(web_e)
window.dispatchEvent(web_e)
this.canvas && this.canvas.dispatchEvent(web_e)
},
})
```
8. 模型资源,建议放置到你本地(推荐IIS)或云web服务器,并修改项目访问默认域名(请在小程序代码App.js中设置)
#### 常见问题(FAQ)
1. 图片/材质,按微信小程序要求,尺寸请小于2000x2000,体积小于2M(若图片来自CDN,请在url后边加缩放尺寸参数)。
2. onUnload记得释放资源。
3. 不要app.js在和页面Page({})外部,里存放大数据。
4. Uni-App支持App.js不好,全局配置可能会失效。
5. 部分Android显示GLB模型,若黑屏,请添加环境光和点光源,增加模型粗糙度。