#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, поэтому я добавил процедуру для проверки этого