喵喵动画屋 - 探索Maya世界:基础教程、动画技巧、建模艺术与渲染技术。

MAYA中模型没有UV和不显示UV解决方法

大家好,今天我们来看下maya中模型没有UV或者不显示UV的解决办法

首先第一种情况是多UV集的问题,可能我们在UV设置下切换UV集就能把UV显示出来。

那么如果不是UV集的问题,那大概率就是我们的模型UV被删除了,就像上面的这个模型的UV一样。解决方法也很简单,我们只要选择模型,在创建菜单下选择“自动映射UV”,这个时候模型的UV就会重新创建出来了。

那么创建出来的UV,很多时候是拆分不合理的。当我们需要重新去分割的时候,我们需要右键进入线模式,框选所有的UV线,Shift+右键选择“移动并缝合UV”。这样我们的UV就成为了一个整体,我们再按照自己的方法去拆分UV就可以了。

maya中制作女性走路动画

首先我们先给角色固定一个基础pose,减少后面不必要的一些工作
对于双脚,我们尽量的向内靠拢,脚尖向两侧撇开,呈一个外八字

膝盖的向量我们要设置为不跟随,让它等于0

手臂和头我们同样的需要让它不跟随身体,全局设置为10

做完这些准备工作以后,我们就可以来制作动画了

首先我们制作的是24fps,25帧长度的循环动画,为了便于观看,我先在关键pose的地方记录上书签,红色是开始pose,交换pose,以及回到开始pose,白色我们用来标记其他关键pose。

现在我们我们制作第一个接触地面的pose,我们在第1帧,选中双脚和重心控制器,设置关键帧,重心我们重心适当的下压,我们调整腿部的pose,前脚即将踩地,后脚点地即将离开地面。那么这里我们要特别注意,不要把脚一开始做得太直了,要给后面做扭胯和重心变化留一些余地。

然后我们在第4帧设置第二个向下的关键pose,重心继续大幅度下压。前脚平踩地面,后脚离开地面。

然后我们在第7帧设置第三个过度pose,那么这个重心要比接触地面的重心还要高那么一点,前脚,位于重心下方,后脚做一个收的动作。

然后我们在第10帧设置第四个向上的pose,那么这个重心继续上移达到最高点,我们让这只脚继续向前,后脚我们继续向后,稍微垫一点脚尖。

然后我们在第13帧设置第五个踩地pose,它和我们的第一帧的重心是一样的,前脚和后脚也只是交换了位置。

那么往后的16帧,19帧,20帧都对应了前面的4帧,7帧,10帧的反pose,我们跟着做就可以了

然后第25帧结束,刚好是一个走路循环,我们可以把第一帧的pose复制过来用

现在下半身的pose已经摆好了,我们给双腿和重心开启前后循环,然后我们调整一下曲线,过渡不顺畅的地方我们做一下优化调整。

接着我们来处理滑步,这里我们就用这个python滑步工具来处理,还会使用的可以看我之前发布的视频或者点右上角观看。

我们踩地这帧获取位置,然后在即将离地的这帧获取位置,然后计算位移差。接着我们在第4帧开始修复滑步直到第13帧结束

另外这只脚,从16帧开始踩地,25帧结束,然后我们把第25帧复制到第1帧保持pose连续性

好了,接着我们要调节胯部和肢体的一些摇摆,我们选中手部控制器,头部,胸部,腰部,重心次级,以及跨步控制器,在第1帧,第13帧,第25帧设置关键帧。

那么这里我们的扭胯,可以参考这张图,这里画的很夸张,但是我们做的时候幅度可以不用这么大。前脚下落,所以我们的跨朝着抬脚的一侧倾斜。

那么这个腰部:它会朝着前脚的一侧旋转,这个角度为最大值

这个重心次级控制器:我们可以用来修正身体的整体倾斜程度

然后这个手部:我们先把甩手的最大幅度给它调整好,那么这个手,我做的是被动甩手,所以幅度不会非常大,太大了反而不自然,手指我们就不浪费时间去调了,我直接把它搞定了

调好了手部,我们就可以推测出胸部会朝着向后甩手的一侧去倾斜

最后,头部也要保持和躯体的协调,我们让它正常的平视前方就可以了

