def boundingBox(self): block = self.forceCache() lowerHandle = block.inputValue(self.boundingBoxCorner1) upperHandle = block.inputValue(self.boundingBoxCorner2) corner1 = OpenMaya.MPoint(*lowerHandle.asDouble3()) corner2 = OpenMaya.MPoint(*upperHandle.asDouble3()) return OpenMaya.MBoundingBox(corner1, corner2)
def getShapeBounds(shape): boundingBox = om.MBoundingBox() for item in shape.values(): for point in item: boundingBox.expand(point) return boundingBox
def __init__(self, obj): omr.MPxDrawOverride.__init__(self, obj, footPrintDrawOverride.draw) ## We want to perform custom bounding box drawing ## so return True so that the internal rendering code ## will not draw it for us. self.mCustomBoxDraw = True self.mCurrentBoundingBox = om.MBoundingBox()
def addUIDrawables(self, objPath, drawManager, frameContext, data): if not isinstance(data, GuideSpineData): return normalVector = OpenMaya.MVector([1.0, 0.0, 0.0]) bounding = OpenMaya.MBoundingBox(data.boundingBoxCorner1, data.boundingBoxCorner2) up = OpenMaya.MVector.kYaxisVector width = bounding.depth / 2.0 height = bounding.height / 2.0 dormantBorderColor = OpenMaya.MColor([0.0, 0.0, 0.8, 1.0]) leadBorderColor = OpenMaya.MColor([1.0, 1.0, 1.0, 1.0]) activeBorderColor = OpenMaya.MColor([0.4, 0.8, 1.0, 1.0]) lineColor = OpenMaya.MColor([1.0, 1.0, 1.0, 1.0]) fillColor = OpenMaya.MColor([0.0, 0.0, 1.0, 1.0]) fillColor.a = 0.4 borderWidth = 1.0 lineWidth = 2.0 displayStatus = OpenMayaRender.MGeometryUtilities.displayStatus( objPath) selected = True if displayStatus == util.DisplayStatus.Lead: borderColor = leadBorderColor borderWidth = 2.0 elif displayStatus == util.DisplayStatus.Active: borderColor = activeBorderColor borderWidth = 2.0 else: # kActiveAffected, kDormant, kHilite. borderColor = dormantBorderColor borderWidth = 1.0 selected = False drawManager.beginDrawable() drawManager.setColor(borderColor) drawManager.setLineWidth(borderWidth) drawManager.rect(bounding.center, up, normalVector, width, height, filled=False) # drawManager.setColor(fillColor) # drawManager.rect(bounding.center, up, normalVector, width, height, filled=True) # drawManager.setColor(OpenMaya.MColor([1.0, 1.0, 1.0, 1.0])) # for position in data.outputPoints: # drawManager.sphere(position, 0.5, filled=False) drawManager.endDrawable()
def get_inter_bbox(bbox1, bbox2): if not bbox1.intersects(bbox2): return None inter_min_x = max(bbox1.min().x, bbox2.min().x) inter_min_y = max(bbox1.min().y, bbox2.min().y) inter_min_z = max(bbox1.min().z, bbox2.min().z) inter_min = om.MPoint(inter_min_x, inter_min_y, inter_min_z, 1.0) inter_max_x = min(bbox1.max().x, bbox2.max().x) inter_max_y = min(bbox1.max().y, bbox2.max().y) inter_max_z = min(bbox1.max().z, bbox2.max().z) inter_max = om.MPoint(inter_max_x, inter_max_y, inter_max_z, 1.0) return om.MBoundingBox(inter_min, inter_max)
def boundingBox(self): ## Get the size ## thisNode = self.thisMObject() plug = om.MPlug(thisNode, footPrint.size) sizeVal = plug.asMDistance() multiplier = sizeVal.asCentimeters() corner1 = om.MPoint(-0.17, 0.0, -0.7) corner2 = om.MPoint(0.17, 0.0, 0.3) corner1 *= multiplier corner2 *= multiplier return om.MBoundingBox(corner1, corner2)
def getBoundingBox(self): """ 選択したオブジェクトのバウンディング情報を取得 """ self.boundingBox = om.MBoundingBox() self.pointArray = om.MPointArray() # ポイントの位置情報を取得 self.pointArray = self.meshFn.getPoints(om.MSpace.kWorld) for points in range(len(self.pointArray)): self.point = self.pointArray[points] self.boundingBox.expand(self.point) return self.boundingBox
def boundingBox(self, objPath, cameraPath): controlNode = objPath.node() c1Plug = OpenMaya.MPlug(controlNode, self.GuideClass.boundingBoxCorner1) c2Plug = OpenMaya.MPlug(controlNode, self.GuideClass.boundingBoxCorner2) corner1Object = c1Plug.asMObject() corner2Object = c2Plug.asMObject() fnData = OpenMaya.MFnNumericData() fnData.setObject(corner1Object) corner1 = fnData.getData() fnData.setObject(corner2Object) corner2 = fnData.getData() corner1Point = OpenMaya.MPoint(corner1[0], corner1[1], corner1[2]) corner2Point = OpenMaya.MPoint(corner2[0], corner2[1], corner2[2]) return OpenMaya.MBoundingBox(corner1Point, corner2Point)
def computeBounds(self, plug, dataBlock): handleMatrix = OpenMaya.MMatrix(dataBlock.inputValue(self.handleMatrix).asMatrix()) handleMatrixInverse = handleMatrix.inverse() projectedPoints = OpenMaya.MPointArray() matrices = dataBlock.inputArrayValue(self.childHandleMatrix) while not matrices.isDone(): dataHandle = matrices.inputValue() idx = matrices.elementLogicalIndex() matrixPlug = OpenMaya.MPlug(plug.node(), self.childHandleMatrix).elementByLogicalIndex(idx) if matrixPlug.isConnected: childMatrix = OpenMaya.MMatrix(dataHandle.asMatrix()) local = childMatrix * handleMatrixInverse pt = OpenMaya.MTransformationMatrix(local).translation(OpenMaya.MSpace.kPostTransform) projectedPoints.append(pt) matrices.next() outputArray = dataBlock.outputArrayValue(self.childPosition) builder = OpenMaya.MArrayDataBuilder(dataBlock, self.childPosition, len(projectedPoints)) for i, pt in enumerate(projectedPoints): handle = builder.addElement(i) handle.set3Double(pt.x, pt.y, pt.z) outputArray.set(builder) dataBlock.setClean(self.childPosition) # Compute Bounding box based on child positions radius = 1 bounds = OpenMaya.MBoundingBox( OpenMaya.MPoint(-radius, -radius, -radius), OpenMaya.MPoint(radius, radius, radius), ) for pt in projectedPoints: bounds.expand(pt) lowerHandle = dataBlock.outputValue(self.boundingBoxCorner1) upperHandle = dataBlock.outputValue(self.boundingBoxCorner2) minPt = bounds.min maxPt = bounds.max lowerHandle.set3Double(minPt.x, minPt.y, minPt.z) upperHandle.set3Double(maxPt.x, maxPt.y, maxPt.z) lowerHandle.setClean() upperHandle.setClean()
def boundingBox(self): # Get the size # thisObject Returns the MObject associated with this user defined node. # This makes it possible to use MFnDependencyNode or to construct plugs to this node's attributes. thisNode = self.thisMObject() plug = OpenMaya.MPlug(thisNode, footPrint.size) sizeVal = plug.asMDistance() multiplier = sizeVal.asCentimeters() corner1 = OpenMaya.MPoint(-0.17, 0.0, -0.7) corner2 = OpenMaya.MPoint(0.17, 0.0, 0.3) # multiply corner values per footPrint.size attribute corner1 *= multiplier corner2 *= multiplier return OpenMaya.MBoundingBox(corner1, corner2)
def getBoundingBox(self, pMeshObj): ''' Calculate a bounding box around the mesh vertices. ''' # Create the bounding box object we will populate with the points of the mesh. boundingBox = OpenMaya.MBoundingBox() meshFn = OpenMaya.MFnMesh(pMeshObj) pointArray = OpenMaya.MPointArray() # Get the points of the mesh in its local coordinate space. pointArray = meshFn.getPoints(OpenMaya.MSpace.kTransform) for i in range(0, len(pointArray)): point = pointArray[i] boundingBox.expand(point) return boundingBox
def __init__(self, obj): '''The constructor. The isAlwaysDirty flag in the MPxDrawOverride class is set to false so the draw override is updated when the node is marked dirty A callback is added to mark the node as dirty for certain circumstances (via MRenderer::setGeometryDrawDirty()) ''' omr.MPxDrawOverride.__init__(self, obj, None, False) self.m_CurrentBoundingBox = om.MBoundingBox() # Position of self and parent NSphere self.m_position = (0, 0, 0) self.m_parentPosition = (0, 0, 0) # Scale of transform node self.m_scale = (1.0, 1.0, 1.0) # Radius of self and parent NSphere self.m_radius = 1.0 self.m_parentRadius = 1.0 # List of centres and radii for each sphere to draw self.m_radii = [] self.m_centres = []
def boundingBox(self): corner1 = om.MPoint( -0.5, 0.0, -0.5 ) corner2 = om.MPoint( 0.5, 0.0, 0.5 ) return om.MBoundingBox( corner1, corner2 )
def world_bounding_box(self): # type: () -> _om2.MBoundingBox bbox = _cmds.xform(self.mel_object, query=True, boundingBox=True) return _om2.MBoundingBox(_om2.MPoint(bbox[0], bbox[1], bbox[2]), _om2.MPoint(bbox[3], bbox[4], bbox[5]))
def boundingBox(self, obj_path, camera_path): """ """ return om.MBoundingBox()
def __init__(self): OpenMaya.MPxSurfaceShape.__init__(self) self.BBox = OpenMaya.MBoundingBox()
def geometry(self, request, view, prim, writable, indexCount, indexArray, vertexCount, vertexIDs, vertexArray, normalCount, normalArrays, colorCount, colorArrays, texCoordCount, texCoordArrays): if self.mDrawBoundingBox: points = ((ctypes.c_float * 3) * vertexCount).from_buffer(vertexArray) # Compute the bounding box. box = om.MBoundingBox() for i in range(vertexCount): point = points[i] box.expand(om.MPoint(point[0], point[1], point[2])) # Draw the bounding box. wireColor = om.MColor((0.1, 0.15, 0.35)) drawBoundingBox(box, wireColor) ## If we've received a color, that takes priority ## if colorCount > 0 and colorArrays[colorCount - 1] is not None: indexArray = (ctypes.c_uint).from_buffer(indexArray) vertexArray = (ctypes.c_float * 3).from_buffer(vertexArray) colorArray = (ctypes.c_float * 4).from_buffer( colorArrays[colorCount - 1]) glPushAttrib(GL_ALL_ATTRIB_BITS) glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT) glDisable(GL_LIGHTING) glEnableClientState(GL_COLOR_ARRAY) glColorPointer(4, GL_FLOAT, 0, colorArray) glEnableClientState(GL_VERTEX_ARRAY) glVertexPointer(3, GL_FLOAT, 0, vertexArray) glDrawElements(prim, indexCount, GL_UNSIGNED_INT, indexArray) glDisableClientState(GL_COLOR_ARRAY) glPopClientAttrib() glPopAttrib() return ## If this attribute is enabled, normals, tangents, ## and binormals can be visualized using false coloring. ## Negative values will clamp to black however. if normalCount > self.mNormalsPerVertex: normalCount = self.mNormalsPerVertex if normalCount > 0: indexArray = (ctypes.c_uint).from_buffer(indexArray) vertexArray = (ctypes.c_float * 3).from_buffer(vertexArray) normalArray = (ctypes.c_float * 3).from_buffer( normalArrays[normalCount - 1]) glPushAttrib(GL_ALL_ATTRIB_BITS) glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT) glDisable(GL_LIGHTING) glEnableClientState(GL_COLOR_ARRAY) glColorPointer(3, GL_FLOAT, 0, normalArray) glEnableClientState(GL_VERTEX_ARRAY) glVertexPointer(3, GL_FLOAT, 0, vertexArray) glDrawElements(prim, indexCount, GL_UNSIGNED_INT, indexArray) glDisableClientState(GL_COLOR_ARRAY) glPopClientAttrib() glPopAttrib() return self.draw(prim, writable, indexCount, indexArray, vertexCount, vertexArray, colorCount, colorArrays)
origMtx = origPath.inclusiveMatrix() shapeMob = origShapePath.node() nodeFn = om2.MFnDependencyNode(shapeMob) minValues = [] maxValues = [] for i in range(3): curPlug = nodeFn.findPlug("MinBoundingBox%s" % i, False) curValue = curPlug.asFloat() minValues.append(curValue) for i in range(3): curPlug = nodeFn.findPlug("MaxBoundingBox%s" % i, False) curValue = curPlug.asFloat() maxValues.append(curValue) minPnt = om2.MPoint(minValues) maxPnt = om2.MPoint(maxValues) objBBox = om2.MBoundingBox(minPnt, maxPnt) objWidth = objBBox.width * origMtx[0] objHeight = objBBox.height * origMtx[5] objDepth = objBBox.depth * origMtx[10] else: raise RuntimeError( "Select an polygon mesh or plugin shape as source object.") srcObj = origPath.fullPathName() # Get the aim axis if aimAxis.upper() == "X": aimAxis = om2.MVector.kXaxisVector elif aimAxis.upper() == "Y": aimAxis = om2.MVector.kYaxisVector elif aimAxis.upper() == "Z": aimAxis = om2.MVector.kZaxisVector
def boundingBox(self, obj_path, camera_path): return OpenMaya.MBoundingBox()
def __init__(self): OpenMayaUI.MPxLocatorNode.__init__(self) self.BBox = OpenMaya.MBoundingBox()
def boundingBox(self, *args): return om.MBoundingBox(om.MPoint(-1, -1, 0), om.MPoint(1, 1, 0))
def boundingBox(self, objPath, cameraPath): return om.MBoundingBox()
def printParticleInBoundingbox(start, end, parName, once=True): '''{'path':'Dynamics/Particles/printParticleInBoundingbox()ONLYSE', 'icon':':/particle.png', 'tip':'和物体穿插的粒子', 'usage':""" #返回在指定的时间断内和选择的物体的boundingbox相穿插的粒子的id. #在outline中选择,例如选择每个动画角色的组。 $fun( 1, 48, "nParticle1", once=True) #start: # 开始帧 #end: # 结束帧 #parName: # 粒子节点的名字 #once: # 每次穿插都返回,还是每个粒子最多返回一次 """, 'help':"""<pre> 返回在指定的时间断内和选择的物体的boundingbox相穿插的粒子的id. 在outline中选择,例如选择每个动画角色的组。 start: 开始帧 end: 结束帧 parName: 粒子节点的名字 once: 每次穿插都返回,还是每个粒子最多返回一次 """, } ''' import maya.api.OpenMaya as newom objects = cmds.ls(sl=True, type='transform') allIds = set() allDatas = [] end = end + 1 for curF in range(start, end): cmds.currentTime(curF, e=True) parIds = cmds.getParticleAttr(parName, at='particleId', array=True) if not parIds: continue parIds = [int(id) for id in parIds] bboxes = [] for obj in objects: bbox = cmds.exactWorldBoundingBox(obj, ii=True) bboxes.append((obj, newom.MBoundingBox(newom.MPoint(bbox[:3]), newom.MPoint(bbox[3:])))) parPos = cmds.getParticleAttr(parName, at='position', array=True) parIdWithPos = [(parIds[i], newom.MPoint(parPos[i * 3], parPos[i * 3 + 1], parPos[i * 3 + 2])) for i in range(len(parIds))] curFrameContainedIds = set() objsWithIds = [] for obj, bbox in bboxes: curObjContained = [] for id, pos, in parIdWithPos: if bbox.contains(pos): if once and id in allIds: continue curObjContained.append(id) if curObjContained: objsWithIds.append((obj, curObjContained)) curFrameContainedIds = curFrameContainedIds.union( curObjContained) if objsWithIds: allIds = allIds.union(curFrameContainedIds) allDatas.append((curF, tuple(curFrameContainedIds), objsWithIds)) #allDatas.sort() ttCount = 0 dataStr = 'All ParticleId:%s\n' % (str(tuple(allIds))) for data in allDatas: dataStr += 'Frame:%s\n\t%s\n' % (data[0], data[1]) ttCount += len(data[0]) #infoFile = open( '.txt', 'w') #infoFile.write( dataStr ) #os.startfile( '.txt' ) print dataStr