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

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

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

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

Я безуспешно пытался использовать команды pointOnSurface, xform и pointPosition. Я также пытался использовать ближайший узелPointOnSurface, но мне не нужна ближайшая точка в каком-либо направлении, мне особенно нужно значение 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.


person Soup42    schedule 15.04.2019    source источник
comment
Можете ли вы включить часть кода, который вы пробовали?   -  person wpercy    schedule 15.04.2019
comment
Извините за все уведомления, я пытался добавить код в комментарий, но форматирование было отключено. Сейчас отредактирую пост.   -  person Soup42    schedule 15.04.2019


Ответы (1)


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

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

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

person DrWeeny    schedule 16.04.2019