draggerContext를 사용해 보았습니다.
dragger Context로 해봤어요.
먼저 draggerContext 사전 조사
projection
대략적인 검증 도구 만들기
import maya.cmds as cmds
def pressCommand_test():
    pressPosition = cmds.draggerContext(toolName, query=True, anchorPoint=True)    
    print("start position" + str(pressPosition))
def dragCommand_test():
    dragPosition = cmds.draggerContext( toolName, query=True, dragPoint=True)
    print(str(dragPosition))
    node = cmds.spaceLocator()[0]
    cmds.setAttr(node + ".t", *dragPosition)
def releaseCommand_test():
    pass
toolName = "hogeTool"
if cmds.draggerContext(toolName,q =True, exists=True):
    cmds.deleteUI(toolName)
cmds.draggerContext(toolName,
                    projection = "plane",
                    pressCommand = "pressCommand_test()",
                    dragCommand = "dragCommand_test()",
                    releaseCommand = "releaseCommand_test()",
                    space = "world"
)
cmds.setToolTo(toolName)
perrsp 카메라를 통해 실행해 보고 결과를 확인합니다viewPlane
현재 카메라의viewPlane에 투영하여 3차원 위치 정보를 얻습니다
 objectViewPlane
 objectPlane/plane
 옵션을 바꿔서 깨달은 걸
나 어떡해, 어떡해.
대충 생각해보면 이런 느낌 아닌가요?
 카메라=ACV원위치=B스케줄상=CCV이동목적지=P리플레이후
 AB와 같은 길이의 점까지 벡터 AC를 P로 연장
필요한 것은
A:카메라 위치
이렇게 하면 현재의 카메라를 얻을 수 있다.
OpenMayaUI.M3dView.active3dView().getCamera()
cam_MFnTransIns = om2.MFnTransform(om2.MFnDagNode(omui.M3dView.active3dView().getCamera().transform()).getPath())
cam_position = cam_MFnTransIns.translation(om2.MSpace.kWorld)
draggerContext에서 프로젝트=viewPlane 및 space=world를 통해 취득 가능
xfrom당 가져오기
타격에서 많은 점수를 얻을 수 있지만 어떤 것을 점 C로 정의해야 하나요?
pressCommand
- 스트로크 커브가 있으면 삭제
- 클릭한 점 가져오기
draggCommand
- 스레드 커브가 없는 경우 생성
- 특정 상황에서 appeend에 중점을 두기
releaseCommand
- 처음 선택한 곡선에 따라degree/spans를 가져오고rebuild를 진행합니다
pressPosition = []
tmpCurveName = "tempCurve"
selectCurve = ""
toolName = "hogeTool"
def draggerEditCurve_pressCommand():
    global pressPosition
    pressPosition = cmds.draggerContext(toolName, query=True, anchorPoint=True)    
    if cmds.objExists(tmpCurveName):
        cmds.delete(tmpCurveName)
def draggerEditCurve_dragCommand():
    dragPosition = cmds.draggerContext( toolName, query=True, dragPoint=True)
    if cmds.objExists(tmpCurveName):
        cmds.curve(tmpCurveName , p = [dragPosition], append =True)
    else:
        cmds.curve(name = tmpCurveName , p = [pressPosition,dragPosition], d = 1, bezier = False, periodic = False)
    cmds.refresh()
def draggerEditCurve_releaseCommand(selectCurve):    
    degree = cmds.getAttr(selectCurve + ".degree")
    spans = cmds.getAttr(selectCurve + ".spans")    
    cmds.rebuildCurve(tmpCurveName,ch =False, degree = degree,rebuildType = 0,spans = spans,replaceOriginal = True,keepRange =0)
def draggerEditCurveTool():
    selectCurve = cmds.ls(sl =True)[0]
    if cmds.draggerContext(toolName,q =True, exists=True):
        cmds.deleteUI(toolName)
        cmds.draggerContext(toolName,
                        projection = "viewPlane",
                        pressCommand = "draggerEditCurve_pressCommand()",
                        dragCommand = "draggerEditCurve_dragCommand()",
                        releaseCommand = "draggerEditCurve_releaseCommand(\""+selectCurve+"\")",
                        space = "world"
    )
    cmds.setToolTo(toolName)
