近期热门
bone 选择基于父子排序

bone 选择基于父子排序

[复制链接]
424 0 1 0 36天前
软件插件脚本
软件类型: 3dsmax » 其它
分类: 脚本
版本与适用版本: 3dmax2020

-- ==============================================
-- 【全局递归函数】兼容2020
-- ==============================================
fn traverseBipedBone_GLOBAL currBone &validBones &sortedBones &processed =
(
    if (isValidNode currBone and classOf currBone == BoneGeometry and findItem validBones currBone > 0 and findItem processed currBone == 0) do
    (
        append sortedBones currBone       -- 先添加当前父骨骼
        append processed currBone        -- 标记已处理

        -- 遍历子骨骼:纯()写法
        for childBone in currBone.children do
        (
            if (classOf childBone == BoneGeometry) do
            (
                -- 递归调用,参数全显式传递
                traverseBipedBone_GLOBAL childBone &validBones &sortedBones &processed
            )
        )
    )
)

-- ==============================================
-- 【核心排序函数】
-- ==============================================
fn sortBipedBonesByHierarchy targetBones =
(
    -- 边界检查
    if (targetBones == undefined or targetBones.count == 0) then (return #())

    -- 步骤1:过滤+去重,仅保留有效Biped骨骼
    validBipedBones = #()
    for bone1 in targetBones do
    (
        if (isValidNode bone1 and classOf bone1 == BoneGeometry and findItem validBipedBones bone1 == 0) then
        (
            append validBipedBones bone1
        )
    )

    sortedBones = #()  -- 最终排序结果
    processed = #()    -- 去重标记

    -- 步骤2:优先处理根骨骼(无父/父非Biped骨骼)
    for bone1 in validBipedBones do
    (
        if (bone1.parent == undefined or classOf bone1.parent != BoneGeometry) then
        (
            -- 调用全局递归函数,全引用传参
            traverseBipedBone_GLOBAL bone1 &validBipedBones &sortedBones &processed
        )
    )

    -- 步骤3:补充处理未递归到的非根骨骼
    for bone1 in validBipedBones do
    (
        if (findItem processed bone1 == 0) then
        (
            traverseBipedBone_GLOBAL bone1 &validBipedBones &sortedBones &processed
        )
    )

    return sortedBones
)

-- ==============================================
-- 【快捷执行函数】
-- ==============================================
fn selectBipedBonesByHierarchy =
(
    -- 提取当前选中的所有Biped骨骼
    selectedBones = for obj in selection where (classOf obj == BoneGeometry) collect obj

    -- 按父子层级排序
    sortedBones = sortBipedBonesByHierarchy selectedBones

    -- 执行选中并反馈结果
    if (sortedBones.count > 0) then
    (
        select sortedBones
        print "========================================"
        print ("✅ 成功排序并选中 " + sortedBones.count as string + " 个Biped骨骼:")
        for i = 1 to sortedBones.count do
        (
            print ("  " + i as string + ". " + sortedBones[i].name)
        )
        print "========================================"
    )
    else
    (
        print "❌ 未检测到有效Biped骨骼!请先选中Biped骨骼后重试。"
    )

    return sortedBones
)

-- ==============================================
-- 【一键执行】直接运行此句即可
-- ==============================================

for a in selection do print a.name
selectBipedBonesByHierarchy()


1
点赞
0
打赏
0
添加到收藏夹

0

点击复制链接

使用微信扫码分享
一次扣10个券
全部评论0
您需要登录后才可以回帖 登录

暂无评论,去成为第一人吧
您当前使用的浏览器IE内核版本过低会导致网站显示错误

请使用高速内核浏览器或其他浏览器