从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)