# 常规三维切片制作

使用3dmax打开模型后,将模型节点的位置信息批量导出,将模型坐标批量改为(0,0,0),然后批量导出模型为gltf或者glb文件;再使用该工具构建3dtiles。将模型信息上传后设置模型所在经纬度,下载生成的tileset.json和i3dm文件, 构造的i3dm切片使用了笛卡尔真实坐标,i3dm文件中未使用RTC_CENTER。3dmax中导出的每个模型对象对应一个i3dm文件,i3dm文件中会引用导出的glb文件。将他们放到同一个文件夹中就制成了3dtils文件。

# 适用场景

适用于分散的建筑模型群体,如:具有多栋楼房的社区,或者一片村落。因为i3dm中存储的坐标为由经纬度转换而来的真实笛卡尔坐标, 在i3dm文件中存储精度有限,只能精确到几十厘米,所以模型的位置误差也在几十厘米左右,如果模型节点之间的精度小于几十厘米, 使用该方法构造的模型,位置将会错乱。因此该脚本不适合需要紧密连接的模型,或者具有亚厘米精确位置的模型。

# 使用方法

  1. 使用3dmax打开模型,直接在3dmax中选择对象集合

  2. 在3dmax中修改以下脚本中输出路径并执行,导出模型位置和范围信息

    点击查看代码
    import os
    import pymxs
    from pymxs import runtime as rt
    file_name = r"F:\Document\3dsMax\export\output_pos.txt"
    if os.path.exists(file_name): os.remove(file_name)
    for i in range(len(rt.selection)):
        data_list = [str(i), rt.selection[i].name,
                   str(rt.selection[i].pos.x),str(rt.selection[i].pos.y),str(rt.selection[i].pos.z),
                   str(rt.selection[i].max.x - rt.selection[i].min.x ),str(rt.selection[i].max.y - rt.selection[i].min.y), str(rt.selection[i].max.z - rt.selection[i].min.z)]
        content = ','.join(data_list)
        with open(file_name,'a+',encoding='utf-8') as file:
          file.write(content+ '\n')
    

    或者使用maxscript脚本

    点击查看代码
    --select $*???*
    --max select all
    selObj = selection as Array
    out_file = createfile "F:/Document/3dsMax/export/output_info.txt" encoding:#utf8
    for i=1 to selObj.count do(
        if classOf selObj[i] == 'Editable_mesh' do
            format "%;%;%;%\n" (i) (selObj[i].name) (selObj[i].pos) (selObj[i].max-selObj[i].min)to:out_file
    )
    close out_file
    
  3. 以上步骤导出的txt文件上传到该工具中,并生成下载切片压缩包

  4. 3dmax中批量导出模型,导出之前需要把模型坐标改为0,使用batchExportObj.ms 执行:

    点击查看代码
     selObj = selection as Array
     for i=1 to selObj.count do(
         select selObj[i]
         $.pos = [0,0,0]
         dir_path = "F:/Document/3dsMax/export"
         file_path = dir_path + "/" +($.name) +".fbx"
         exportfile file_path #noprompt selectedOnly:true
    )
    
  5. 如果导出的模型为glb可以直接使用,如果为其他格式需要批量转换为glb格式,如fbx批量转为glb的python代码如下:

    for root, dirs, files in os.walk(dir_path):
       for file in files:
           if '.fbx' in file:
               # fbx转为glb
               cmd = "fbx2gltf -i {0}.fbx -o {0}.glb".format(os.path.join(root, file[:-4])) 
               # gltf转为glb
               # cmd = "gltf-pipeline -i {0}.gltf -o {1} -d".format(os.path.join(root, file[:-5]), os.path.dirname(root) + '\\tempData\\' + file)
               print(cmd)
               os.system(cmd)
    
    print('finished batch_fbx2gltf')
    
  6. 解压下载的切片压缩包并和转换后的glb模型放在同一个文件目录中,这样就完成了切片制作工作,后续可以发布为切片服务,并在cesium中加载使用了。