你好,我在看了你帖子后准备开始使用Sublime学习MaxScript,它真的很好用。但有一个问题:我没法是sublime和max关联起来,只有当保存ms文件后才能正确的在max中运行。请问知道怎么解决这个问题吗?没有办法在网上对应的解决办法。 Reply
你好,关于这部分我确实漏掉了,网上找了个现成的英文教程,链接如下: http://www.designimage.co.uk/sublime-text-3dsmax-python/ 主要就是配置一个 sublime 的 maxscript 插件 另外我个人用的方法更偷懒一些,是在 max 工具栏里直接加一个正在编写的脚本的按钮,在每次修改脚本后点一下那个按钮来执行,方法是先把下面这个命令写在 listener 里,然后全选这段文字,鼠标左键拖拽到 3D 视图上方的工具栏,再改个自己喜欢的名字或图标 fileIn(@”你的脚本完整路径”) Reply
白老师您好,我最近在学习MoBu的Python脚本编写,遇到一个问题想要请教一下。我想实现在选中一根骨骼的时候,拉取被选中骨骼的空间名,并引用它,比如: rh = FBFindModelByLabelName( ‘Xxx:Hips’) rh.Selected = True rh.Selected = False rh.Rotation = FBVector3d(90,0,0) 我想要用当前选中骨骼的空间名来替换这个Xxx,代码应该怎么写呢。 Reply
你好,首先我不是很确定你所说的“空间名”具体含义是指什么,其次 ‘Xxx:Hips’ 应该是一个 rigging 的 hips 控制器名字对吧?其中的 Xxx 是这个 character 的名称,如果要改,就需要该整个 character 的名称,而不能单单在这一个控制器上改而其他的不变 Reply
首先感谢大佬的回复。举个例子,就是在MoBu里面有A/B两套带NameSpace的角色骨骼,我需要分别给这两套骨骼调整到标准的T-Pose来进行重定向。我写了一段代码来调整每根骨骼的旋转值,就是这一段(A指的是它的NameSpace,Hips是它其中的一根骨骼) rh = FBFindModelByLabelName( ‘A:Hips’) rh.Selected = True rh.Selected = False rh.Rotation = FBVector3d(90,0,0) 但是我如果要调整B角色的话,就需要再写一段同样的代码 rh = FBFindModelByLabelName( ‘B:Hips’) rh.Selected = True rh.Selected = False rh.Rotation = FBVector3d(90,0,0) 这样就很繁琐,因为每个项目的角色骨骼的空间名都是不一样的,每次都需要再单独写代码。所以我在想是不是有一段代码可以直接拉取当前场景中选中的骨骼的NameSpace来直接替代这个A/B,这样可以省去很多时间。 不知道这样描述,大佬是否能够明白我的意思。再次感谢大佬花时间来回复我这个小白的问题~~ Reply
我没有做过类似的功能,但简单 google 了一下,看到这个讨论应该是你要的 https://forums.autodesk.com/t5/motionbuilder-forum/finding-a-namespace-from-a-selected-character-from-a-drop-down/td-p/4227707 MB 的 python 似乎没有直接查找 namespace 的功能,只能手动解析物体名称来查找它的 namespace Reply
又来求助大佬了(捂脸)。 获取当前选中物体的空间名代码我在论坛搞到了,执行这段代码(选中物体的空间名是zhenchipeng) from pyfbsdk import * def GetSelModelNameSpace(): lSelModels = [] modelList = FBModelList() FBGetSelectedModels (modelList, None, True) for model in modelList: if model.Selected == True: lSelModels.extend( [ model.LongName.rsplit(‘:’, 1)[0] ] ) return lSelModels[0] myNameSpace = GetSelModelNameSpace() print (myNameSpace + ‘:Hips’) 得到结果 zhenchipeng:Hips 但是我在继续执行下面一段代码的时候并没有什么效果 rh = FBFindModelByLabelName( myNameSpace + ‘:Hips’ ) rh.Selected = True rh.Rotation = FBVector3d(90,0,0) #Lcl 不知道哪里出了问题,是myNameSpace + ‘:Hips’ 这里的语法么?希望可以得到大佬的解答。 Reply
rh = FBFindModelByLabelName( myNameSpace + ‘:Hips’ ) 这之后 print 一下 rh.Name 看是不是真的 get 到了,另外 FBFindModelByLabelName 返回的是个 List,你需要取的应该是其中第一个,所以语句需要改成 rh = FBFindModelByLabelName( myNameSpace + ‘:Hips’ )[0] 但还是要 print 来确认得到你要的东西 Reply
大佬,我又来了~上次的一键T-Pose脚本已经搞定了。感谢大佬的分享~~最近想要实现一个新的功能。 是这样的,已经T-Pose好的骨骼,从Browser里拖拽character给它角色化的话,量大起来就有些繁琐。我想既然已经可以一键T-Pose了,那么为什么不把角色化的功能也写一个按钮呢,然而苦于不知道这段代码应该怎么写。咳咳,查阅了很多案例,还是搞不定,想过来咨询一下大佬有没有什么解决思路~ Reply
http://docs.autodesk.com/MB/2014/ENU/MotionBuilder-SDK-Documentation/index.html?url=files/GUID-14801481-6BFB-4959-84A0-3148A79C3D7B.htm,topicNumber=d30e11843 这里有参考代码 Reply
感谢大佬~这段代码我看到过,应该还需要一个NameMap ,一直没搞明白怎么用。 下面分享一个链接, https://forums.autodesk.com/t5/motionbuilder-forum/how-to-characterize-a-skeleton/m-p/4570841#M8575 我在论坛找到一段代码,在测试中,如果有同样需求的小伙伴可以参考一下。 Reply
你好,我在看了你帖子后准备开始使用Sublime学习MaxScript,它真的很好用。但有一个问题:我没法是sublime和max关联起来,只有当保存ms文件后才能正确的在max中运行。请问知道怎么解决这个问题吗?没有办法在网上对应的解决办法。
你好,关于这部分我确实漏掉了,网上找了个现成的英文教程,链接如下:
http://www.designimage.co.uk/sublime-text-3dsmax-python/
主要就是配置一个 sublime 的 maxscript 插件
另外我个人用的方法更偷懒一些,是在 max 工具栏里直接加一个正在编写的脚本的按钮,在每次修改脚本后点一下那个按钮来执行,方法是先把下面这个命令写在 listener 里,然后全选这段文字,鼠标左键拖拽到 3D 视图上方的工具栏,再改个自己喜欢的名字或图标
fileIn(@”你的脚本完整路径”)
白老师您好,我最近在学习MoBu的Python脚本编写,遇到一个问题想要请教一下。我想实现在选中一根骨骼的时候,拉取被选中骨骼的空间名,并引用它,比如:
rh = FBFindModelByLabelName( ‘Xxx:Hips’)
rh.Selected = True
rh.Selected = False
rh.Rotation = FBVector3d(90,0,0)
我想要用当前选中骨骼的空间名来替换这个Xxx,代码应该怎么写呢。
你好,首先我不是很确定你所说的“空间名”具体含义是指什么,其次 ‘Xxx:Hips’ 应该是一个 rigging 的 hips 控制器名字对吧?其中的 Xxx 是这个 character 的名称,如果要改,就需要该整个 character 的名称,而不能单单在这一个控制器上改而其他的不变
首先感谢大佬的回复。举个例子,就是在MoBu里面有A/B两套带NameSpace的角色骨骼,我需要分别给这两套骨骼调整到标准的T-Pose来进行重定向。我写了一段代码来调整每根骨骼的旋转值,就是这一段(A指的是它的NameSpace,Hips是它其中的一根骨骼)
rh = FBFindModelByLabelName( ‘A:Hips’)
rh.Selected = True
rh.Selected = False
rh.Rotation = FBVector3d(90,0,0)
但是我如果要调整B角色的话,就需要再写一段同样的代码
rh = FBFindModelByLabelName( ‘B:Hips’)
rh.Selected = True
rh.Selected = False
rh.Rotation = FBVector3d(90,0,0)
这样就很繁琐,因为每个项目的角色骨骼的空间名都是不一样的,每次都需要再单独写代码。所以我在想是不是有一段代码可以直接拉取当前场景中选中的骨骼的NameSpace来直接替代这个A/B,这样可以省去很多时间。
不知道这样描述,大佬是否能够明白我的意思。再次感谢大佬花时间来回复我这个小白的问题~~
我没有做过类似的功能,但简单 google 了一下,看到这个讨论应该是你要的
https://forums.autodesk.com/t5/motionbuilder-forum/finding-a-namespace-from-a-selected-character-from-a-drop-down/td-p/4227707
MB 的 python 似乎没有直接查找 namespace 的功能,只能手动解析物体名称来查找它的 namespace
感谢大佬回复,我再找一些文档来研究一下。
又来求助大佬了(捂脸)。
获取当前选中物体的空间名代码我在论坛搞到了,执行这段代码(选中物体的空间名是zhenchipeng)
from pyfbsdk import *
def GetSelModelNameSpace():
lSelModels = []
modelList = FBModelList()
FBGetSelectedModels (modelList, None, True)
for model in modelList:
if model.Selected == True:
lSelModels.extend( [ model.LongName.rsplit(‘:’, 1)[0] ] )
return lSelModels[0]
myNameSpace = GetSelModelNameSpace()
print (myNameSpace + ‘:Hips’)
得到结果 zhenchipeng:Hips
但是我在继续执行下面一段代码的时候并没有什么效果
rh = FBFindModelByLabelName( myNameSpace + ‘:Hips’ )
rh.Selected = True
rh.Rotation = FBVector3d(90,0,0) #Lcl
不知道哪里出了问题,是myNameSpace + ‘:Hips’ 这里的语法么?希望可以得到大佬的解答。
rh = FBFindModelByLabelName( myNameSpace + ‘:Hips’ )
这之后 print 一下 rh.Name 看是不是真的 get 到了,另外 FBFindModelByLabelName 返回的是个 List,你需要取的应该是其中第一个,所以语句需要改成
rh = FBFindModelByLabelName( myNameSpace + ‘:Hips’ )[0]
但还是要 print 来确认得到你要的东西
大佬,我又来了~上次的一键T-Pose脚本已经搞定了。感谢大佬的分享~~最近想要实现一个新的功能。
是这样的,已经T-Pose好的骨骼,从Browser里拖拽character给它角色化的话,量大起来就有些繁琐。我想既然已经可以一键T-Pose了,那么为什么不把角色化的功能也写一个按钮呢,然而苦于不知道这段代码应该怎么写。咳咳,查阅了很多案例,还是搞不定,想过来咨询一下大佬有没有什么解决思路~
http://docs.autodesk.com/MB/2014/ENU/MotionBuilder-SDK-Documentation/index.html?url=files/GUID-14801481-6BFB-4959-84A0-3148A79C3D7B.htm,topicNumber=d30e11843
这里有参考代码
感谢大佬~这段代码我看到过,应该还需要一个NameMap ,一直没搞明白怎么用。
下面分享一个链接,
https://forums.autodesk.com/t5/motionbuilder-forum/how-to-characterize-a-skeleton/m-p/4570841#M8575
我在论坛找到一段代码,在测试中,如果有同样需求的小伙伴可以参考一下。
max的范例在自带的帮助文件里啊,甚至有详细的解释,个人觉得比maya丢一堆代码文件让你自己去熟悉更好
大佬能讲讲飘带的具体实现方法吗?
谢谢大佬
好久不见,一来就有东西学习,白老师太棒了!