Maya: Как запросить значение y точки на сетке, если у меня есть координаты x и z? - PullRequest
0 голосов
/ 15 апреля 2019

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

То есть, учитывая значения x и z, я хочу запросить сетку, чтобы получить соответствующее значение y на поверхности. curve and poly surface representing the floor enter image description here enter image description here

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

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

У меня есть следующий код для получения координат [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 Ответ

1 голос
/ 16 апреля 2019

Я не понимаю, почему 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')

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

...