Apr 2006
1 / 7
Apr 2006
Feb 2019

I wander how to get the closest point on surface about a assign point use MEL.I know there is a node named closestPointOnsurface can do it ,but i need use MEL command.

  • created

    Apr '06
  • last reply

    Feb '19
  • 6

    replies

  • 7.4k

    views

  • 5

    users

  • 1

    like

QUOTE(nick98 @ 04/24/06, 02:42 PM) [snapback]235195[/snapback]
I wander how to get the closest point on surface about a assign point use MEL.I know there is a node named closestPointOnsurface can do it ,but i need use MEL command.

Hi

Maya Bouns Tool you can get a plugin closestPointOnMesh.mll

thorugh that you can do it

there is also nearestPointOnMesh.mll delivered with Maya 7 isn't it?

I believe there are two modes you can use the command with:
1. create a nearestPointOnMesh/closestPointOnMesh-node and connect it with your stuff and get the values from the attribute plugs.
2. use it directly via mel with a specified mesh and query the values directly.

there are many places in maya where a node is used as mel command by making it temporarily then querry and delete the node.

Nah more detailed I mean: first you can create such a node and connect the closest point with a locators translation-attributes so you can move the node and interactively see what happens where and when. Know what I mean? Sometimes useful for character rigs and stuff.

On the other hand you can just send the mel command and get the values you want without anything being visually created. You just query something.

Is that 2 ways enough? ;]

Yes i understand whtat you say but in maya theres sometimes a understandable confusion on wether a command is:

  • A convininece creator/querryer/editr for a nodetype
  • A mel equalient of the node
  • or both
  • But thing is its allmost allways the first case, so even if it would seem logical form the command reference taht one could use the command to querry the stuff without the node, thats not true. Thats because many times the code operates on those nodes and those nodes alone. THuis having no internal logic to querry stuff. This baceuse the command is paired to the node but not a mel work command.

    The 3 most OVIOUS alternative is rare indeed!

    12 years later

    Reviving this old thread. It seems like creating a temporary node and sampling it is the way to go.

    Here's a bit of python for returning either a list of nodes, or a list of uvVals

    You will need a sample surface, an array of points, and a choice between uvVals or nodes.

    Select your sample surface and assign it with 'sampleSurface = cmd.ls(sl=True)[0]'

    Supply an array of points to sample. Select the objects - locators or whatever, and run this:

    points = []
    for i in cmd.ls(sl=True):
    point = cmd.xform(i, q = True, t = True, ws = True)
    points.append(point)

    Here is the function to return either values or nodes, depending on what you need

    import maya.cmds as cmd
    import maya.mel as mel
    gA = cmd.getAttr
    sA = cmd.setAttr
    cA = cmd.connectAttr
    cN = cmd.createNode
    def getClosestPointsOnSurface(points, sampleSurface, type = 'nodes'):
    returnVal = None
    cposNodes = []
    vals = []
    split = sampleSurface.split('_')
    surf = cmd.listRelatives(sampleSurface, c = True, ni = True, type = 'nurbsSurface')[0]
    if type == 'nodes':
    for i in range(len(points)):
    cPos = cN('closestPointOnSurface', ss = True, n = '%s_%02d_cPos' % (split[0], i))
    cA('%s.worldSpace[0]' % surf, '%s.inputSurface' % cPos)
    sA('%s.inPosition' % cPos, points[i][0], points[i][1], points[i][2])
    cposNodes.append(cPos)
    returnVal = cposNodes
    if type == 'vals':
    for i in range(len(points)):
    cPos = cN('closestPointOnSurface', ss = True)
    cA('%s.worldSpace[0]' % surf, '%s.inputSurface' % cPos)
    sA('%s.inPosition' % cPos, points[i][0], points[i][1], points[i][2])
    u = gA('%s.result.parameterU' % cPos )
    v = gA('%s.result.parameterV' % cPos )
    vals.append([u,v])
    cmd.delete(cPos)
    returnVal = vals
    return returnVal

    Finally, the example command to run

    cposNodes = getClosestPointsOnSurface(points, sampleSurface, type = 'nodes')
    uvVal = getClosestPointsOnSurface(points, sampleSurface, type = 'vals')

    sampleSurface
    Result: u'face_def_surf'

    points
    Result: [[-9.934378258772887e-05, 56.52158927169142, 13.096842334001089],
    [-1.2986319080810456, 56.573714757526794, 13.019487214074514],
    [-2.3988572845724603, 56.81671021609732, 12.825554268688125],
    [-2.887766742811174, 57.28272070017139, 12.744081627653983],
    [-2.9564472997142497, 57.50138883790414, 12.769442914295668],
    [-2.879458555286166, 57.672685482014, 12.879225548927492],
    [-2.192046597368875, 57.79139587725608, 13.341300849584687],
    [-1.140138085103556, 57.811148683446966, 13.800117232849214],
    [-0.0007878168005395606, 57.81488077210223, 13.925655903295926],
    [1.1383058170299245, 57.81117323292432, 13.796743621692903],
    [2.191000144083259, 57.79144462951285, 13.339583497622566],
    [2.879303203717313, 57.67272400054267, 12.878886599401458],
    [2.9563649858235075, 57.50140832665556, 12.769194174384452],
    [2.887671243257571, 57.282744486066534, 12.743798227096866],
    [2.398733183100953, 56.81673428803417, 12.825116354417371],
    [1.2984150038822726, 56.57377235530355, 13.018506756780637]]

    uvVal
    Result: [[1.0004341542613102, 0.2301692487434747],
    [1.2064782285634066, 0.21627448891449497],
    [1.3722637684008845, 0.28391258246162415],
    [1.509186903505303, 0.3387848920830241],
    [1.563309727886676, 0.36916657892685023],
    [1.6002270473405233, 0.369506881916711],
    [1.6601835924689776, 0.24208844308577132],
    [1.7978056591853022, 0.10984749089757448],
    [1.9998468370341644, 0.10376750763367472],
    [0.20215057952270601, 0.10949474728688213],
    [0.33988142055839465, 0.24195245274626373],
    [0.39978054787266903, 0.3695019564741386],
    [0.4366984973876268, 0.3691695706042126],
    [0.4908336188623674, 0.3387896663238795],
    [0.6277812551226932, 0.2839743883775245],
    [0.7935635789475637, 0.21646212421961572]] #

    cposNodes
    Result: [u'face_00_cPos',
    u'face_01_cPos',
    u'face_02_cPos',
    u'face_03_cPos',
    u'face_04_cPos',
    u'face_05_cPos',
    u'face_06_cPos',
    u'face_07_cPos',
    u'face_08_cPos',
    u'face_09_cPos',
    u'face_10_cPos',
    u'face_11_cPos',
    u'face_12_cPos',
    u'face_13_cPos',
    u'face_14_cPos',
    u'face_15_cPos'] #