
要在 3ds Max 里把几条边弄成一样长,直觉做法是选中然后用缩放工具拉。这个做法在不规则几何上根本不成立。
缩放是相对变换:它按比例改变坐标,不按绝对长度。两条初始长度不同的边,用同一个缩放比例缩放之后还是不相等。要让它们相等,得各自算出需要缩多少——而 3ds Max 不显示边长。
另一个做法是用捕捉对齐:开边捕捉,把顶点吸到参考点上。这个在正交视图里可行,但一旦几何不共面,捕捉点在三维空间里的位置就不对了。
第三个做法是重建:删掉这段重画。这在结构简单时可行,但如果是已经做了倒角、挂了修改器的模型,重建成本很高。
这个脚本补的就是这块空白:它把边长变成一个可以读、可以写、可以复制的数值。有了这个能力,等长就变成「读一个、贴一批」,而不是一个几何推理问题。
二、三件事:读、贴、统一
官方描述里它做三件事:
复制粘贴边的长度。选中一条边,读出它的长度;选中另外若干条边,把这个长度贴上去。
统一(unify)一组边的长度。这是上面那个操作的批量版本,也是实际最常用的:选中一圈 edge loop,一次全部改成同一个长度(可以是第一条的长度,也可以是最大值/最小值/平均值)。
复制粘贴顶点之间或物体之间的距离。这条稍微不一样:它处理的是两个点(或者两个物体的轴心)之间的空间距离,可以把这个距离搬到别处作为参考。
第二条官方原文用的是「copy and paste (or unify) the length of one or more selected edges / edge loops」,落点在 edges 和 edge loops 两种选择单位上。Edge loop(边循环)是这一条的关键——因为硬表面的等长需求通常是以「一圈」为单位的,不是单条边。
第三条的用途偏测量:做布局时先量好一个间距,然后把这个间距套用到别处。这比在纸上记数字再手输更不容易错。
三、Edge loop 是这一条的核心单位
为什么专门提 edge loop 而不是「选中的边」?
因为建模的实际情况是:等长需求发生在循环上,不是孤立的一条边上。一段立方体拉伸出来的墙,它的每一圈边(loop)长度应该相等;一根管道,它的每个段长度应该相等;一个倒角结构,一圈边的长度全部相同。
如果工具只能处理单独选中的边,那么要处理一圈 20 条边,操作逻辑就不成立了——「统一成什么值」这个问题没有答案,因为你没有基准。
按 edge loop 处理就自动化了:选中一整圈,工具取这一圈的长度(如果它们本来就不相等,取某一个统计值),然后统一。一次操作解决一整段结构。
这也是细分曲面建模(boolean 后的清理、硬表面的拓扑规整)里最常遇到的需求:布尔运算出来的边长度全是不规则浮点数,看起来差不多,实际差几百倍精度,会导致后面的细分、UV 展开、甚至法线都出问题。统一长度是清理流程里的一步。
四、安装
包内 6 个文件,共 53,944 字节。结构是:
lengthTool_macro.mcr —— 宏脚本入口。
readme.txt —— 说明。
Polyhertz_Scripts/lengthTool/getLength.mse —— 取长度。
Polyhertz_Scripts/lengthTool/setLength.mse —— 设长度。
Polyhertz_Scripts/lengthTool/genericFunctions.mse —— 公共函数。
Polyhertz_Scripts/lengthTool/GUI.mse —— 界面。
安装(包内 readme 原文):
第一,把整个 Polyhertz_Scripts 文件夹复制到 3ds Max 安装目录下的 Scripts 目录里(也可以放在 Scripts 下的任何子目录,只要层级保持)。
第二,3ds Max 里 Run Script,选择 lengthTool_macro.mcr 打开。
第三,打开 Customize → Customize User Interface,在 Category 里找到对应分类(脚本里定义的),把动作拖到工具栏或分配快捷键。
装完重启一次 3ds Max,让 mse 被加载。
注意:脚本的文件组织是「一个主 mcr + 一个同名子目录里放 mse」,这个结构不能拆开——mcr 里引用的是相对路径。所以复制的时候要整块复制,不能只挑 mcr。
五、实际能用在哪些场景
建筑与室内:结构构件的等长。一段墙的分段、一排楼梯的踏步、重复的窗棂——这些在建模阶段如果长度不精确相等,渲染时会出现微小的错位或者接缝,而且越到后面越难查。
硬表面:布尔运算后的拓扑清理。这是最刚需的场景,前面已经说过。
产品渲染:同一件产品的不同配置(比如不同尺寸的同款),需要保持除某个维度外所有边长一致。
环境:重复元素(栅栏、砖块、绳索分段)的间距与长度统一。
游戏资产:需要在三角形数不变的前提下调整某些结构的比例,保持边长一致能避免拉伸造成的法线异常。
不适用的场景:需要按比例(而不是绝对值)缩放的结构——那用缩放工具就行;需要曲线等长(弧长)的场景——这个工具处理的是直线边长;需要精确到微米级的工程建模——MAXScript 的浮点精度和 3ds Max 的建模精度不适合这种场景。
六、价格与购买渠道
ScriptSpot 页面上的这个工具是免费下载的入口,但页面本身没有标价,也没有直接的购买链接,Homepage 指向 `https://gumroad.com/polyhertz`。
那个作者页当前显示「No products found」,看起来作者把产品都下架或者隐藏了。但单品页 https://gumroad.com/l/SWpsz 仍然在线,结构化数据里写着 price 10.0 USD、availability InStock,也就是说单品仍然可购买,只是不在作者页的产品列表里显示。
因此这个工具当前的官方价格是 $10 美元。
版本号要注意一个细节:ScriptSpot 页标的是 1.01,而我们包内是 v1.1。这可能是作者在 Gumroad 上发布了新版但没更新 ScriptSpot 页,也可能是包重命名时改了版本号。两种可能都无法从现有材料确认,所以这里如实写出这个不一致,不做猜测性断言。
ScriptSpot 页上显示 3 票、发布于 2021-03-22、更新于 2021-03-24;Gumroad 单品页没有版本号字段。
七、包内实际内容
本包 6 个文件,合计 53,944 字节:
lengthTool_macro.mcr —— 宏脚本,定义 macroScript。
readme.txt —— 安装说明。
Polyhertz_Scripts/lengthTool/getLength.mse —— 取长度逻辑。
Polyhertz_Scripts/lengthTool/setLength.mse —— 设长度逻辑。
Polyhertz_Scripts/lengthTool/genericFunctions.mse —— 公共函数库。
Polyhertz_Scripts/lengthTool/GUI.mse —— 界面。
六个文件对应一个清晰的分层:mcr 是入口、GUI 是界面、getLength / setLength 是两个核心逻辑、genericFunctions 是公共函数。这种拆分说明作者是按功能模块组织的,不是把所有代码堆在一个文件里。
全部是纯 MAXScript,没有 dll、没有编译产物、没有联网校验,所以理论上可以读源码改动。
原产品页:http://www.scriptspot.com/3ds-max/scripts/edge-loop-length-tool
封面图片来自作者官方产品页。本文为中文整理,功能与兼容性信息以作者官方页面与包内说明为准。资源仅供学习交流,商业使用请购买正版授权。















暂无评论内容