调好了第1帧,我们把pose复制到第25帧,保持连续性。然后我们接着把13帧调节一下, 思路和第1帧差不多,只是一些相反的pose,前脚下落,胯部朝着抬脚的一侧倾斜。腰部朝着前脚的一侧旋转,这个角度为最大值。重心次级控制器修正身体倾斜度。手部把甩手的最大幅度给它调整好。胸部会朝着向后甩手的一侧去倾斜。头部保持和躯体的协调,让它平视前方。

--------------------------------------------------------------------------------------------------

最后我们只要在第6帧和第18帧加上中间帧,基本上可以了。

我们先来调节第6帧,这里我们胯部发生一次极速转换,重力作用在踩地的这只脚,它托起了另一侧抬起的脚,所以我们要让胯部朝着抬脚的这侧倾斜,这样这个转换感觉马上就上来了。

那么,此时这个重心会朝着踩地的这只脚移动,于此同时它还会向前移动那么一点点

至于这个腰部,我们只需要配合这个重心,把它摆正了就可以了

头部我们可以先摆正,并且它会有一点微微的向下看的肢体配合,不要太多了

做完了这些,我们再来设置第18帧就简单了,因为又和第6帧是相反的动作,这里我们胯部发生一次极速转换,重力作用在踩地的这只脚,它托起了另一侧抬起的脚,所以我们要让胯部朝着抬脚的这侧倾斜。此时这个重心会朝着踩地的这只脚移动,于此同时它还会向前移动那么一点点。至于这个腰部,同样的配合重心把它摆正了就可以,头部我们也是让它有一点微微的向下看的肢体配合。

好了,做完了这些,我们需要把手在优化一下,让它跟随,看起来软一点。我们选中两只手臂,选中第1到第13帧,我们统一向后挪2帧,然后我们在第5帧设置关键帧,移动到第1帧,接着再把第1帧复制到最后一帧,保持连贯。肩部我们也顺便处理一下,这个滞后一帧就差不多了。

接着我们在第4帧,让手肘和手腕做一些滞后处理。然后我们再在16帧做滞后处理。

处理完之后,我们还可以给手指做一个抬手落下的展开动作,我们可以在第7帧和第19帧增加这个动作。

最后,我们再对所有控制器做一次曲线调节,让它们看起来过渡更顺滑。

好了,我们框选上部控制器曲线,开启前后循环,不合适的地方我们再做些调整。

好了,我们拍个屏来看下效果。那么做完了原地循环,我们就可以让它走出去看一下,这里我们把帧长度设置为50帧。

这里,我们重新获取一下位移差来设置大圈位移。我们接着把大圈设置为直线,然后执行循环并偏移。那么这里我刚才修复滑步的时候有一个操作的小失误:本应该在第1帧的位置修复,我选了第2帧,但是没关系,我们把这帧前移一帧就能对上了。

最后,我们设置下镜头位置,看下走出去的效果。

好了,那么基础动画到这里就结束了,后面我会给大家分享头发动力学的绑定,感兴趣的小伙伴可以关注我的频道,我们下期再见!

Maya屏蔽骨骼和表面选择+视图曲线和多边形显示:快捷键设置

int $stVal1 = `selectType -q -nurbsSurface`;
int $stVal2 = `selectType -q -nurbsSurface`;

if ($stVal1 == 0 && $stVal2 == 0) {
    selectMode -object;
    selectType -handle 1 -ikHandle 1 -joint 1 -nurbsCurve 1 -cos 1 -stroke 1 -nurbsSurface 1 -polymesh 1 -subdiv 1 -plane 1 -lattice 1 -cluster 1 -sculpt 1 -nonlinear 1 -particleShape 1 -emitter 1 -field 1 -spring 1 -rigidBody 1 -fluid 1 -hairSystem 1 -follicle 1 -nCloth 1 -nRigid 1 -dynamicConstraint 1 -rigidConstraint 1 -collisionModel 1 -light 1 -camera 1 -texture 1 -ikEndEffector 1 -locator 1 -dimension 1;
    selectType -byName gpuCache 1;
} else {
    selectMode -object;
    selectType -handle 1 -ikHandle 1 -joint 0 -nurbsCurve 1 -cos 1 -stroke 1 -nurbsSurface 0 -polymesh 0 -subdiv 0 -plane 0 -lattice 1 -cluster 1 -sculpt 1 -nonlinear 1 -particleShape 1 -emitter 1 -field 1 -spring 1 -rigidBody 1 -fluid 1 -hairSystem 1 -follicle 1 -nCloth 1 -nRigid 1 -dynamicConstraint 1 -rigidConstraint 1 -collisionModel 1 -light 1 -camera 1 -texture 1 -ikEndEffector 1 -locator 1 -dimension 1;
    selectType -byName gpuCache 0;
}