draggerEditCurveTool()
점 P의 정의두 커브와 카메라의 위치에 따라 최종 이동 지점을 정의합니다.
def getDistPoint(sourceCurve,targetCurve):
    cam_MFnTransIns = om2.MFnTransform(om2.MFnDagNode(omui.M3dView.active3dView().getCamera().transform()).getPath())
    cam_position = om2.MVector(cam_MFnTransIns.translation(om2.MSpace.kWorld))    
    sourceCurve_dagPath = om2.MGlobal.getSelectionListByName(sourceCurve).getDagPath(0)
    if sourceCurve_dagPath.hasFn(om2.MFn.kNurbsCurve):
        sourceCurve_shapeFn = om2.MFnNurbsCurve(sourceCurve_dagPath)
    all_ids = []
    for i in range(0,sourceCurve_shapeFn.numCVs):
        all_ids.append(i)
    sourceCurve_comp = [sourceCurve + '.cv[' + str(vid) + ']'for vid in all_ids]
    targetCurve_comp = [targetCurve + '.cv[' + str(vid) + ']'for vid in all_ids]
    for sourceCurve_cv,targetCurve_cv in zip(sourceCurve_comp,targetCurve_comp):
        sourceCurve_cv_position = om2.MVector(cmds.xform(sourceCurve_cv,q =True,ws =True, t=True))
        targetCurve_cv_position = om2.MVector(cmds.xform(targetCurve_cv,q =True,ws =True, t=True))
        curPoint_vect = targetCurve_cv_position - cam_position
        curPoint_length = curPoint_vect.length()
        point_vect = sourceCurve_cv_position - cam_position
        point_vect = point_vect.normal()
        dist_vect = point_vect * curPoint_length
        dist_position = cam_position + dist_vect
        cmds.xform(targetCurve_cv,ws =True, t=dist_position)
잇닿다섬세하게 만들어진 것을 총괄해 보면 이런 느낌이다.
커브를 선택하여 수행합니다.
import maya.cmds as cmds
import maya.api.OpenMaya as om2
import maya.api.OpenMayaUI as omui
pressPosition = []
tmpCurveName = "tempCurve"
toolName = "draggerEditCurveTool"
def getDistPoint(sourceCurve,targetCurve):
    cam_MFnTransIns = om2.MFnTransform(om2.MFnDagNode(omui.M3dView.active3dView().getCamera().transform()).getPath())
    cam_position = om2.MVector(cam_MFnTransIns.translation(om2.MSpace.kWorld))        
    sourceCurve_dagPath = om2.MGlobal.getSelectionListByName(sourceCurve).getDagPath(0)
    if sourceCurve_dagPath.hasFn(om2.MFn.kNurbsCurve):
        sourceCurve_shapeFn = om2.MFnNurbsCurve(sourceCurve_dagPath)
    all_ids = []
    for i in range(0,sourceCurve_shapeFn.numCVs):
        all_ids.append(i)
    sourceCurve_comp = [sourceCurve + '.cv[' + str(vid) + ']'for vid in all_ids]
    targetCurve_comp = [targetCurve + '.cv[' + str(vid) + ']'for vid in all_ids]
    for sourceCurve_cv,targetCurve_cv in zip(sourceCurve_comp,targetCurve_comp):
        sourceCurve_cv_position = om2.MVector(cmds.xform(sourceCurve_cv,q =True,ws =True, t=True))
        targetCurve_cv_position = om2.MVector(cmds.xform(targetCurve_cv,q =True,ws =True, t=True))
        curPoint_vect = targetCurve_cv_position - cam_position
        curPoint_length = curPoint_vect.length()
        point_vect = sourceCurve_cv_position - cam_position
        point_vect = point_vect.normal()
        dist_vect = point_vect * curPoint_length
        dist_position = cam_position + dist_vect
        cmds.xform(targetCurve_cv,ws =True, t=dist_position)
def draggerEditCurve_pressCommand():
    global pressPosition
    pressPosition = cmds.draggerContext(toolName, query=True, anchorPoint=True)    
    if cmds.objExists(tmpCurveName):
        cmds.delete(tmpCurveName)
def draggerEditCurve_dragCommand():
    dragPosition = cmds.draggerContext( toolName, query=True, dragPoint=True)
    if cmds.objExists(tmpCurveName):
        cmds.curve(tmpCurveName , p = [dragPosition], append =True)
    else:
        cmds.curve(name = tmpCurveName , p = [pressPosition,dragPosition], d = 1, bezier = False, periodic = False)
    cmds.refresh()
def draggerEditCurve_releaseCommand(selectCurve):    
    degree = cmds.getAttr(selectCurve + ".degree")
    spans = cmds.getAttr(selectCurve + ".spans")    
    cmds.rebuildCurve(tmpCurveName,ch =False, degree = degree,rebuildType = 0,spans = spans,replaceOriginal = True,keepRange =0)    
    getDistPoint(tmpCurveName,selectCurve)    
    cmds.select(selectCurve,r =True)
    cmds.delete(tmpCurveName)
def draggerEditCurveTool():
    selectCurve = cmds.ls(sl =True)[0]
    if cmds.draggerContext(toolName,q =True, exists=True):
        cmds.deleteUI(toolName)
    cmds.draggerContext(toolName,
                            projection = "viewPlane",
                            pressCommand = "draggerEditCurve_pressCommand()",
                            dragCommand = "draggerEditCurve_dragCommand()",
                            releaseCommand = "draggerEditCurve_releaseCommand(\""+selectCurve+"\")",
                            space = "world"
        )
    cmds.setToolTo(toolName)
draggerEditCurveTool()
현행의 경우 오픈을 제외한 커브에는 대응 같은 게 없고 다양한 한정성이 있어서 나중에 업데이트하고 싶어요.
                Reference
이 문제에 관하여(draggerContext를 사용해 보았습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/9boz/items/e81947e473319991e1b8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)