Maya:如果我有x和z坐标,如何查询网格上某点的y值?

问题描述 投票:0回答:1

我在Maya工作,我有一个曲线和一个“地板”网格。在曲线上的任何一点,我都有x和z值(世界空间),给我这个点的自上而下的2D位置。我想将曲线向下投射到地板上,以便在任何点找到地板的y值(即高度)。

也就是说,给定x和z值,我想查询网格以在表面上给出相应的y值。 curve and poly surface representing the floor enter image description here enter image description here

这些图像是使用聚合物表面制作的,但主要是说明性的,对于我的目的而言,地板是多边形网格还是多边形/ NURBS表面并不重要,所以如果更合适,请说明。 (但是对所有这些都有答案会很好!)

我试过使用pointOnSurface,xform和pointPosition命令没有运气。我也试过使用nearestPointOnSurface节点,但我不希望任何方向上的最近点,我特别想要在精确的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中的答案感到满意。

python maya mel
1个回答
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')

编辑:我已经看到你的图片与地板的东西,所以我添加了一个proc来验证这一点

© www.soinside.com 2019 - 2024. All rights reserved.