# 常规三维切片制作
使用3dmax打开模型后,将模型节点的位置信息批量导出,将模型坐标批量改为(0,0,0),然后批量导出模型为gltf或者glb文件;再使用该工具构建3dtiles。将模型信息上传后设置模型所在经纬度,下载生成的tileset.json和i3dm文件, 构造的i3dm切片使用了笛卡尔真实坐标,i3dm文件中未使用RTC_CENTER。3dmax中导出的每个模型对象对应一个i3dm文件,i3dm文件中会引用导出的glb文件。将他们放到同一个文件夹中就制成了3dtils文件。
# 适用场景
适用于分散的建筑模型群体,如:具有多栋楼房的社区,或者一片村落。因为i3dm中存储的坐标为由经纬度转换而来的真实笛卡尔坐标, 在i3dm文件中存储精度有限,只能精确到几十厘米,所以模型的位置误差也在几十厘米左右,如果模型节点之间的精度小于几十厘米, 使用该方法构造的模型,位置将会错乱。因此该脚本不适合需要紧密连接的模型,或者具有亚厘米精确位置的模型。
# 使用方法
使用3dmax打开模型,直接在3dmax中选择对象集合
在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
以上步骤导出的txt文件上传到该工具中,并生成下载切片压缩包
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 )
如果导出的模型为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')
解压下载的切片压缩包并和转换后的glb模型放在同一个文件目录中,这样就完成了切片制作工作,后续可以发布为切片服务,并在cesium中加载使用了。
只考虑Z轴旋转 →