我想使用Maya Api在Open GL中复制一个形状,包括法线。
让我们以一个立方体作为源形状。
Maya的MFnMesh::getPoints将返回8点。
Maya的MFnMesh::getNormals将返回24个法线(每个顶点3个法线,或者每个面每个顶点1个法线)。
glDrawElements要求顶点列表和法线列表要对应,在这里不是这种情况。如何对齐两个列表,以便glDrawElement正确地将法线分配给顶点?
我认为顶点列表中的顶点需要复制才能变为24个点,并且MFnMesh::getPolygonVertices需要指向重复的顶点。有什么办法吗?
最佳答案
顶点法线与顶点不是1:1:顶点法线与顶点只是1:1。显示硬边要求Maya对于定义该边的每个顶点都具有两个法线值。进入给定顶点的硬边越多,顶点可能支持的法线就越多:它总是至少有一个法线,但每个传入边最多可以有1个法线。您的24个法线反射(reflect)了以下事实:每个立方体顶点都有3个硬边
为了正确获得法线,应该使用顶点面顶点,而不是普通顶点。
from maya.api.OpenMaya import MFnMesh, MGlobal, MSpace, MVector
mobj = MGlobal.getSelectionListByName('pCubeShape1').getDagPath(0)
mesh = MFnMesh(mobj)
space = MSpace.kWorld
def vertices_and_normals(mesh_fn, face, space):
'''
mesh_fn = an MFnMesh, face = an integer, space = an MSpace enum valu
'''
normals = [MVector(m) for m in mesh_fn.getFaceVertexNormals(face, space=space)]
verts = [mesh_fn.getPoint(f, space=space) for f in mesh_fn.getPolygonVertices(face)]
return zip(verts, normals)
for f in range(6):
for v, n in vertices_and_normals(mesh,f, space):
print "v", v, "n", n
v (-0.5, -0.5, 0.5, 1) n (0, 0, 1)
v (0.5, -0.5, 0.5, 1) n (0, 0, 1)
v (0.5, 0.5, 0.5, 1) n (0, 0, 1)
v (-0.5, 0.5, 0.5, 1) n (0, 0, 1)
v (-0.5, 0.5, 0.5, 1) n (0, 1, 0)
v (0.5, 0.5, 0.5, 1) n (0, 1, 0)
v (0.5, 0.5, -0.5, 1) n (0, 1, 0)
v (-0.5, 0.5, -0.5, 1) n (0, 1, 0)
v (-0.5, 0.5, -0.5, 1) n (0, 0, -1)
v (0.5, 0.5, -0.5, 1) n (0, 0, -1)
v (0.5, -0.5, -0.5, 1) n (0, 0, -1)
v (-0.5, -0.5, -0.5, 1) n (0, 0, -1)
v (-0.5, -0.5, -0.5, 1) n (0, -1, 0)
v (0.5, -0.5, -0.5, 1) n (0, -1, 0)
v (0.5, -0.5, 0.5, 1) n (0, -1, 0)
v (-0.5, -0.5, 0.5, 1) n (0, -1, 0)
v (0.5, -0.5, 0.5, 1) n (1, 0, 0)
v (0.5, -0.5, -0.5, 1) n (1, 0, 0)
v (0.5, 0.5, -0.5, 1) n (1, 0, 0)
v (0.5, 0.5, 0.5, 1) n (1, 0, 0)
v (-0.5, -0.5, -0.5, 1) n (-1, 0, 0)
v (-0.5, -0.5, 0.5, 1) n (-1, 0, 0)
v (-0.5, 0.5, 0.5, 1) n (-1, 0, 0)
v (-0.5, 0.5, -0.5, 1) n (-1, 0, 0)
关于c++ - 如何在Maya Api中对齐顶点和法线?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31454205/