分析一个城市glb模型,程序化geojson白模贴图思路。

743 阅读1分钟

下图是一个城市glb模型,使用geojson通过程序化贴图得到的模型,内部包含了丰富的贴图。我们来分析下 他是如何贴图的。

image.png

拉近查看 image.png 点击中间建筑物后,查看到节点名是208,我们看到建筑物底部和顶部是一个mesh。
底部常见有门面房,大厅等。

image.png 既然是一个mesh用的材质是一个,我们来获取208的材质。代码来自Cursor

function convertToBase64(material) {
    const texture = material.map; // 获取材质的纹理
    if (texture && texture.image) {
        const canvas = document.createElement('canvas');
        const context = canvas.getContext('2d');

        // 设置画布大小
        canvas.width = texture.image.width;
        canvas.height = texture.image.height;

        // 将图像绘制到画布上
        context.drawImage(texture.image, 0, 0);

        // 获取 Base64 字符串
        const base64String = canvas.toDataURL('image/jpeg'); // 或 'image/png'
        console.log(base64String); // 输出 Base64 字符串
    } else {
        console.error('纹理图像未加载或不存在');
    }
}

底部和顶部通过定义uv坐标来使用下面的材质。高度上没有平铺贴图。横向设定一个窗户多少米,然后根据geojson polygon边的长度(米)计算uv坐标。

image.png

207的材质是楼面,也是定义好材质的宽高和建筑物轮廓的长度以及高度,计算uv贴图坐标。

image.png

总结一个楼栋的材质分为3部分楼顶、楼面、建筑底部和顶部。
假设建筑物是polygon1,程序上将polygon拆分为3部分。
1、中间平铺
2、顶部和底部 3、屋顶是一个平面。

在实际应用中,如果有5000个建筑物。根据高度或建筑物类型将建筑物分类贴图。 比如材质1是 行政大楼 材质2是 小区。将相同材质的建筑物放到一个mesh中。

image.png