倾斜摄影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); // magicheader.writeUInt32LE(1, 4); // versionheader.writeUInt32LE(byteLength, 8); // byteLength - length of entire tile, including header, in bytesheader.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。

osgb转换为3dtiles
参考
1、3DTiles for UE4
2、3DTiles Validator
















