当您在使用Maya进行3D建模时,经常需要处理UV展开。在今天的视频中,我们将为您介绍两种方法,让您轻松掌握如何拉直UV。首先,我们将使用Maya内置的拉直UV工具,然后,我们会展示一种更复杂情况下的解决方案,通过巧妙的UV分割和缝合,让UV完美无缺。 但最精彩的部分在最后!我们会向您展示一种最简便的方法,使用UVlayout插件,让UV展开和拉直变得异常流畅。不仅如此,UVlayout还提供了一键拉直UV的功能,无论您的UV有多复杂,都能轻松应对。 快来学习这些技巧,提高您在Maya中的UV处理效率,同时也享受创造性建模的乐趣。不仅流畅,还能让您的模型看起来更专业。立刻点击观看,了解UV处理的专业秘诀!
Maya 免费小猪模型资源:绑定模型无需版权费用
Maya 免费小猪模型资源:绑定模型无需版权费用
模型下载地址:Cartoon Pig Rig free VR / AR / low-poly 3D model animated rigged | CGTrader
Maya脚本:在Maya viewport视图中,模型显示为白色怎么去修复?
在Maya viewport视图中,模型显示为白色怎么去修复?通常针对这样的模型,重新指定材质是完全没用的。这里我们可以选择模型,执行这段修复代码就可以解决这个问题。
string $select_dd[] = `ls -shapes -sl`;
setAttr ($select_dd[0] + ".displayColors") 1;
setAttr ($select_dd[0] + ".displayColors") 0;
现在我们也能够给模型正常指定材质了那么目前,我也只知道这种修复方法。如果你有更好的解决方案,欢迎与大家分享!
maya教学:maya面部捕捉arkit工具
Hello!大家好!
今天我们来看下在maya中
怎么利用高级骨骼绑定插件配合苹果的ARkit套件实现面部动作的捕捉动画
那么要想把动作捕捉到我们的模型上
首先我们的绑定模型必须支持这个苹果标识的ARkit
如果我们是自己绑定的模型,我们需要在进行面部绑定的时候勾选这个ARkit功能
那么这里,我们需要在电脑端下载windows版的iFacialMocap
然后我们再在苹果手机上下载Tr结尾的免费版本就可以了
那么下载好以后,我们要保证我们的手机和电脑连接到同一个网络下
有网络代理的,我们需要把代理先关闭一下
首先我们在手机上打开软件后,上方会显示iPhone的IP地址
我们在电脑端打开软件,填入这个IP地址
接着我们展开高级设置,打开脚本
这里一个是通讯插件,一个是面部捕捉的绑定模型
我们直接把它们都拖到maya当中
然后我们展开这个模型组,选中根骨骼,移动到我们想要的位置
接着我们点击等待连接,它的作用是在maya和外部软件之间建立通讯
而这个外部软件又同时和手机建立通讯,以此来传输手机上捕捉的数据
好了,我们点击连接到maya
连接成功后,我们的这个人脸面具就会实时显示捕捉到的动作
我们现在打开高级骨骼绑定插件的脸部设置,选择连接到ARkit
我们选择面具的头部骨骼,点击选择头部旋转节点
然后点击连接到头部旋转,这样我们模型的头就能跟着旋转了
接着,我们点击下方的连接,面部表情就会跟着动
那么捕捉主要有两种方式
第一种:实时捕捉
那么这个虽然比较直接,但是缺点也比较明显
它可能会漏掉一些关键帧造成动画卡顿
那么这里我们选择从第一帧开始捕捉
准备好以后,我们点击烘焙动画,我们对着手机随便做几个表情动作
做完了之后,我们点击烘焙动画
那么现在我们的关键帧是在这个面具上的
我们只需要点击下方的烘焙按钮,才能真正的把关键帧转移到我们的模型上
我们拍个屏来看下效果
接着我们来说第二种捕捉方式,就是手机录制之后再烘焙动画
我们在手机上点击录制按钮,我们开始录制动画
录制完以后,我们先把面具头部骨骼和面具上的融合变形的关键帧给删除了
同样的,我们把头部控制器和ARkit控制器的帧删除了,然后归零
然后再次点击连接到头部以及面部表情
接着我们点击烘焙录制的动画
完成以后,我们同样的点击这个烘焙按钮就可以把动画转移到模型上
同样的,我们拍个屏来看下效果
那么这个效果其实还是不错了,感觉挺有意思的
感兴趣的小伙伴可以去试一下
好了,今天的视频就到这里,我们下期再见!
MAYA女性角色慢跑动画制作教程
今天我们来看下在玛雅中怎么去制作一个人物慢跑的动画。一样的,我们采用24FPS,17帧的长度来制作这个动画。
首先我们在关键帧的地方先标记上书签,方便我们K帧。
标记完以后,我们开始来制作第一个接触地面的关键pose,我们选择双腿和重心控制器,在第一帧设置关键帧。此时,我们重心下压制半蹲的状态,前脚刚好接触地面,后脚离开地面。
然后,我们再第4帧制作第二个向下的关键pose,此时,我们的重心大幅度的下压,前脚刚好踩到地面,后脚收至前脚关节的位置。
然后,我们再第6帧制作第三个向上的过渡pose,此时,我们的重心大幅度的向上,前脚向后垫一点脚尖,后脚持续向前移动。
那么在,第7帧,这里我们要单独对重心做一个微微上移的操作,一点点就好了。然后我们接着在第9帧制作第四个接触地面的关键pose,它与第1帧是相反的pose,动作都是一样的。
那么后面的第12帧、14帧、15帧、17帧都分别对应了前面的1帧、4帧、6帧、7帧和1帧,重心规律都一样,我们跟着做就可以了。第17帧,我们直接把第1帧的pose复制过来用。
这样,一个大概的跑步框架就被我们制作出来了。现在我们开始来修复滑步,我们打开Python滑步工具,我们在踩地的第1帧获取起始帧信息,然后在离开地面的第6帧获取结束帧信息。我们计算位移差,然后再第1帧开始修复,直到第6帧结束。另外这只脚,我们在踩地的第9帧开始修复,直到第14帧结束。这样我们滑步就修复好了。
那么这里。还存在一个问题就是从接触地面到完全踩地,我们只需要一帧完成,所以我们在脚接触地面的后一帧,把旋转参数设置为0,这样脚部的动作就自然了。
接着我们来处理这个脚,我们需要让它在踩地的时候位于人物下方,我们只要打开曲线图编辑器。我们需要处理这个控制平移的X轴,这里我们需要选中踩地的关键帧,然后统一的向内移动。另一只脚也是一样的,选中踩地的帧,然后,统一的向内移动。这个度需要我们自己去把握,最好两只脚比较接近就可以了。
接着,我们框选上半身的控制器,在第1帧,9帧,17帧设置关键帧,我们来调节一下剩余部分的动画。
首先我们选择次级重心控制器,前脚踩地,我们就朝着踩地的方向去倾斜。胯部朝着后脚的方向去旋转。腰部,我们做一个对应的次级重心的修正。接着我们把手臂的pose摆一下。胸部在修正身体基础pose的同时,我们需要它朝着向后手臂的方向旋转一些。头部我们让它正常的看向前方的路就可以了。
接着,我们在第9帧调第17帧的反pose,一样的,我们选择次级重心控制器,前脚踩地,我们就朝着踩地的方向去倾斜。胯部朝着后脚的方向去旋转。腰部,我们做一个对应的次级重心的修正。接着我们把手臂的pose摆一下。胸部在修正身体基础pose的同时,我们需要它朝着向后手臂的方向旋转一些。头部我们让它正常的看向前方的路就可以了。
那么第1帧和第17帧是一样的,我们直接把第17帧的关键帧复制过来。
那么到这里这个跑步的雏形就出来了,我们现在适当的插入一些中间帧,增加一些变化。
我们来到第4帧,那么此时,我们身体会保持平衡,重心会微微的向后一点。然后腰部和胸部,由于踩地会向前弓一点点。然后双肩向下,手臂也向下摆动,头部我们也跟着做一点校正。
与此对应的12帧,也是一样的。重心会微微的向后一点。然后腰部和胸部,由于踩地会向前弓一点点。然后双肩向下,手臂也向下摆动,然后是头部做一些调整。
然后,这个手腕,我们在它向前抬起的时候做一个跟随,这样我们的手就看起来要软一些。
接着我们把肩部的控制器滞后,向后挪1帧,然后再第3帧设置关键帧,移动到第1帧,然后再把第1帧复制到最后一帧,保持pose连续性。
最后我们框选所有的控制器,我们给它们开启前后循环,然后我们挨个给他们做曲线修复调整,让动作衔接更加自然流畅。
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脚本: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)