收藏
回答

2D/3D Marker AR加载 glb文件失败?

使用官方github上wechat-miniprogram/miniprogram-demo2dmarker-ar

demo加载glb文件失败。使用three.js的 GLTFLoader可以加载成功。

回答关注问题邀请回答
收藏

1 个回答

  • 阿白
    阿白
    2022-12-21
        GLTFParser.prototype.loadTexture = function(textureIndex) {
          var parser = this;
          var json = this.json;
          var options = this.options;
          var textureLoader = this.textureLoader;
          var URL = global.URL;
          var textureDef = json.textures[textureIndex];
          var textureExtensions = textureDef.extensions || {};
          var source;
          if (textureExtensions[EXTENSIONS.MSFT_TEXTURE_DDS]) {
            source = json.images[textureExtensions[EXTENSIONS.MSFT_TEXTURE_DDS].source]
          } else {
            source = json.images[textureDef.source]
          }
          var sourceURI = source.uri;
          var isObjectURL = false;
          if (source.bufferView !== undefined) {
            sourceURI = parser.getDependency('bufferView', source.bufferView).then(function(bufferView) {
              isObjectURL = false;
    		  var base64 = ArrayBufferToBase64(bufferView);
    		  var sourceURI = `data:${source.mimeType};base64,${base64}`;
              return sourceURI
            })
    

          }

    gltf-loader的这里改一下。然后自己定义个ArrayBufferToBase64的接口
    import { encode as ArrayBufferToBase64 } from '../../three-platformize/src/libs/base64-arraybuffer';
    export function encode(arrayBuffer) {
      var base64 = '';
    
    
      var bytes = new Uint8Array(arrayBuffer);
      var byteLength = bytes.byteLength;
      var byteRemainder = byteLength % 3;
      var mainLength = byteLength - byteRemainder;
    
    
      var a, b, c, d;
      var chunk;
    
    
      // Main loop deals with bytes in chunks of 3
      for (var i = 0; i < mainLength; i = i + 3) {
        // Combine the three bytes into a single integer
        chunk = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2];
    
    
        // Use bitmasks to extract 6-bit segments from the triplet
        a = (chunk & 16515072) >> 18; // 16515072 = (2^6 - 1) << 18
        b = (chunk & 258048) >> 12; // 258048   = (2^6 - 1) << 12
        c = (chunk & 4032) >> 6; // 4032     = (2^6 - 1) << 6
        d = chunk & 63; // 63       = 2^6 - 1
    
    
        // Convert the raw binary segments to the appropriate ASCII encoding
        base64 += chars[a] + chars[b] + chars[c] + chars[d];
      }
    
    
      // Deal with the remaining bytes and padding
      if (byteRemainder == 1) {
        chunk = bytes[mainLength];
    
    
        a = (chunk & 252) >> 2; // 252 = (2^6 - 1) << 2
    
    
        // Set the 4 least significant bits to zero
        b = (chunk & 3) << 4; // 3   = 2^2 - 1
    
    
        base64 += chars[a] + chars[b] + '==';
      } else if (byteRemainder == 2) {
        chunk = (bytes[mainLength] << 8) | bytes[mainLength + 1];
    
    
        a = (chunk & 64512) >> 10; // 64512 = (2^6 - 1) << 10
        b = (chunk & 1008) >> 4; // 1008  = (2^6 - 1) << 4
    
    
        // Set the 2 least significant bits to zero
        c = (chunk & 15) << 2; // 15    = 2^4 - 1
    
    
        base64 += chars[a] + chars[b] + chars[c] + '=';
      }
    
    
      return base64;
    }
    
    2022-12-21
    有用
    回复
登录 后发表内容