こんな感じの状態、
# -*- coding: utf-8 -*-
import maya.cmds as cmds
from maya import OpenMaya
#任意の1点と線分の両端の座標から線分上のもっとも近い点を返す
def xGetClosestPoint(myPoint, begin, end):
myVector3D = OpenMaya.MVector(myPoint[0] - begin[0], myPoint[1] - begin[1], myPoint[2] - begin[2])
baseVector3D = OpenMaya.MVector(end[0] - begin[0], end[1] - begin[1], end[2] - begin[2])
nDotProduct = myVector3D * baseVector3D
print("nDotProduct= "+str(nDotProduct))
if (nDotProduct > 0):
print("Big if")
nBaseLength = baseVector3D.length()
print("nBaseLength= "+str(nBaseLength))
nProjection = nDotProduct / nBaseLength
if (nProjection < nBaseLength):
print("small if")
scaleValue = nProjection / nBaseLength
print("scaleValue= "+str(scaleValue))
baseVector3D = baseVector3D * scaleValue
return [begin[0] + baseVector3D[0], begin[1] + baseVector3D[1], begin[2] + baseVector3D[2]]
else:
print("small else")
return end
else:
print("Big else")
return begin;
sel = cmds.ls(sl =True)
# get Translate
start = cmds.xform(sel[0],q=1 ,ws =True,t=True)
mid = cmds.xform(sel[1],q=1 ,ws =True,t=True)
end = cmds.xform(sel[2],q=1 ,ws =True,t=True)
# Vector for Translate
#startV = OpenMaya.MVector(start[0] ,start[1],start[2])
#midV = OpenMaya.MVector(mid[0] ,mid[1],mid[2])
#midV = OpenMaya.MVector(end[0] ,end[1],end[2])
c_vPos = xGetClosestPoint(mid, start, end)
cmds.xform("pSphere1",ws =True,translation=(c_vPos[0], c_vPos[1], c_vPos[2]) )
線状に乗った!!
参考URL
野中文雄先生の任意の座標からもっとも近い線分上の点を求める
http://www.fumiononaka.com/TechNotes/Flash/FN1104002.html
MAYAチュートリアル:Pythonで極ベクトルを正しく配置する方法