Maya: как запросить значение y точки в сетке, если у меня есть координаты x и z?

#python #maya #mel

#python #maya #mel

Вопрос:

Я работаю в Maya, и у меня есть кривая и сетка «пола». В любой точке кривой у меня есть значения x и z (мировое пространство), что дает мне 2D-местоположение точки сверху вниз. Я хочу спроецировать кривую вниз на пол, чтобы найти значение y (т. Е. Высоту) пола в любой точке.

То есть, учитывая значения x и z, я хочу запросить сетку, чтобы получить соответствующее значение y на поверхности. кривая и полиповерхность, представляющие пол
введите описание изображения здесь
введите описание изображения здесь

Эти изображения были сделаны с использованием полиповерхности, но в основном являются иллюстративными, для моих целей не имеет большого значения, является ли пол полисеткой или поверхностью poly / NURBS, поэтому, если один из них более подходит, пожалуйста, скажите. (Однако было бы хорошо иметь ответ на все эти вопросы!)

Я безуспешно пытался использовать команды pointOnSurface, xform и pointPosition . Я также пытался использовать узел closestPointOnSurface, но мне не нужна ближайшая точка в любом направлении, мне конкретно нужно значение y в точной точке x и z. Я знаю, что существует y, который удовлетворяет этим условиям, поскольку я сам строю кривую и сетку / поверхность.

У меня есть следующий код для получения координат [x, z] в 50 точках выборки вдоль кривой:

 import maya.cmds as cmds

# Returns x and z coordinates of points along path
def getPathPos():
    path = 'curve1'
    point_dist = 1.0/50
    path_pos = []

    for i in range(50):
        param = i * point_dist
        pos = cmds.pointOnCurve(path, parameter=param, turnOnPercentage=True, position=True)
        path_pos.append([pos[0], pos[2]])

    return path_pos
 

Но тогда я застрял. Я не могу понять, как использовать эти точки для запроса точек в сетке.

Довольны ответами на Python или MEL.

Комментарии:

1. можете ли вы включить часть кода, который вы пробовали?

2. Извините за все уведомления, я пытался добавить код в комментарий, но форматирование было отключено. Сейчас отредактирую сообщение.

Ответ №1:

Я не понимаю, почему closestPointOnMesh не будет работать, он проецирует ваши точки кривой на поверхность, этот код не работает для вас :

 def vec(p1, p2):
    return (p1[0]-p2[0], p1[1]-p2[1], p1[2]-p2[2])

curve, plane = cmds.ls(sl=True)
clst = cmds.createNode('closestPointOnMesh')
plane_sh = cmds.listRelatives(plane)[0]
cmds.connectAttr('{}.worldMesh[0]'.format(plane_sh),
                  '{}.inMesh'.format(clst))

cvs=cmds.ls('{}.ep[*]'.format(curve), fl=True)
cvs_orig_pos = [cmds.pointPosition(c) for c in cvs]
diff = []
for cv, pos in zip(cvs, cvs_orig_pos):
    cmds.setAttr('{}.inPosition'.format(clst), *pos)
    proj = cmds.getAttr('{}.position'.format(clst))[0]
    new_pos= [pos[0], proj[1], pos[2]]
    cmds.xform(cv, t=new_pos)

    value = vec(new_pos, pos)[1]
    if value > 0:
        print('above the floor')
    elif value<0:
        print('below the floor')
 

РЕДАКТИРОВАТЬ: я видел вашу структуру с помощью floor, поэтому я добавил процедуру для проверки этого