string $objType = "nurbsSurface";
string $currPanel = `getPanel -withFocus`;

modelEditor -e -allObjects off $currPanel;

{
    string $cv = `modelEditor -q -nurbsCurves $currPanel`;
    if ($cv == 1) {
        modelEditor -e -nurbsCurves off $currPanel;
    }
    if ($cv == 0) {
        modelEditor -e -nurbsCurves on $currPanel;
    }
}

{
    string $cv = `modelEditor -q -polymeshes $currPanel`;
    if ($cv == 1) {
        modelEditor -e -polymeshes off $currPanel;
    }
    if ($cv == 0) {
        modelEditor -e -polymeshes on $currPanel;
    }
}

Maya报错:Cannot find procedure “DCF_updateViewportList”.

"""
This will iterate all modelPanels and remove the "CgAbBlastPanelOptChangeCallback"
As such, after running this the following error should be fixed:
    // Error: line 1: Cannot find procedure "CgAbBlastPanelOptChangeCallback". //
"""

from maya import cmds

for model_panel in cmds.getPanel(typ="modelPanel"):
    
    # Get callback of the model editor
    callback = cmds.modelEditor(model_panel, query=True, editorChanged=True)
    
    # If the callback is the erroneous `CgAbBlastPanelOptChangeCallback`
    if callback == "CgAbBlastPanelOptChangeCallback":
        
        # Remove the callbacks from the editor
        cmds.modelEditor(model_panel, edit=True, editorChanged="")

Maya动画滑步修复工具,适用于常规绑定的人和动物模型

Python代码


import maya.cmds as cmds

def updateInfo(*args):
    selected_objects = cmds.ls(selection=True)
    if selected_objects:
        selected_object = selected_objects[0]
        
        current_frame = cmds.currentTime(query=True)
        translate_z = cmds.getAttr(selected_object + ".translateZ")
        
        cmds.floatField(currentFrameField, edit=True, value=current_frame)
        cmds.floatField(translateZField, edit=True, value=translate_z)
    else:
        cmds.confirmDialog(title="警告", message="请选择一个对象。", button="好")

def updateInfo1(*args):
    selected_objects = cmds.ls(selection=True)
    if selected_objects:
        selected_object = selected_objects[0]
        
        current_frame = cmds.currentTime(query=True)
        translate_z = cmds.getAttr(selected_object + ".translateZ")
        
        cmds.floatField(currentFrameField1, edit=True, value=current_frame)
        cmds.floatField(translateZField1, edit=True, value=translate_z)
    else:
        cmds.confirmDialog(title="警告", message="请选择一个对象。", button="好")

def calculateDifference(*args):
    translate_z1 = cmds.floatField(translateZField1, query=True, value=True)
    translate_z = cmds.floatField(translateZField, query=True, value=True)
    current_frame1 = cmds.floatField(currentFrameField1, query=True, value=True)
    current_frame = cmds.floatField(currentFrameField, query=True, value=True)
    
    result = (translate_z1 - translate_z) / (current_frame1 - current_frame)
    cmds.floatField(resultField, edit=True, value=result)

def applyNewTranslateZ(*args):
    selected_objects = cmds.ls(selection=True)
    if selected_objects:
        selected_object = selected_objects[0]
        
        new_translate_z = cmds.getAttr(selected_object + ".translateZ") + cmds.floatField(resultField, query=True, value=True)
        current_frame = cmds.currentTime(query=True)
        
        original_translate_z = cmds.getAttr(selected_object + ".translateZ", time=current_frame)
        
        cmds.currentTime(current_frame + 1, edit=True)
        
        cmds.setAttr(selected_object + ".translateZ", new_translate_z)
        
        cmds.setKeyframe(selected_object, attribute="translateZ", t=current_frame + 1, v=new_translate_z)

if cmds.window("myWindow", exists=True):
    cmds.deleteUI("myWindow")

window = cmds.window("myWindow", title="滑步修复工具@喵喵动画屋", widthHeight=(250, 350))
main_layout = cmds.columnLayout()

cmds.text(label="选定一个对象并点击下面的按钮来获取信息。")

