gpt4 book ai didi

c# - 如何在 Maya 中实现 MObject 选择器

转载 作者:行者123 更新时间:2023-11-28 04:09:28 29 4
gpt4 key购买 nike

我有一个在 Maya 中运行的插件,需要对场景中的对象执行“滴管”测试。我的插件作为托管 WPF 控件运行,因此我有一个 C# 按钮事件回调,它希望以模式方式运行,直到执行命中或按下转义符。这在 3D Studio Max 中很容易做到,但我不知道如何在 Maya 中做到这一点。

有什么建议吗?

最佳答案

我确实想念 3dsMax 中的那个,但据我所知,不,没有内置功能可以做到这一点。

Maya 中的大多数工具在执行之前就已经有了选择,因此该工具可以使用 cmds.ls(sl=True) 来捕获选择并执行验证。

可以做的是通过使用选择回调来模拟对象选择器。有cmds.scriptJob,但是使用OpenMaya的回调更高效。下面是一个使用类来存储回调的 ID 并自动管理它的示例:

import maya.cmds as cmds
import maya.OpenMaya as OpenMaya


class ObjectPicker():

_id = None # Store callback's id here.

def __init__(self):
# When this class is created, add the callback.
OpenMaya.MGlobal.displayWarning("Please pick an object")
ObjectPicker.add_callback()

@staticmethod
def on_selection_changed(*args):
# This gets triggered from the callback when the user changes the selection.
# Auto-remove the callaback afterwards.
print "Selection:", cmds.ls(sl=True)
ObjectPicker.remove_callback()

@staticmethod
def add_callback():
# First remove any existing callback, then store the id in this class.
ObjectPicker.remove_callback()
ObjectPicker._id = OpenMaya.MEventMessage.addEventCallback("SelectionChanged", ObjectPicker.on_selection_changed)

@staticmethod
def remove_callback():
# Remove the callback so it stops triggering the function.
if ObjectPicker._id is not None:
OpenMaya.MEventMessage.removeCallback(ObjectPicker._id)
ObjectPicker._id = None


# After calling this, pick a new object then it will print it in the Script Editor.
picker = ObjectPicker()

在使用 picker = ObjectPicker() 创建类的新实例后,将弹出警告提示用户选择对象。选择更改后,它会触发回调,将选择打印到脚本编辑器,然后删除自己的回调。

我认为这可能有效,但 Maya 不是 3dsMax,最终最好不要强制一个软件像另一个软件一样工作。所以我会考虑坚持使用每个人都已经习惯的方法,即与用户当前的选择一起使用。

编辑:抱歉刚刚注意到 c++ 标签,但同样的概念应该适用。

编辑#2:我刚刚了解到命令 cmds.scriptCtx ,所以选择器确实存在!我认为这是一个较旧的命令,因为它似乎只支持 MEL,而且实现起来感觉不太好。如果您想了解更多信息,请check out my answer to another question.

关于c# - 如何在 Maya 中实现 MObject 选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58125636/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com