Я пытаюсь получить цвет текстуры по координате u v относительно вершины поли. Проблема, с которой я сталкиваюсь, заключается в том, что каждая полученная мной координата приводит к одному и тому же цвету, даже если она не окрашена таким образом.
Я пытался разместить текстуру и нарисовать ее позже, а затем получить цвет каждой вершины в простой плоскости. То, что я мог видеть вокруг, более или менее то, что у меня уже есть, polyListComponentConversion
и colorAtPoint
с полученными координатами уф.
Точки, которые я получаю: [0.0, 0.0], [1.0, 0.0], [0.0, 1.0], [1.0, 1.0]
, и цвет всегда один и тот же, который нарисован в одном из углов.
Если вместо этого я попытаюсь жестко закодировать другое значение (например, [.5, .5]
), тогда я получу другой цвет, который кажется точным.
Что я делаю:
#Create and place the texture files into the poly
def createShadingEngine(vName):
vNewShadingGroup = mc.sets(name = '{0}_SG'.format(vName), empty = True, renderable = True, noSurfaceShader = True)
vNewMaterial = mc.shadingNode('lambert', name = '{0}_mat'.format(vName), asShader = True)
mc.connectAttr('{0}.outColor'.format(vNewMaterial), '{0}.surfaceShader'.format(vNewShadingGroup))
vNewTexture = mc.shadingNode('file', name = '{0}_file'.format(vName), asTexture = True)
vNewUtility = mc.shadingNode('place2dTexture', name = '{0}_tex'.format(vName), asUtility = True)
mc.connectAttr('{0}.outColor'.format(vNewTexture), '{0}.color'.format(vNewMaterial))
vConnectAttr = ['coverage', 'translateFrame', 'rotateFrame', 'mirrorU', 'mirrorV', 'stagger', 'wrapU', 'wrapV',
'repeatUV', 'offset', 'rotateUV', 'noiseUV', 'vertexUvOne', 'vertexUvTwo', 'vertexUvThree', 'vertexCameraOne']
for vAttr in vConnectAttr:
mc.connectAttr('{0}.{1}'.format(vNewUtility, vAttr), '{0}.{1}'.format(vNewTexture, vAttr))
mc.connectAttr('{0}.outUV'.format(vNewUtility), '{0}.uv'.format(vNewTexture))
mc.connectAttr('{0}.outUvFilterSize'.format(vNewUtility), '{0}.uvFilterSize'.format(vNewTexture))
return vNewShadingGroup
#Get the map points for the poly
def getPolyMap(vPoly):
vPoints = []
if mc.objExists(vPoly):
vShape = mc.listRelatives('pPlane1', children = True, fullPath = True, shapes = True)[0]
vEngine = mc.listConnections(vShape, type = 'shadingEngine')
vMaterials = mc.ls(mc.listConnections(vEngine), materials = True)
vTextureFiles = mc.listConnections(vMaterials, type = 'file')
if vTextureFiles :
vMapPoints = mc.polyListComponentConversion('{0}.vtx[*]'.format(vPoly), fv = True, tuv = True)
vMapPoints = mc.ls(vMapPoints, flatten = True)
for vPoint in vMapPoints:
vCoord = mc.polyEditUV(vPoint, q = True)
print vPoint, vCoord
vPoints.append(vCoord)
return vPoints
#Get the color at those points
def getColorAtPointUV(vPoly, vUVPoint = [0, 0]):
vColor = ''
vShape = mc.listRelatives('pPlane1', children = True, fullPath = True, shapes = True)[0]
vEngine = mc.listConnections(vShape, type = 'shadingEngine')
vMaterials = mc.ls(mc.listConnections(vEngine), materials = True)
vTextureFiles = mc.listConnections(vMaterials, type = 'file')
if vTextureFiles and len(vUVPoint) == 2:
vColor = mc.colorAtPoint('{0}.outColor'.format(vTextureFiles ), o = 'RGB', u = vUVPoint[0], v = vUVPoint[1])
return vColor
#With those functions I execute:
vShape = mc.listRelatives('pPlane1', children = True, fullPath = True, shapes = True)[0]
vEngine = mc.listConnections(vShape, type = 'shadingEngine')
vMaterials = mc.ls(mc.listConnections(vEngine), materials = True)
vTextureFiles = mc.listConnections(vMaterials, type = 'file')
cv = getPolyMap('pPlane1')
for cc in cv:
print cc, mc.colorAtPoint(vTextureFiles, o = 'RGB', u = cc[0], v = cc[1])
В результате я получаю:
[0.0, 0.0] [0.00784313678741455, 0.9921568036079407, 0.00784313678741455]
[1.0, 0.0] [0.00784313678741455, 0.9921568036079407, 0.00784313678741455]
[0.0, 1.0] [0.00784313678741455, 0.9921568036079407, 0.00784313678741455]
[1.0, 1.0] [0.00784313678741455, 0.9921568036079407, 0.00784313678741455]
Каждый угол ультрафиолета печатается зеленым, даже если только его угол того же цвета.
С другой стороны, если я нажму u = .5
, v = .5
, результат будет правильным (по умолчанию серый [0.5019607543945312, 0.5019607543945312, 0.5019607543945312]
)
Невозможно опубликовать изображения, но это серый квадрат с зеленой точкой, закрывающей правый верхний угол).