从Maya视图窗口中获取相机视角中所有的对象,可以利用OpenMaya和OpenMayaUI两个模块来完成此功能,首先需要指定相机,并通过遍历相机视口,来获取相机视口中的对象:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Auth0r: Mirror
# @Time: ----
# =========================================

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


def getObjInView(cam):
    # 添加相机到 MDagPath
    mdag_path = OpenMaya.MDagPath()
    sel = OpenMaya.MSelectionList()
    sel.add(cam)
    sel.getDagPath(0, mdag_path)

    # 遍历视口
    draw_traversal = OpenMayaUI.MDrawTraversal()

    # 创建视锥
    draw_traversal.setFrustum(mdag_path, cmds.getAttr("defaultResolution.width"),cmds.getAttr("defaultResolution.height"))
    draw_traversal.traverse()
    frustum_objs = []

    # Loop through obiects within frustum
    for i in range(draw_traversal.numberOfItems()):
        # 先返回shape, 所以需要先获取它的transforn
        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)
        # 获取物体的长名并且确保它是有效的transform
        obj = transform_dag_path.fullPathName()

        if cmds.objExists(obj):
            frustum_objs.append(obj)
            cmds.select(frustum_objs)


if __name__ == "__main__":
    # 需要指定相机
    cam = 'persp'  # 指定相机
    getObjInView(cam)