2017-02-06 4 views
0

Ich versuche, die Vertexnormale eines Mesh-Objekts an einem bestimmten Eckpunkt zu extrahieren. Ich habe festgestellt, dass ich unterschiedliche Ergebnisse erhalte, wenn ich die Python-API anstelle der Maya-Python-Befehle verwende.maya api vs Python-Befehle: Vertex-Normalen

Python-Befehle (gibt mir das Ergebnis, das ich will):

cmds.polyNormalPerVertex("<myshapename>.vtx[523]", q=True,normalXYZ=True) 

Die maya Python-API-Aufruf (gibt mir ein anderes Ergebnis):

# empty selection list 
selectionList = om.MSelectionList() 
selectionList.add(<myshapename>) 

# create empty dag path object 
dagPath = selectionList.getDagPath(0) 

# get mesh 
mesh = om.MFnTransform(dagPath) 

# get vertex normal 
mesh.getVertexNormal(523, False, space=om.MSpace.kWorld) 

bemerkte ich diese Diskrepanz wenn versucht wird, Normalen an einem Objekt zu extrahieren, dessen Scheitelpunkte sich an der Nahtgrenze zu einem anderen Objekt befinden. Die Normalen wurden in Maya mit Normals > Average Normals aus dem Polygons Menüsatz gemittelt.

Ich weiß, dass es ohne ein Beispielobjekt schwierig ist, aber ich hoffe, dass jemand dieses Problem vorher gesehen hat.

Kann jemand eine mögliche Erklärung für diese Diskrepanz liefern?

Antwort

1

Ich denke, du hast gerade Glück mit deinem cmds Ruf. Das übliche Verhalten für polyNormalPerVertex ist, alle der Normalen, die mit der vert - die, wenn es Teil von mehr als einem Gesicht ist, wird mehrere Antworten auf die gleiche Frage sein. Zum Beispiel auf einer Vanille polyCube

Import maya.cmds als cmds cmds.polyNormalPerVertex ('pCube1.vtx [0]', q = True, normalXYZ = True) # Ergebnis: [-1,0, 0,0, 0,0, 0.0.0.0.0.0.1.0.0.0-1.0.0.0] #

da der Vert Teil von drei verschiedenen Flächen ist.

Der API-Aufruf an getVertexNormal gibt den gemittelten Normalwert according to the docs zurück.

Sie sollten mehr Glück haben, wenn Sie vertexFaces an beiden Enden verwenden - diese sind weniger zweideutig.

+0

ok, danke für deine Antwort. Aber selbst wenn die Ergebnisse von 'polyNormalPerVertex' gemittelt werden, entspricht das nicht dem von 'getVertexNormal' zurückgegebenen Vektor (und ich habe alle Kombinationen von Parametern ausprobiert). Sollten sie nicht gleich sein? – user2635364

+0

Sie sollten identisch sein, wenn Sie die richtige Gewichtungsfunktion wählen - aber das wird jedes Mal neu berechnet, wenn Sie fragen, und könnte sich ändern, wenn Sie zum Beispiel ein Vert auf der anderen Seite desselben Gesichts bewegen. – theodox