【问题标题】:Maya HUD troublesMaya HUD 问题
【发布时间】:2016-12-22 02:54:35
【问题描述】:

我为播放预览创建脚本。我的视频需要一些 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 按钮标签。但它不适用于播放预览...

【问题讨论】:

    标签: python maya hud


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      我决定解决问题的一部分。我没有找到如何直接更新按钮。我创建没有标签的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 获取字体数据(名称、大小和装饰)?

      【讨论】:

        【解决方案3】:

        你的第二个问题: 如果您将视口渲染器更改为 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 bold 并且大小是相对的(你自己的输入或默认值,如cmds.optionVar(q="defaultFontSize")

        【讨论】:

        • 我在工作室使用 win 和 linux。我认为在 linux maya 中使用另一种字体,然后在 win 中(我一直使用 ViewPort 2.0 ......我试图找到如何直接从 maya 获取有关字体的数据。我不知道,可能在新版本的 maya 中另一种字体...
        • 我猜他们会选择两个平台都支持的字体类型,我也尝试过,我的意思是常规方式,但没有......他们会保留字体类型,100 %,但是你现在知道类型和大小了
        • 它在 windows 中的默认视口和 viewport2.0...。字体的高度相似,但宽度 - 不......我不知道它是否相同的字体......但它在一个 Maya 中有两种不同的大小以获得胜利
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-28
        • 1970-01-01
        • 2015-03-23
        • 1970-01-01
        • 2018-06-11
        • 2017-10-04
        相关资源
        最近更新 更多