如何修复Maya中Python中“MIntArray const*”类型的参数4“MFnMesh_anyIntersection”方法中的“TypeError:

如何修复Maya中Python中“MIntArray const*”类型的参数4“MFnMesh_anyIntersection”方法中的“TypeError:,python,raycasting,maya-api,Python,Raycasting,Maya Api,我想使用OpenMaya.MFnMesh.anycrossion在Maya中试用Python光线投射 我只想从物体上向下投射一条光线,击中一个平面,不要再往前走了,所以我只得到一个光线投射命中,并从光线投射命中得到平移值 我从一个视频中得到了代码,使它更清晰易懂 要使代码在Maya中正常运行,需要Y轴上的对象高于其他对象,最好是多平面。例如:在位置[0,3,0]处有一个多球体,在位置[0,0,0]处有一个多平面,请选择多球体并运行代码 import maya.OpenMaya as OpenMa

我想使用OpenMaya.MFnMesh.anycrossion在Maya中试用Python光线投射

我只想从物体上向下投射一条光线,击中一个平面,不要再往前走了,所以我只得到一个光线投射命中,并从光线投射命中得到平移值

我从一个视频中得到了代码,使它更清晰易懂

要使代码在Maya中正常运行,需要Y轴上的对象高于其他对象,最好是多平面。例如:在位置[0,3,0]处有一个多球体,在位置[0,0,0]处有一个多平面,请选择多球体并运行代码

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

def RayReposition(*args):
    direction = (0.0, -1, 0)
    sel = cmds.ls(sl = True)

    fromPositionRay = cmds.xform(sel[0], query = True, translation = True)
    selShape = cmds.listRelatives(shapes = True)
    meshes = cmds.ls(geometry = True)

    cmds.select(clear = True)

    for x in meshes:
        if x == selShape[0]:
            continue
        else:
            OpenMaya.MGlobal.selectByName(x)
            sList = OpenMaya.MSelectionList()

            OpenMaya.MGlobal.getActiveSelectionList(sList)
            item = OpenMaya.MDagPath()
            sList.getDagPath(0, item)
            item.extendToShape()

            fnMesh = OpenMaya.MFnMesh(item)

            raySource = OpenMaya.MFloatPoint(fromPositionRay[0], fromPositionRay[1], fromPositionRay[2], 1.0)
            rayDir = OpenMaya.MFloatVector(direction[0], direction[1], direction[2])
            faceIds = None
            triIds = None
            idsSorted = False
            testBothDirections = False
            worldSpace = OpenMaya.MSpace.kWorld
            maxParam = 999999
            accelParams = None
            sortHits = True
            hitPoints = OpenMaya.MFloatPointArray()

            hitRayParams = OpenMaya.MFloatArray()
            hitFaces = OpenMaya.MIntArray()
            hitTris = None
            hitBarys1 = None
            hitBarys2 = None
            tolerance = 0.0001

            hit = fnMesh.anyIntersection(raySource, rayDir, worldSpace, maxParam, testBothDirections, faceIds, triIds, idsSorted, accelParams, tolerance, hitPoints, hitRayParams, hitFaces, hitTris, hitBarys1, hitBarys2)

            OpenMaya.MGlobal.clearSelectionList()
            firstHit = (hitPoints[0].x, hitPoints[0].y, hitPoints[0].z)
            print firstHit

RayReposition()
我希望从raycasthit中获取平移值,但出现以下错误:

TypeError: in method 'MFnMesh_anyIntersection', argument 4 of type 'MIntArray const *'
相反,使用OpenMaya.MFnMesh.allIntersections函数工作得非常好,但我从光线投射中获得了每一次命中,但我只想要第一次命中

指向OpenMaya.MFnMesh API的链接: 链接:

最主要的一点是,任何十字路口都在寻找它首先到达的一个十字路口,而不是多个十字路口。所以out参数的类型是错误的,因为它们是数组

我还避免在循环中清除或进行新选择,因为每次都必须重新绘制视口,这只会降低性能

下面是一个工作示例,它将在第一个网格上创建定位器:

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


