首页 > 编程语言 >如何在小程序中优雅地使用 three.js

如何在小程序中优雅地使用 three.js

时间:2025-01-16 15:29:35浏览次数:3  
标签:code adapter three js 优雅 minisheep THREE

项目官网: Three.js Platform Adapter

目录

成果展示

请添加图片描述请添加图片描述请添加图片描述

目前仅支持在微信小程序中使用,后续会兼容到微信小游戏/其他平台小程序/小游戏中。

示例的微信小程序,包含了 300 余个 three.js 官方 webgl 示例 , 可以微信搜索 Threejs Adapter 查看

兼容性

Three.js 版本

特殊的实现方式不限制 three.js 本身的版本,理论上支持任意版本,但由于改变了部分 Loader 的代码,所以目前在非 colorSpace 的版本(< r152) 使用没有验证。

Loader 支持

支持 50 余种 loader ,完美覆盖 99% 的使用场景

快速上手

从模板开始

你可以选择 uni-appweapp-vite 作为基础框架的模板,然后参照模板内包含基本的使用用例和插件配置进行开发。

如遇下载失败,你也可以手动到 github 代码仓库根据对应分支下载模板。

使用 uni

npx degit minisheeep/threejs-miniprogram-template#uni-ts my-uni-three

使用 weapp-vite

npx degit minisheeep/threejs-miniprogram-template#weapp-vite my-weapp-three

如有其他需要集成的框架模板,你也可加群联系我们

已有项目集成

目前只支持在基于 rollup / vite 进行开发的项目中使用,后续会推出没有这个限制的版本。

首先需要在项目下的 .npmrc 文件添加以下配置,因为这些依赖包并没有发布在 npm 官方仓库中。

@minisheep:registry=https://npm.minisheep.cn

然后在命令行中执行以下命令:

pnpm i @minisheep/mini-program-polyfill-core @minisheep/three-platform-adapter

它将会安装两个依赖,用于补全小程序执行环境缺失的一些 DOM / BOM / WEB API,和辅助开发的 rollup 插件。

详情请查看 mini-program-polyfill-corethree-platform-adapter 文档。

安装依赖后,首先你需要在你的 viterollup 配置文件中添加以下插件:

import threePlatformAdapter from '@minisheep/three-platform-adapter/plugin'; 
export default {
  plugins: [
    //...
    threePlatformAdapter() // 详细配置见使用文档
    //...
  ]
}

再根据对应小程序平台在项目入口按需添加以下代码:

微信小程序

import '@minisheep/mini-program-polyfill-core/wechat-polyfill'; // 微信专用
import { adapter } from '@minisheep/three-platform-adapter';
import { wechat } from '@minisheep/three-platform-adapter/wechat'; // 微信专用
// THREEGlobals 是插件中 prefixName 的默认值,你也可以改成你自己定义的
adapter.useAdapter(wechat).patch('THREEGlobals'); 

更多平台将在后续支持

然后你就能开始你的 three.js 开发之旅了。 不过与在 web 中进行开发相比,仍有一些小小的区别,请继续阅读。

创建一个场景

由于本项目并没有改变 three.js 的源码,所以在使用上和 官方文档 所描述的基本没有差异,
不过由于小程序环境不支持动态添加 dom 元素和只能异步获取元素的特性,所以在初始化 WebGLRenderer 的时候必须传递 canvas 对象。

我们在 @minisheep/three-platform-adapter 提供了 useCanvas api 用于返回基本标准(至少满足 three.js 用例)的 HTMLCanvasElement 以供 Renderer 使用。

例如 creating-a-scene 里的例子只需进行以下修改就可以完美运行,以在 uni-app 中运行为例:

main.vue

