Maya – 通过 Python 在视口中选择对象

Rei*_*ata 3 python viewport maya

谁能帮我?是否可以使用Python编写一个脚本来自动选择Maya视口中的每个对象?

是否可以?

Gre*_*ell 5

尽管您必须使用 Maya 的 api 来完成此操作,但这是很有可能的。您可以用来OpenMayaUI.MDrawTraversal收集相机视锥体内的所有对象。

这可能看起来比使用更冗长OpenMaya.MGlobal.selectFromScreen,但它给你带来了一些好处:

  1. 您可以在任何相机上执行此操作,尽管它没有用作活动视图。
  2. 您可以在内存中执行所需的任何操作,而无需选择并强制重绘。
  3. OpenMaya.MGlobal.selectFromScreen将依赖于接口,这意味着不可能在 Maya 批处理作业上执行它。这对于任何一种情况都适用。

话虽如此,这里有一个示例,它将创建一堆随机框,创建一个观察它们的相机,然后选择相机视图内的所有框:

import random

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


# Create a new camera.
cam, cam_shape = cmds.camera()
cmds.move(15, 10, 15, cam)
cmds.rotate(-25, 45, 0, cam)
cmds.setAttr("{}.focalLength".format(cam), 70)
cmds.setAttr("{}.displayCameraFrustum".format(cam), True)

# Create a bunch of boxes at random positions.
val = 10
for i in range(50):
    new_cube, _ = cmds.polyCube()
    cmds.move(random.uniform(-val, val), random.uniform(-val, val), random.uniform(-val, val), new_cube)

# Add camera to MDagPath.
mdag_path = OpenMaya.MDagPath()
sel = OpenMaya.MSelectionList()
sel.add(cam)
sel.getDagPath(0, mdag_path)

# Create frustum object with camera.
draw_traversal = OpenMayaUI.MDrawTraversal()
draw_traversal.setFrustum(mdag_path, cmds.getAttr("defaultResolution.width"), cmds.getAttr("defaultResolution.height"))  # Use render's resolution.
draw_traversal.traverse()  # Traverse scene to get all objects in the camera's view.

frustum_objs = []

# Loop through objects within frustum.
for i in range(draw_traversal.numberOfItems()):
    # It will return shapes at first, so we need to fetch its transform.
    shape_dag_path = OpenMaya.MDagPath()
    draw_traversal.itemPath(i, shape_dag_path)
    transform_dag_path = OpenMaya.MDagPath()
    OpenMaya.MDagPath.getAPathTo(shape_dag_path.transform(), transform_dag_path)

    # Get object's long name and make sure it's a valid transform.
    obj = transform_dag_path.fullPathName()
    if cmds.objExists(obj):
        frustum_objs.append(obj)


# At this point we have a list of objects that we can filter by type and do whatever we want.
# In this case just select them.
cmds.select(frustum_objs)
Run Code Online (Sandbox Code Playgroud)

希望能给你一个更好的方向。