zsz98781 发表于 2021-5-23 22:38

max表情样条线控制器的制作

总体来说:先创建:变量和positionxyz共同作用的功能,把圆限制在四方形内运动。                              然后用wire功把圆圈来控制变形骨骼的位置移动,限制运动的幅度。                                  这样positionxyz可以移动圆圈,变量又可以实现控制和UI的功能。
先画一个方形,再在里面画一个小圆形。把圆作为方框的子物体。
选择圆形,在position xyz的上面postion里加position list再选择avaliable,加入position script。
选择position script,运行代码 def=attributes ctrl(                            parameters ctrlP            (                                  l type:#float                w type:#float                x type:#float                                y type:#float                   ))                      custAttributes.add $.pos.controller.controller def      def=custAttributes.getdef $.pos.controller.controller.ctrl然后得到ctrl下面四个变量 双击position Scipt分支,在scriptcontrol窗口贴入代码:x=0y=0l=this.l/2w=this.w/2if this.x>w then(x=-this.x+w;this.x=w)if this.x<-w then(x=-this.x-w;this.x=-w)if this.y>l then(y=-this.y+l;this.y=l)if this.y<-l then(y=-this.y-l;this.y=-l)[ x, y, 0 ]再用方形的length和width,用wire的方式驱动ctrl的l和w,点connect。    监听下变量,看是不是等于方框的length和width 确认准确后,再用右键菜单的wire自己的positionX,和positionY链接到ctrl的x,y上。 然后重要的一点,就是要把圆父子绑定到方框上。拖动圆看看,这样圆就可以在方框的范围内限制运动了。 如果卡住拖不动,记得切换这里的默认值,列表选择positionXYZ 那接下来如何用圆控制骨头呢?先切换到父物体坐标。参考圆圈和需要绑定的变形骨骼的上下轴向是x,还是y。还是z 用wire参数链接它们。 拽下看看。发现拽的太远了。先ctrl+z返回到初始值。 按alt+1添加参数控制器给圆物体,这个Xoffset,和Yoffset用来纠正偏移wire链接加入xoffset和yoffset的偏移变量Y_Position+$.baseObject.Custom_Attributes.yOffset X_Position+$.baseObject.Custom_Attributes.xOffset把参数复位为0后对圆物体上的滑块进行偏移数值的微调。不时点update看纠正的效果,骨骼点回到原来的位置为ok,这两个补偿参数其实不加到物体外面来也行。但是你要做个补偿。让圆在0,0的位置时候,骨骼也在它原始本来应该的位置------------------------------------------------------------------------------------------------------------------------------------最后,我们再需要做个数值限定,让圆拽着骨骼别跑的太远。MyValue= Y_Position+$.baseObject.Custom_Attributes.yOffset   case of(   (MyValue>= 10):5.5    --当大于某值时返回一个值   (MyValue<= -10): -5.5   --当大于某值时返回一个值   default: MyValue)




zsz98781 发表于 2024-11-27 20:52

--直接选择蒙皮修改器里的顶点生成控制器
-- 获取应用了Skin修改器的对象
obj = selection
-- 获取Skin修改器
skinMod = obj.modifiers[#skin]
-- 获取顶点数量
numVerts = skinOps.GetNumberVertices skinMod
-- 用于累积所选顶点位置的总和
selectedVertsPosSum =
-- 用于计数所选顶点的数量
selectedVertsCount = 0
-- 遍历顶点
for i = 1 to numVerts do (
    -- 检查顶点是否被选中
    if (skinOps.IsVertexSelected skinMod i ) then (
      -- 获取顶点位置
      vertPos = (polyop.getVert obj i)
      -- 将顶点位置累加到总和中
      selectedVertsPosSum += vertPos.x
      selectedVertsPosSum += vertPos.y
      selectedVertsPosSum += vertPos.z
      -- 增加所选顶点的计数
      selectedVertsCount += 1
    )
)
-- 计算平均位置
if (selectedVertsCount > 0) then (
    averagePos = [(selectedVertsPosSum/selectedVertsCount), (selectedVertsPosSum/selectedVertsCount), (selectedVertsPosSum/selectedVertsCount)]

        b0=boneSys.createBone averagePos averagePos averagePos
        b0.name="ctl1"
        b0.width =1
        b0.height=1       
        b0.length=1       
       
        aaa=Rectangle length:10 width:10 cornerRadius:1 position: rotation: (eulerAngles -90 0 0)name:"Rectangle_ctl"wirecolor:(color 250 230 100)
        target=$*head
        aaa.parent=target
        -- 设置Rectangle的z轴不能移动
        Lock = #{}
        appendIfUnique Lock 3
        setTransformLockFlags aaa Lock
        bbb=circle radius:2 position: rotation: (eulerAngles -90 0 0) name:"cycle_ctl"
        bbb.parent=aaa
        -- 设置circle的z轴不能移动
        Lock = #{}
        appendIfUnique Lock 3
        setTransformLockFlags bbb Lock
       
        b0.parent=target
       
        -- 创建位置约束标签
        b0.pos.controller = Position_Constraint()
        A = b0.pos.controller
        -- 将bbb添加为位置约束的目标
        A.appendtarget bbb 100
        -- 设置保持初始偏移(根据3ds Max的API,这个参数可能需要根据实际情况调整)
        A.relative = on
       
    -- 将骨骼b0添加到Skin修改器的骨骼列表中
        skinOps.addBone $.modifiers[#Skin] b0 1
       
        boneNames = for i=1 to (skinOps.GetNumberBones skinMod) collect (skinOps.GetBoneName skinMod i 0)
        boneIndex = findItem boneNames "ctl1"
       
    -- 遍历选中的顶点,给它们设置权重为50%(0.5)
        for i = 1 to numVerts do (
                if (skinOps.IsVertexSelected skinMod i ) then (
                        -- 设置顶点对于骨骼b0的权重,这里假设Skin修改器有类似setVertexWeight的函数来设置权重(需根据实际调整)
                        skinOps.SetVertexWeights skinMod i boneIndex 0.5
                )
        )
        ctl = $cycle_ctl
        ctl.position.controller= Position_List()
        controllers = ctl.position.controller
        --创建script控制器
        controllers.controller =position_script ()
        --创建ctrl的l,w,x,y自定义属性
        def=attributes ctrl
        (                     
                        parameters ctrlP      
                        (                  
                                        l type:#float
                                        w type:#float
                                        x type:#float               
                                        y type:#float   
                                        )
        )
        custAttributes.add controllers.controller def
        def=custAttributes.getdef controllers.controller.ctrl               
        -- 获取对象的位置轨迹下的script控制器,填入内容
                if controllers.count >= 2 and controllers.name == "Position Script" do
        (
                codeContent = "x=0\ny=0\nl=this.l/2\nprint(this.l)\nw=this.w/2\nif this.x>w then(x=-this.x+w;this.x=w)\nif this.x<-w then(x=-this.x-w;this.x=-w)\nif this.y>l then(y=-this.y+l;this.y=l)\nif this.y<-l then(y=-this.y-l;this.y=-l)\n[ x, y, 0 ]"
                controllers.script= codeContent
        )
        --创建wire约束,让圆圈不能超出方形的边界
        A = $Rectangle_ctl.baseObject[#Length]
        B = $cycle_ctl.position.controller.controller.ctrl[#l]
        paramWire.connect A B "Length"
        A = $Rectangle_ctl.baseObject[#Width]
        B = $cycle_ctl.position.controller.controller.ctrl[#w]
        paramWire.connect A B "Width"       
        A = $cycle_ctl.position.controller.controller[#X_Position]
        B = $cycle_ctl.position.controller.controller.ctrl[#x]
        paramWire.connect A B "X_Position"
        A = $cycle_ctl.position.controller.controller[#Y_Position]
        B = $cycle_ctl.position.controller.controller.ctrl[#y]
        paramWire.connect A B "Y_Position"
        ctl = undefined
)
else (
    print "没有选中顶点。"
)

百虎丶 发表于 2023-5-16 14:07

为什么我的曲线编辑器没有xy的选项

zhengyongpu 发表于 2022-3-27 19:58

可以搞个视频吗,看着好麻烦

zsz98781 发表于 2021-11-12 10:59

wire也可以用reaction manager来控制


Anim觊觎 发表于 2021-9-6 11:54

跟着步骤做 圆卡不在方框里是怎么回事 ?

Li_17 发表于 2021-7-27 20:00

有插件么

吹散/kf 发表于 2021-7-9 18:21

看着不错的样子

不三不四 发表于 2021-7-9 17:09

多谢分享

Li_17 发表于 2021-7-8 10:49

谢谢分享
页: [1] 2
查看完整版本: max表情样条线控制器的制作