倾斜摄影OSGB转换为3DTiles

倾斜摄影OSGB转换为3DTiles

情深不寿,慧极必伤。谦谦君子,温润如玉。

3DTiles validator

官方提供的3DTiles检验工具及相关工具箱。
在这里插入图片描述

feature table binary must be aligned to an 8-byte boundary

时代变迁,3DTiles b3dm 字节对齐由以前的4个字节变为8个字节。

如下所示:在生成b3dm需要首先进行字节对齐。

/**
 * Generates a new Buffer representing a b3dm asset.
 *
 * @param {Buffer} glbBuffer A buffer containing a binary glTF asset.
 * @param {Object} [featureTableJson] The feature table JSON.
 * @param {Buffer} [featureTableBinary] The feature table binary.
 * @param {Object} [batchTableJson] The batch table JSON.
 * @param {Buffer} [batchTableBinary] The batch table binary.
 * @returns {Buffer} Buffer representing the b3dm asset.
 */
function glbToB3dm(glbBuffer, featureTableJson, featureTableBinary, batchTableJson, batchTableBinary) {
    
    
    if (!defined(glbBuffer)) {
    
    
        throw new DeveloperError('glbBuffer is not defined.');
    }

    var headerByteLength = 28;
    var featureTableJsonBuffer = getJsonBufferPadded(featureTableJson, headerByteLength);
    var featureTableBinaryBuffer = getBufferPadded(featureTableBinary);
    var batchTableJsonBuffer = getJsonBufferPadded(batchTableJson);
    var batchTableBinaryBuffer = getBufferPadded(batchTableBinary);

    var byteLength = headerByteLength + featureTableJsonBuffer.length + featureTableBinaryBuffer.length + batchTableJsonBuffer.length + batchTableBinaryBuffer.length + glbBuffer.length;
    var header = Buffer.alloc(headerByteLength);
    header.write('b3dm', 0);                                    // magic
    header.writeUInt32LE(1, 4);                                 // version
    header.writeUInt32LE(byteLength, 8);                        // byteLength - length of entire tile, including header, in bytes
    header.writeUInt32LE(featureTableJsonBuffer.length, 12);    // featureTableJSONByteLength - length of feature table JSON section in bytes.
    header.writeUInt32LE(featureTableBinaryBuffer.length, 16);  // featureTableBinaryByteLength - length of feature table binary section in bytes.
    header.writeUInt32LE(batchTableJsonBuffer.length, 20);      // batchTableJSONByteLength - length of batch table JSON section in bytes. (0 for basic, no batches)
    header.writeUInt32LE(batchTableBinaryBuffer.length, 24);    // batchTableBinaryByteLength - length of batch table binary section in bytes. (0 for basic, no batches)

    return Buffer.concat([header, featureTableJsonBuffer, featureTableBinaryBuffer, batchTableJsonBuffer, batchTableBinaryBuffer, glbBuffer]);
}

字节对齐函数:getBufferPadded

/**
 * Pad the buffer to the next 8-byte boundary to ensure proper alignment for the section that follows.
 * Padding is not required by the 3D Tiles spec but is important when using Typed Arrays in JavaScript.
 *
 * @param {Buffer} buffer The buffer.
 * @param {Number} [byteOffset=0] The byte offset on which the buffer starts.
 * @returns {Buffer} The padded buffer.
 *
 * @private
 */
function getBufferPadded(buffer, byteOffset) {
    
    
    if (!defined(buffer)) {
    
    
        return Buffer.alloc(0);
    }

    byteOffset = defaultValue(byteOffset, 0);

    var boundary = 8;
    var byteLength = buffer.length;
    var remainder = (byteOffset + byteLength) % boundary;
    var padding = (remainder === 0) ? 0 : boundary - remainder;
    var emptyBuffer = Buffer.alloc(padding);
    return Buffer.concat([buffer, emptyBuffer]);
}

3DTiles

https://github.com/fanvanzh/3dtiles.git

号称:

The fastest tools for 3dtiles convert in the world!

简单使用:

3dtile.exe -f osgb -i E:\osgb_path -o E:\out_path

由于年代久远,生成的b3dm是以4字节对齐的。故,简单修改一下,就可通过3DTiles validator的校验。
在这里插入图片描述

测试

20多G的数据,耗时3000s。
在这里插入图片描述

扫描二维码关注公众号,回复: 14673540 查看本文章

osgb转换为3dtiles

参考

1、3DTiles for UE4
2、3DTiles Validator

猜你喜欢

转载自blog.csdn.net/mrbaolong/article/details/125772308