cmds.rowLayout(numberOfColumns=2, columnWidth2=(120, 70))
cmds.text(label="当前关键帧:")
currentFrameField = cmds.floatField(value=0, precision=0, editable=False)
cmds.setParent("..")

cmds.rowLayout(numberOfColumns=2, columnWidth2=(120, 70))
cmds.text(label="位移Z:")
translateZField = cmds.floatField(value=0, precision=4, editable=False)
cmds.setParent("..")

cmds.button(label="获取起始帧信息", command=updateInfo)

cmds.separator(height=20, style="none")

cmds.rowLayout(numberOfColumns=2, columnWidth2=(120, 70))
cmds.text(label="当前关键帧:")
currentFrameField1 = cmds.floatField(value=0, precision=0, editable=False)
cmds.setParent("..")

cmds.rowLayout(numberOfColumns=2, columnWidth2=(120, 70))
cmds.text(label="位移Z:")
translateZField1 = cmds.floatField(value=0, precision=4, editable=False)
cmds.setParent("..")

cmds.button(label="获取结束帧信息", command=updateInfo1)

cmds.separator(height=20, style="none")

cmds.rowLayout(numberOfColumns=2, columnWidth2=(120, 70))
cmds.button(label="计算差值", command=calculateDifference)
resultField = cmds.floatField(value=0, precision=4, editable=False)
cmds.setParent("..")

cmds.separator(height=20, style="none")

cmds.rowLayout(numberOfColumns=2, columnWidth2=(120, 70))
cmds.button(label="开始修复滑步", command=applyNewTranslateZ)
cmds.setParent("..")

cmds.text(label="从“脚踩地”的这一帧开始修复,直到“脚离地”前一帧!", align="left")

cmds.showWindow(window)

Python code (English interface)


import maya.cmds as cmds

def updateInfo(*args):
    selected_objects = cmds.ls(selection=True)
    if selected_objects:
        selected_object = selected_objects[0]
        
        current_frame = cmds.currentTime(query=True)
        translate_z = cmds.getAttr(selected_object + ".translateZ")
        
        cmds.floatField(currentFrameField, edit=True, value=current_frame)
        cmds.floatField(translateZField, edit=True, value=translate_z)
    else:
        cmds.confirmDialog(title="Warning", message="Please select an object.", button="OK")

def updateInfo1(*args):
    selected_objects = cmds.ls(selection=True)
    if selected_objects:
        selected_object = selected_objects[0]
        
        current_frame = cmds.currentTime(query=True)
        translate_z = cmds.getAttr(selected_object + ".translateZ")
        
        cmds.floatField(currentFrameField1, edit=True, value=current_frame)
        cmds.floatField(translateZField1, edit=True, value=translate_z)
    else:
        cmds.confirmDialog(title="Warning", message="Please select an object.", button="OK")

def calculateDifference(*args):
    translate_z1 = cmds.floatField(translateZField1, query=True, value=True)
    translate_z = cmds.floatField(translateZField, query=True, value=True)
    current_frame1 = cmds.floatField(currentFrameField1, query=True, value=True)
    current_frame = cmds.floatField(currentFrameField, query=True, value=True)
    
    result = (translate_z1 - translate_z) / (current_frame1 - current_frame)
    cmds.floatField(resultField, edit=True, value=result)

def applyNewTranslateZ(*args):
    selected_objects = cmds.ls(selection=True)
    if selected_objects:
        selected_object = selected_objects[0]
        
        new_translate_z = cmds.getAttr(selected_object + ".translateZ") + cmds.floatField(resultField, query=True, value=True)
        current_frame = cmds.currentTime(query=True)
        
        original_translate_z = cmds.getAttr(selected_object + ".translateZ", time=current_frame)
        
        cmds.currentTime(current_frame + 1, edit=True)
        
        cmds.setAttr(selected_object + ".translateZ", new_translate_z)
        
        cmds.setKeyframe(selected_object, attribute="translateZ", t=current_frame + 1, v=new_translate_z)

if cmds.window("myWindow", exists=True):
    cmds.deleteUI("myWindow")

window = cmds.window("myWindow", title="Slide Fix Tool @ Meow Animation Studio", widthHeight=(250, 350))
main_layout = cmds.columnLayout()

cmds.text(label="Select an object and click the buttons below to get information.")

cmds.rowLayout(numberOfColumns=2, columnWidth2=(120, 70))
cmds.text(label="Current Frame:")
currentFrameField = cmds.floatField(value=0, precision=0, editable=False)
cmds.setParent("..")