def RayReposition(*args):
    direction = (0.0, -1, 0)
    sel = cmds.ls(sl=True)

    fromPositionRay = cmds.xform(sel[0], query=True, translation=True)
    selShape = cmds.listRelatives(shapes=True)
    meshes = cmds.ls(geometry=True)

    for x in meshes:
        if x == selShape[0]:
            continue
        else:
            sList = OpenMaya.MSelectionList()
            sList.add(x)
            item = OpenMaya.MDagPath()
            sList.getDagPath(0, item)
            item.extendToShape()

            fnMesh = OpenMaya.MFnMesh(item)

            raySource = OpenMaya.MFloatPoint(fromPositionRay[0], fromPositionRay[1], fromPositionRay[2], 1.0)
            rayDir = OpenMaya.MFloatVector(direction[0], direction[1], direction[2])
            worldSpace = OpenMaya.MSpace.kWorld
            maxParam = 999999
            testBothDirections = False
            faceIds = None
            triIds = None
            idsSorted = False
            accelParams = None
            sortHits = True

            hitPoints = OpenMaya.MFloatPoint()
            hitRayParams = None
            hitFaces = None
            hitTris = None
            hitBarys1 = None
            hitBarys2 = None
            tolerance = 0.0001

            hit = fnMesh.anyIntersection(
                raySource, rayDir, faceIds, triIds, idsSorted, worldSpace, maxParam, testBothDirections, accelParams, 
                hitPoints, hitRayParams, hitFaces, hitTris, hitBarys1, hitBarys2, tolerance)

            if hit:
                firstHit = (hitPoints.x, hitPoints.y, hitPoints.z)
                loc = cmds.spaceLocator()[0]
                cmds.xform(loc, ws=True, t=firstHit)
                print "Hit on {} at {}".format(x, firstHit)
                break


RayReposition()
我发现该方法对参数的期望更清晰一些。

主要的是,任何交叉点都是在寻找它首先到达的单个交叉点,而不是多个交叉点。所以out参数的类型是错误的,因为它们是数组

我还避免在循环中清除或进行新选择,因为每次都必须重新绘制视口,这只会降低性能

下面是一个工作示例,它将在第一个网格上创建定位器:

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


def RayReposition(*args):
    direction = (0.0, -1, 0)
    sel = cmds.ls(sl=True)

    fromPositionRay = cmds.xform(sel[0], query=True, translation=True)
    selShape = cmds.listRelatives(shapes=True)
    meshes = cmds.ls(geometry=True)

    for x in meshes:
        if x == selShape[0]:
            continue
        else:
            sList = OpenMaya.MSelectionList()
            sList.add(x)
            item = OpenMaya.MDagPath()
            sList.getDagPath(0, item)
            item.extendToShape()

            fnMesh = OpenMaya.MFnMesh(item)

            raySource = OpenMaya.MFloatPoint(fromPositionRay[0], fromPositionRay[1], fromPositionRay[2], 1.0)
            rayDir = OpenMaya.MFloatVector(direction[0], direction[1], direction[2])
            worldSpace = OpenMaya.MSpace.kWorld
            maxParam = 999999
            testBothDirections = False
            faceIds = None
            triIds = None
            idsSorted = False
            accelParams = None
            sortHits = True

            hitPoints = OpenMaya.MFloatPoint()
            hitRayParams = None
            hitFaces = None
            hitTris = None
            hitBarys1 = None
            hitBarys2 = None
            tolerance = 0.0001

            hit = fnMesh.anyIntersection(
                raySource, rayDir, faceIds, triIds, idsSorted, worldSpace, maxParam, testBothDirections, accelParams, 
                hitPoints, hitRayParams, hitFaces, hitTris, hitBarys1, hitBarys2, tolerance)

            if hit:
                firstHit = (hitPoints.x, hitPoints.y, hitPoints.z)
                loc = cmds.spaceLocator()[0]
                cmds.xform(loc, ws=True, t=firstHit)
                print "Hit on {} at {}".format(x, firstHit)
                break


RayReposition()
我发现这个方法对参数的期望更清晰一些