getClosestPoint从鼠标光标位置到第一个点击光线投射的对象(maya mel script)

时间:2016-01-06 14:14:17

标签: raycasting mel closest-points maya-api

研究从鼠标光标位置获取世界点到光线投射命中的第一个对象。也许一个api func getClosestPoint或rayIntersect可以做那个工作?如果是这样的话? (谢谢)

2 个答案:

答案 0 :(得分:2)

我找到了这段代码,但我不确定是谁写的。无论如何,这可能是你正在寻找的。

import maya.OpenMaya as om
import maya.OpenMayaUI as omui
import maya.cmds as cmds

ctx = 'myCtx'

def onPress():
    vpX, vpY, _ = cmds.draggerContext(ctx, query=True, anchorPoint=True)
    print(vpX, vpY)

    pos = om.MPoint()
    dir = om.MVector()
    hitpoint = om.MFloatPoint()
    omui.M3dView().active3dView().viewToWorld(int(vpX), int(vpY), pos, dir)
    pos2 = om.MFloatPoint(pos.x, pos.y, pos.z)
    for mesh in cmds.ls(type='mesh'):
        selectionList = om.MSelectionList()
        selectionList.add(mesh)
        dagPath = om.MDagPath()
        selectionList.getDagPath(0, dagPath)
        fnMesh = om.MFnMesh(dagPath)
        intersection = fnMesh.closestIntersection(
        om.MFloatPoint(pos2),
        om.MFloatVector(dir),
        None,
        None,
        False,
        om.MSpace.kWorld,
        99999,
        False,
        None,
        hitpoint,
        None,
        None,
        None,
        None,
        None)
        if intersection:
            x = hitpoint.x
            y = hitpoint.y
            z = hitpoint.z
            cmds.spaceLocator(p=(x,y,z))


if cmds.draggerContext(ctx, exists=True):
    cmds.deleteUI(ctx)
cmds.draggerContext(ctx, pressCommand=onPress, name=ctx, cursor='crossHair')
cmds.setToolTo(ctx)

答案 1 :(得分:1)

您可以使用autoPlace命令在MEL或python中执行此操作,并将useMouse标志设置为true。

float $pos[] = `autoPlace -um`;

它会将光线从鼠标光标射到live surface 使用makeLive命令在脚本中生成表面。

你可以写一个工具上下文,这样当你输入它时,所选的表面变为实时,然后你点击它并对结果做一些事情(比如放置一个定位器),然后取消选择对象并再次makeLive重置网格生效。