3D问界—(MAYA脚本)让选择的点按照某个轴水平均匀排布

今天突然遇到了一个问题,像下边这幅图(正视图),如果模型上我已经卡好了线,突然需要对这些线进行均匀分布,该怎么办呢?当然重做也是一个办法,就是有点麻烦,所以我就想着,看能不能通过脚本来实现这个功能。

在这里插入图片描述


一、问题提出

(1)简化并提出问题

这里我用一个简单的模型来举例子,模型上边的线条是我已经卡好的,接下来我们的主要目的就是让这些线条实现均匀水平分布:

在这里插入图片描述

(2)这个问题的应用场景

如果能解决这个问题,倒是蛮有趣的,毕竟只要涉及建模必定涉及布线,虽说一开始布好线很重要,但是难免出现需要调整的情况,比如我们要做一把梳子,或者其他有重复部件的模型,那么对于线条的水平分布非常重要了。

在这里插入图片描述

二、关于脚本

(1)单线条拟合方向并均匀排布

经过尝试,单条线上点的均匀排布还是很稳定的。
在这里插入图片描述这里是脚本,直接粘贴进去运行就可以了,如果不知道怎么操作可以看一下我的这个文章:在MAYA中使用Python脚本进行批量轴居中(点击跳转)

import maya.cmds as cmds
import numpy as np

def fit_line(points):
    vectors = points[1:] - points[:-1]
    direction = np.mean(vectors, axis=0)
    direction /= np.linalg.norm(direction)
    centroid = np.mean(points, axis=0)
    return centroid, direction

def redistribute_points_along_line(points, point_on_line, direction):
    direction /= np.linalg.norm(direction)
    distances = np.dot(points - point_on_line, direction)
    min_distance = np.min(distances)
    max_distance = np.max(distances)
    new_distances = np.linspace(min_distance, max_distance, len(points))
    new_points = point_on_line + np.outer(new_distances, direction)
    return new_points

def main():
    selected_points = cmds.ls(selection=True, fl=True)
    if not selected_points:
        cmds.error("请先选择一些点。")
        return
    
    points = np.array([cmds.pointPosition(pt) for pt in selected_points])
    point_on_line, direction = fit_line(points)
    new_points = redistribute_points_along_line(points, point_on_line, direction)
    
    for pt, new_pt in zip(selected_points, new_points):
        cmds.xform(pt, ws=True, t=new_pt.tolist())

main()

(2)多线条拟合方向并均匀排布

抱歉,多线条拟合方向总是出错,截止目前我还没有找到解决办法(如果不告诉程序有几条线,它自己很难判断出来)

在这里插入图片描述在这里插入图片描述

但是没关系,因为已经有了一条边均匀排布了,我们可以使用软件自带的捕捉命令,参照已经好了的那组点,对每一组点进行调整,虽说不够完美,至少是前进了一小步。

在这里插入图片描述

1. 设置单位的位置

2. 长度单位

3. 角度单位

三、代码说明

  1. 计算相邻点之间的方向fit_line 函数通过计算相邻点之间的方向向量,并对这些方向向量进行平均,来确定总体方向。然后将其标准化。
  2. 均匀分布redistribute_points_along_line 函数沿着拟合的方向向量均匀分布这些点。首先计算每个点在拟合线上的投影距离,然后生成均匀分布的新距离,并根据这些距离计算新的点位置。
  3. 应用新位置main 函数获取选中的点位置,拟合方向并重新分布这些点,最后使用 cmds.xform 函数将点移动到新位置。

四、文章最后

注意咯,我在这里,有问题或有需要可以随时联系。
请添加图片描述(若找不到可以在DP类别下搜"第五设计")

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值