<script setup>
  import * as THREE from 'three';
  import { adapter } from '@minisheep/three-platform-adapter'; // [!code ++]

  adapter.useCanvas('#canvas').then(({ canvas, requestAnimationFrame }) => {  // [!code ++]
    const scene = new THREE.Scene();
    const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);//  [!code --]
    const camera = new THREE.PerspectiveCamera(75, canvas.clientWidth/canvas.clientHeight, 0.1, 1000);//  [!code ++]

    const renderer = new THREE.WebGLRenderer(); // [!code --]
    renderer.setSize(window.innerWidth, window.innerHeight); // [!code --]
    document.body.appendChild(renderer.domElement); // [!code --]
    const renderer = new THREE.WebGLRenderer({ canvas }); // [!code ++]
    renderer.setSize(canvas.clientWidth, canvas.clientHeight); // [!code ++]

    const geometry = new THREE.BoxGeometry(1, 1, 1);
    const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
    const cube = new THREE.Mesh(geometry, material);
    scene.add(cube);

    camera.position.z = 5;

    function animate() {
      requestAnimationFrame(animate);

      cube.rotation.x += 0.01;
      cube.rotation.y += 0.01;

      renderer.render(scene, camera);
    }

    animate();
  }); // [!code ++]
</script>

template

<template>
  <canvas type="webgl2" id="canvas"/>
</template>

css

<style>
  canvas {
    width: 100vw;
    height: 100vh;
  }
</style>

其他更详细的教程你可以查看官网

标签:code,adapter,three,js,优雅,minisheep,THREE
From: https://blog.csdn.net/qq_26482581/article/details/145180924

相关文章

  • JS — 输入与输出
    输入与输出输入:从HTML与用户的交互中输入信息,例如通过input、textarea等标签获取用户的键盘输入,通过click、hover等事件获取用户的鼠标输入。例如:<body>输入:<textareaclass="input"name=""id=""cols="30"rows="10"></textarea><......
  • 深入探索Vue.js 3中基于Composition API的动态组件开发
    在前端开发中,组件是构建用户界面的基础,而Vue.js作为一种流行的前端框架,也提供了灵活强大的组件机制。在本文中,我们将深入探索基于Vue.js3的CompositionAPI,开发一个动态组件加载的技术方案。这项技术对于那些需要高可维护性和按需加载的应用来说尤其重要。什么是动态组件加......
  • node.js基于的旅行社管理系统的设计与实现程序+论文 可用于毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于旅行社管理系统的设计与实现这一课题,在国内外已有不少相关研究。现有研究主要以旅游业务流程管理或旅游资源整合为主,专门针对将用户、景点分类、景......
  • node.js智慧校园外卖配送系统程序+论文 可用于毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于校园外卖配送系统的研究,现有研究多以校园配送的一般性流程或商业外卖配送系统在校园的应用为主,专门针对智慧校园外卖配送系统的研究较少 1。在国内......
  • Go 重写JSON序列化和反序列化方法
    packagemainimport( "encoding/json" "fmt" "log" "strings")typeStructsstruct{ Namestring`json:"name"` Genderint`json:"gender"`}//MarshalJSON重写序列化方法,如果gender是0则改为woman,......
  • 【Eel库】用于制作类似 Electron 的离线 HTML/JS GUI 应用程序
    简介Eel是一个简单的Python库,用于制作类似Electron的离线HTML/JSGUI应用程序,并可以完全访问Python功能和库。Eel托管一个本地Web服务器,让您可以标注Python中的函数,以便从JavaScript调用它们,反之亦然。Eel旨在简化编写简短和简单的GUI应用程序的过......
  • 【Node.js渗透】提取和分析 .asar 文件
    #Electron免责声明⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权!书接上回以及上上回,在了解了操作系统上基于Electron的应用程序的安装和识别过程后,我们将探讨提取Electro......
  • node.js酒店客房管理程序+论文 可用于毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于酒店客房管理的研究,现有研究多集中于酒店整体运营管理,专门针对酒店客房管理这一细分领域的深度研究较少。在国内外酒店行业迅速发展的背景下,酒店客......
  • node.js基于Web的课前问题导入系统程序+论文 可用于毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于Web课前问题导入系统的研究,现有研究主要集中在Web教育系统的整体构建方面,如教学资源管理、在线学习平台等。专门针对课前问题导入系统的研究较少。......
  • 深入浅出Node.js-4(详解网络通信)
    这篇文文章我们将详细讲解网络通信的整个流程当我们在浏览器中输入地址到浏览器返回页面给我们这中间究竟发生了什么?总的来说有以下六个点网络模型浏览器与服务器建立连接(三次握手)浏览器发送请求报文(HTTP协议)服务器返回响应报文(HTTP协议)浏览器渲染页面(看我之前的浏......