c++ - 如何在 Maya Api 中对齐顶点和法线?

标签 c++ opengl maya normals

我想使用 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/

相关文章:

c++ - 避免宏可用于客户端代码

c++ - 定义静态常量通用唯一标识符(UUID)

opengl - 使用 imageAtomicCompSwap 的 GLSL 每像素自旋锁

java - 围绕其中心旋转 GLUT 位图/描边字符串?

c++ - Qt delete 适用于 Valgrind 但不能正常执行

C++/SFML2 Sprite 没有显示

c++ - 迭代顶点缓冲区

python - 需要创建一个集合列表,从其成员可能连接的集合列表

python - 导入时对象的名称

javascript - 将 Maya 模型导入到 Three.js 场景的最佳方法是什么