玛雅HUD麻烦

时间:2016-12-15 10:39:16

标签: python maya hud

我为playblast创建脚本。我的视频需要一些HUD数据,如用户和场景名称,fps和当前帧......

首先我尝试headsUpDisplay()创建的HUD很好,但没有背景......我改变了HUD标签的颜色,但有时候没有背景就无法读取。

cmds.headsUpDisplay('HUDObjectSceneName', label='label TEXT', 
                    section=2, block=0, blockSize='large', 
                    dfs='large', labelFontSize='large')

其次我尝试使用hudButton()创建的HUD按钮 - 它们有背景。但我的标签之一 - 是当前时间。 headsUpDisplay()有'命令'来刷新和更改标签文本。但hudButton()没有此功能。

label = 'FPS: 25 FRAME:'
cmds.hudButton('HUDHelloButton3', s=9, b=0, vis=1, l=label, 
                bw=blockLen(label), lfs='large')

cmds.headsUpDisplay('HUDCurentFrame', label=label,
                     section=9, block=0, blockSize='large', dfs='large',
                     labelFontSize='large', atr=True, 
                     command=lambda: cmds.currentTime(query=True))

hudButton()有第二个麻烦 - 手动设置按钮的宽度。当我想要长标签时,我需要计算标签宽度。但HUD字体不固定,我不知道如何正确计算标签宽度(以像素为单位)。经过一些实验后,我创建了这个函数来计算宽度。它变得粗糙,但至少是这样:

def blockLen(label):
    FONT_WIDTH = 8
    THIN_WIDTH = 6
    BLOCK_ADD = 10
    thin_symbol = ' :,.!i[];:\'"|-'

    sum = BLOCK_ADD
    for x in label:
        sum += THIN_WIDTH if x in thin_symbol else FONT_WIDTH

    return sum

我需要HUD标签,背景和动态数据,如当前帧。但我找不到另一种创造方式呢?

PS。我尝试使用scriptJob()在时间更改时更改HUD按钮标签。但它没有与playblast合作......

3 个答案:

答案 0 :(得分:1)

运行动画时,

scriptJobs不会执行。如果您确实需要在播放期间更新hud,则可以从表达式内部触发更新。不幸的是,你必须从梅尔调用它。并保持尽可能轻,它将减慢观看动画的任何人的交互式播放。

您可能希望在播放器之前动态创建表达式,然后立即将其删除,这样就不会让它四处乱晃,以免打扰您的动画师。

您还可以通过创建设置为适当颜色的图像平面来避免使用HUD按钮。

答案 1 :(得分:0)

我的问题的一部分我决定。我没有找到如何直接更新按钮。我创建headsUpDisplay()没有标签 - 他能够更新。我强迫他改变hudButton()

上的文字
def frame_label():
    label = 'FPS: 24     FRAME: %s' % cmds.currentTime(query=True)
    cmds.hudButton('HUDCurentFrame', e=True, l=label)

# bottom-right: FPS and current frame info
cmds.headsUpDisplay('HUDCurentFrameInvisible', label='', 
                    section=9, block=1, blockSize='large', dfs='large',
                    labelFontSize='large', command=frame_label, atr=True)

cmds.hudButton('HUDCurentFrame', s=9, b=0, vis=1, l='', bw=200, lfs='large')

但我问题的第二部分没有解决。我无法计算文字大小(以像素为单位)。正确的解决方案是从Maya获取哪个字体用于HUD。然后我可以使用wx库来计算使用字体名称的文本宽度...

但是如何从Maya获取字体数据(名称,大小和装饰)?

答案 2 :(得分:0)

你的第二个问题: 我能够找到所需的字体数据(仅名称,大小),但如果您将视口渲染器更改为ViewPort 2.0而不是真正准确(更多黑客,无需投票) 并更改字体的大小,您将获得错误(也不会在默认渲染器上):

 # small display ui font size and display ui size
 cmds.displayPref(sfs=9, dfs=10) #font size
 cmds.savePref()

 Failed trying to load font: -*-helvetica-bold-normal-*-9-*-*-*-*-*-iso8859-1

所以使用的字体是 helvetica粗体,大​​小是相对的(你自己的输入或默认值,如cmds.optionVar(q="defaultFontSize")