小程序版 Three.js 入门 Demo(完整可运行)

第一步:准备项目(前提)

  1. 确保你的小程序项目已安装 threejs-miniprogram:

    复制代码
    # 在项目根目录执行
    npm install threejs-miniprogram
    # 然后在微信开发者工具 → 工具 → 构建 npm
  2. 新建 / 替换 pages/index 下的 3 个文件:

第二步:index.wxml(仅需一个 Canvas)

复制代码
<!-- 必须加 type="webgl",小程序 3D 渲染核心 -->
<canvas 
  type="webgl" 
  id="cube-canvas" 
  style="width: 100%; height: 100vh;"
/>

第三步:index.wxss(极简样式)

复制代码
/* 去掉默认边距,让 Canvas 占满屏幕 */
page {
  margin: 0;
  padding: 0;
  width: 100%;
  height: 100vh;
}

第四步:index.js(核心代码,逐行注释)

复制代码
// 引入小程序版 Three.js 核心方法
import { createScopedThreejs } from 'threejs-miniprogram';

Page({
  data: {},
  // 页面渲染完成后初始化(小程序生命周期)
  onReady() {
    this.initThreeJS();
  },

  // 初始化 Three.js 核心逻辑
  initThreeJS() {
    // 1. 获取小程序 Canvas 节点(关键:小程序特有)
    const query = wx.createSelectorQuery().in(this);
    query.select('#cube-canvas').node((res) => {
      // 容错:防止 Canvas 获取失败
      if (!res || !res.node) {
        wx.showToast({ title: 'Canvas初始化失败', icon: 'none' });
        return;
      }
      const canvas = res.node;

      // 2. 创建小程序专属 Three.js 实例(核心区别:网页版不用这步)
      const THREE = createScopedThreejs(canvas);

      // 3. 适配高清屏(小程序/手机必备)
      const dpr = wx.getWindowInfo().pixelRatio;
      canvas.width = canvas.width * dpr;
      canvas.height = canvas.height * dpr;

      // ==================== 核心 5 件套(和网页版完全一致) ====================
      // ① 场景:3D 容器
      const scene = new THREE.Scene();
      scene.background = new THREE.Color(0xf0f0f0); // 浅灰色背景

      // ② 相机:透视相机
      const camera = new THREE.PerspectiveCamera(
        75,
        canvas.width / canvas.height, // 宽高比
        0.1,
        1000
      );
      camera.position.z = 5; // 相机后移,能看到立方体

      // ③ 渲染器:绑定 Canvas 节点
      const renderer = new THREE.WebGLRenderer({
        canvas: canvas,
        antialias: true // 抗锯齿
      });
      renderer.setSize(canvas.width / dpr, canvas.height / dpr); // 适配 dpr

      // ④ 创建立方体(几何 + 材质)
      const geometry = new THREE.BoxGeometry(1, 1, 1); // 立方体几何
      const material = new THREE.MeshStandardMaterial({
        color: 0x3498db,    // 蓝色
        metalness: 0.2,     // 轻微金属质感
        roughness: 0.4      // 哑光
      });
      const cube = new THREE.Mesh(geometry, material); // 组合成物体
      scene.add(cube); // 加到场景

      // ⑤ 灯光(必加!否则立方体黑的)
      const ambientLight = new THREE.AmbientLight(0xffffff, 1); // 环境光
      scene.add(ambientLight);
      const directionalLight = new THREE.DirectionalLight(0xffffff, 0.8); // 方向光
      directionalLight.position.set(3, 3, 3); // 灯光位置
      scene.add(directionalLight);

      // ==================== 动画循环(小程序版适配) ====================
      const animate = () => {
        // 旋转立方体
        cube.rotation.y += 0.01;
        cube.rotation.x += 0.01;

        // 渲染场景+相机
        renderer.render(scene, camera);

        // 小程序版 requestAnimationFrame(绑定 Canvas)
        canvas.requestAnimationFrame(animate);
      };
      // 启动动画
      animate();

      // ==================== 页面卸载时销毁资源(小程序性能优化) ====================
      this.onUnload(() => {
        renderer.dispose(); // 销毁渲染器,释放内存
      });
    }).exec();
  }
});

第五步:运行效果

  1. 微信开发者工具中编译项目;
  2. 你会看到:
    • 小程序页面全屏显示浅灰色背景;
    • 一个蓝色立方体自动旋转;
    • 立方体有光影立体感,边缘光滑;
    • 完全适配手机屏幕。
相关推荐
Martina_032117 小时前
AI生成的3D白模单帧没问题,镜头一移动就被挡?用6步检查遮挡与构图
图像处理·人工智能·数学建模·3d·ai·自然语言处理·游戏策划
wx1qq1com1 天前
一桩带几台车:共享租赁桩位配比、取电与结算闭环设计
物联网·微信小程序·小程序
2401_879692511 天前
微信小程序照相与摄像功能实现——chooseImage 与 chooseVideo 详解
微信小程序·小程序·notepad++
李纲明3 天前
微信小程序 getSystemInfo 提示已废弃、屏幕高度算错胶囊还对不齐?getWindowInfo 和 getDeviceInfo 怎么接才稳
javascript·微信小程序·小程序·小程序开发·devdiy
dreams_dream3 天前
微信小程序-使用npm包
微信小程序·小程序·npm
caoliaoerweima3 天前
草料二维码小程序上线活码编辑器:手机上也能编辑活码了
智能手机·小程序·编辑器·草料二维码
时间的情敌3 天前
Cesium 建筑单体化、3DTiles 分类、楼层显隐、分户高亮(BIM + 倾斜孪生高频)
前端·3d·cesium
加搜科技观察4 天前
哪个品牌 3D 相机好用?工业 3D 相机品牌选型评估指南
数码相机·3d
dreams_dream5 天前
微信小程序:页面事件-上拉触底
微信小程序·小程序
Martina_03216 天前
AI生成3D场景的霓虹灯一开就糊成光团?用6步检查Emissive、Bloom与曝光
人工智能·3d·ai·自然语言处理·游戏引擎·材质·贴图