倾斜摄影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。
osgb转换为3dtiles