cmds.rowLayout(numberOfColumns=2, columnWidth2=(120, 70))
cmds.text(label="Translate Z:")
translateZField = cmds.floatField(value=0, precision=4, editable=False)
cmds.setParent("..")

cmds.button(label="Get Start Frame Info", command=updateInfo)

cmds.separator(height=20, style="none")

cmds.rowLayout(numberOfColumns=2, columnWidth2=(120, 70))
cmds.text(label="Current Frame:")
currentFrameField1 = cmds.floatField(value=0, precision=0, editable=False)
cmds.setParent("..")

cmds.rowLayout(numberOfColumns=2, columnWidth2=(120, 70))
cmds.text(label="Translate Z:")
translateZField1 = cmds.floatField(value=0, precision=4, editable=False)
cmds.setParent("..")

cmds.button(label="Get End Frame Info", command=updateInfo1)

cmds.separator(height=20, style="none")

cmds.rowLayout(numberOfColumns=2, columnWidth2=(120, 70))
cmds.button(label="Calculate Difference", command=calculateDifference)
resultField = cmds.floatField(value=0, precision=4, editable=False)
cmds.setParent("..")

cmds.separator(height=20, style="none")

cmds.rowLayout(numberOfColumns=2, columnWidth2=(120, 70))
cmds.button(label="Start Slide Fix", command=applyNewTranslateZ)
cmds.setParent("..")

cmds.text(label="Start fixing from the frame where the foot touches the ground, until the frame just before the foot leaves the ground!", align="left")

cmds.showWindow(window)

Maya动画入门:一步步教你制作狗狗跑步动画!

3D动画:狗狗跑步参考图


狗狗跑步参考图

视频中所用的狗狗绑定模型来源:3D Pincher Dog - TurboSquid 1714212

免费版权狗狗绑定模型推荐:dog rig in maya free 3D model rigged | CGTrader

从第1帧开始,制作第1个关键pose,狗的前后脚单脚踩地,调整重心和头部角度。

在第3帧,制作第2个关键pose,前双脚踩地,后双脚离地,调整重心和头部角度。

在第5帧,制作第3个关键pose,一只前脚踩地,后脚离地,调整重心和头部角度。

在第7帧,制作第4个关键pose,一只后脚踩地,前脚离地,调整重心和头部角度。

在第9帧,制作第5个关键pose,后双脚踩地,前双脚离地,调整重心和头部角度。

第11帧回到第1帧的pose,复制第1帧的pose到第11帧,形成循环。

Maya 教学:Maya启动加载速度提升一倍

maya启动慢,进入软件界面卡顿解决办法:
在主菜单栏中,选择“窗口 → 设置/首选项 →插件管理器”(Windows → Settings/Preferences → Plug-in Manager),取消勾选bif四项,mash,xgen,mota,然后重启maya即可。

bif,
bifmeshio.mll

允许以逐帧 .bif 文件格式缓存多边形网格。请参见使用 BIF 格式缓存网格。


bifrostGraph.mll
激活适用于 Maya 的 Bifrost Extension,这是一个用于实现程序效果的基于节点的框架。


bifrostshellnode.mll、bifrostvisplugin.mll
激活 Bifröst 流体模拟框架。


mash,
MASH.mll 做mash动画的插件


xgen,
xgenToolkit.mll XGen 几何体实例化器 做毛发的插件


mtoa,
Mtoa.mll 阿诺德渲染器插件

Maya Advanced Skeleton 5 人物头发绑定

本次视频介绍人物头发的绑定。


1.打开骨骼透视,显示关节
2.创建并对齐骨骼
3.创建控制器,吸附到骨骼中心
4.把骨骼和控制器分别P给头部骨骼和控制
5.用控制器父对象约束对应的骨骼
6.选择所有骨骼加选头发,添加影响
7.绘制权重,解锁骨骼权重锁定
8.通过旋转角度来辅助绘制权重
9.测试最终绑定效果
10.通过高级骨骼绑定插件发布最终文件

1.身体绑定教程:https://youtu.be/EZPkVhTf2jw
2.乳房绑定教程:https://youtu.be/OR6ojxL1Sio
3.面部绑定教程:https://youtu.be/I-RuOuUBs9o
4.毛发绑定教材:https://youtu.be/LdYbtMcX9xw