【微信小程序 threejs】添加3d字体 + https合法性问题解决

demo例子

图例

直接上代码

引用

import * as THREE from '../../libs/three.weapp.js'

代码示例

 {
        const loader = new THREE.FontLoader();
        // promisify font loading
        function loadFont(url) {
            return new Promise((resolve, reject) => {
                loader.load(url, resolve, undefined, reject);
            });
        }

        async function doit() {
            const font = await loadFont('https://threejsfundamentals.org/threejs/resources/threejs/fonts/helvetiker_regular.typeface.json');
            const geometry = new THREE.TextBufferGeometry('three.js', {
                font: font,
                size: 3.0,
                height: .2,
                curveSegments: 12,
                bevelEnabled: true,
                bevelThickness: 0.15,
                bevelSize: .3,
                bevelSegments: 5,
            });
            const mesh = new THREE.Mesh(geometry, createMaterial());
            geometry.computeBoundingBox();
            geometry.boundingBox.getCenter(mesh.position).multiplyScalar(-1);

            const parent = new THREE.Object3D();
            parent.add(mesh);

            addObject(0, -3, parent);
        }
        doit();
    }
   //创建物体
    function createMaterial() {
      //Phong网格材质(MeshPhongMaterial)
        const material = new THREE.MeshPhongMaterial({
          //材质(Material) 基类
          //.side : 定义将要渲染哪一面 - 正面,背面或两者。 
          //->默认为THREE.FrontSide。其他选项有THREE.BackSide 和 THREE.DoubleSide。
            side: THREE.DoubleSide,
        });

        //h — 色相值处于0到1之间。hue value between 0.0 and 1.0
        //s — 饱和度值处于0到1之间。
        //l — 亮度值处于0到1之间。
        const hue = Math.random();
        const saturation = 1;
        const luminance = .5;
        material.color.setHSL(hue, saturation, luminance);

        return material;
    }

官方网址

网址:https://threejs.org/

FontLoader

引用

import { FontLoader } from 'three/addons/loaders/FontLoader.js';

代码示例

const loader = new FontLoader();
const font = loader.load(
	// 资源URL
	'fonts/helvetiker_bold.typeface.json',

	// onLoad回调
	function ( font ) {
		// do something with the font
		console.log( font );
	},

	// onProgress回调
	function ( xhr ) {
		console.log( (xhr.loaded / xhr.total * 100) + '% loaded' );
	},

	// onError回调
	function ( err ) {
		console.log( 'An error happened' );
	}
);

项目

项目是要在每个盒子旁加字,如下图:
7个盒子
所以要在盒子循环中加字

//循环
gltfScene.forEach((obj, index) => {
        obj.material.depthTest = false;
        obj.material.depthWrite = false;
        // obj.material.blending = THREE.AdditiveBlending;
        obj.material.color.set(0x0088ff);
        
        ...//在这加字
        }

import引用

拿到demolibs放到自己的项目下,详见我【微信小程序】借用demo的gltf引用

直接引用

import * as THREE from '../../libs/three.weapp.js'

代码

直接上代码

init(){
...
  //Phong网格材质(MeshPhongMaterial)
    material = new THREE.MeshPhongMaterial({
      side: THREE.DoubleSide,
    });
    //h — 色相值处于0到1之间。hue value between 0.0 and 1.0
    //s — 饱和度值处于0到1之间。
    //l — 亮度值处于0到1之间。
    const hue = Math.random();
    const saturation = 1;
    const luminance = .5;
    material.color.setHSL(hue, saturation, luminance);
 // Geometry

    const gltfLoader = new GLTFLoader();
    gltfLoader.load('https://xxx/static/electricity.glb', (gltf) => {
      root = gltf.scene;
      gltfScene = [...root.children];
      console.log(gltfScene); //c1-c7
      console.log(root); //scene
      gltfScene.shift()

      //forEach(带room)
      root.children.forEach((obj, index) => {
        obj.material.transparent = true;
        obj.material.opacity = 0.4;

        // obj.material.color.set(0xff8888);
        // obj.material.blending = THREE.AdditiveBlending;
      })
      //forEach
      gltfScene.forEach((obj, index) => {
        obj.material.depthTest = false;
        obj.material.depthWrite = false;
        // obj.material.blending = THREE.AdditiveBlending;
        obj.material.color.set(0x0088ff);

        const loader = new THREE.FontLoader();
        loader.load(
          // 资源URL
          'https://xxx/static/Arial.json',

          // onLoad回调
          function (font) {
            // do something with the font
            const geometry = new THREE.TextBufferGeometry('c' + (index + 1), {
              font: font,
              size: 1.5,
              height: .1,
              curveSegments: 12,
              bevelEnabled: true,
              bevelThickness: 0.05,
              bevelSize: .05,
              bevelSegments: 5,
            });
            // geometry.translate(0, 3, 0)
            geometry.rotateX(-45)
            const mesh = new THREE.Mesh(geometry, material);
            console.log(mesh);
            obj.add(mesh);
          }
        );
      })

      scene.add(root);
    });
}

重点

1.两个合并,不用asyncswaitpromise写,借助官方大框架
2.https会报错,不合法,在 微信公众平台 ,把自己设成 开发人员
进去之后找到 开发->开发管理服务器域名->修改
在这里插入图片描述
在这里插入图片描述
3.是想从c1-c7
不用数组,设index,用‘c’+(index+1)实现,index从0开始要+1

结果图例

在这里插入图片描述

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值