draggerContext를 사용해 보았습니다.

10108 단어 Pythonmaya
커서 궤적을 따라 목도리를 편집하고 싶어서요.
dragger Context로 해봤어요.
먼저 draggerContext 사전 조사
projection
  • viewPlane(뷰 평면에 투영)
  • ObjectViewPlane(뷰 평면과 평행한 객체 평면에 투영)
  • ObjectPlane(객체의 위치와 법선(정해진) 0, 1, 0으로 정의된 지정된 평면에 투영)
  • 평면(원점과 법선(기정) 0, 1, 0으로 정의된 지정된 평면에 투영)
  • sketchPrince
  • xAxis(X축에 투영된 가장 가까운 점)
  • yAxis(Y축에 투영된 가장 가까운 점)
  • zAxis
  • boundingSphere(대상구의 경계에 투영된 가장 가까운 점)
  • BoundingBox(개체 포위함에 투영된 가장 가까운 지점)
  • 나는 이 점을 잘 몰라서 상세하게 검증하고 싶다.
    대략적인 검증 도구 만들기
    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

    옵션을 바꿔서 깨달은 걸
  • 스페이스를 세계로 설정하기 때문에 3차원 좌표가 되지만screen으로 설정하면 시야 포트의 왼쪽 하단을 0, 0으로 설정하는 X, Y 좌표
  • 를 얻을 수 있다.
  • 대상을 지정하는 방법에 큰 변화가 없음
  • 그 위에 nurbsCurve를 어떻게 하고 싶은지.
    나 어떡해, 어떡해.
    대충 생각해보면 이런 느낌 아닌가요?

    카메라=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)
    
  • C:viewPlane의 스트로크 좌표
    draggerContext에서 프로젝트=viewPlane 및 space=world를 통해 취득 가능
  • B: CV의 원래 위치
    xfrom당 가져오기
  • 점 C의 정의
    타격에서 많은 점수를 얻을 수 있지만 어떤 것을 점 C로 정의해야 하나요?
  • 여정의 각 점에서 파라미터 위치를 산출
  • CV의 월드 위치를 시야 포트의 2차원 위치로 전환하고 스케줄의 최근 접점을 확정한다
  • 여정상의 점으로 nurbsCurve를 생성하고,rebuild로 원Curve와 함께 CV 위치를 획득
  • 동시에 궤적을 그립니다. 세 번째
    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()
    
    현행의 경우 오픈을 제외한 커브에는 대응 같은 게 없고 다양한 한정성이 있어서 나중에 업데이트하고 싶어요.

    좋은 웹페이지 즐겨찾기