我在Maya中工作,我有一条曲线和一个“地板”网格。在曲线的任何一点上,我都有x和z值(世界空间),这给了我自上而下的2D位置。我想将曲线向下投影到地板上以在任何点找到地板的y值(即高度)。
也就是说,给定一个x和z值,我想查询一个网格以给我表面上相应的y值。
这些图像是使用多边形表面制作的,但主要是说明性的,就我的目的而言,地板是多边形网格还是多边形/ NURBS表面并不重要,因此,如果合适的话请说。 (但是,对所有这些问题都有一个答案将是一件好事!)
我尝试使用pointOnSurface,xform和pointPosition命令,但没有运气。我也尝试过使用ClosedPointOnSurface节点,但是我不希望任何方向的最近点,我特别希望在精确的x和z点处使用y值。我知道在自己构造曲线和网格/曲面时,有一个y满足这些条件。
我有以下代码来获取曲线上50个采样点的[x,z]坐标:
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的答案感到满意。
答案 0 :(得分:1)
我不明白为什么最近的PointOnMesh无法使用,它是将曲线点投影到曲面上,因此此代码对您不起作用:
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')
编辑:我看过你的照片是地板的东西,所以我添加了一个程序来验证这一点