getClosestPoint от позиции курсора мыши до первого объекта, который попадает в raycast (скрипт Maya Mel)

Исследование для получения точки мира от позиции курсора мыши до первого объекта, который попадает в лучевую трансляцию. Может быть, API-функция getClosestPoint или rayIntersect может сделать эту работу? Если да, то как? (благодарю вас)

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)

Вы можете сделать это либо в MEL, либо на python, используя команду autoPlace с флагом useMouse, установленным в true.

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

Он запустит луч от курсора мыши на живую поверхность. Используйте команду makeLive, чтобы оживить поверхность в скрипте.

Вы можете написать контекст инструмента так, чтобы при вводе выбранная поверхность становилась активной, затем вы щелкали по ней и делали что-то с результатом (например, поместите локатор), затем отменили выбор объекта и снова сделали makeLive, чтобы сбросить сетку. жить.

Другие вопросы по тегам