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.)