如何用maya 渲染论文彩图 (occulusion效果)

本文指导如何使用Maya来渲染一些用于论文的彩图,效果如下: 如何用maya 渲染论文彩图 (occulusion效果)_第1张图片
本例子所用的maya版本 maya2015


步骤如下:
一、初始环境设置
1.打开 maya , 在新场景 ,确保一些环境设置。
如何用maya 渲染论文彩图 (occulusion效果)_第2张图片
 勾上 Mayatomr.dll  中的 两个选项
如何用maya 渲染论文彩图 (occulusion效果)_第3张图片
如何用maya 渲染论文彩图 (occulusion效果)_第4张图片

如何用maya 渲染论文彩图 (occulusion效果)_第5张图片
如何用maya 渲染论文彩图 (occulusion效果)_第6张图片
如何用maya 渲染论文彩图 (occulusion效果)_第7张图片
如何用maya 渲染论文彩图 (occulusion效果)_第8张图片

如何用maya 渲染论文彩图 (occulusion效果)_第9张图片


如何用maya 渲染论文彩图 (occulusion效果)_第10张图片 如何用maya 渲染论文彩图 (occulusion效果)_第11张图片

二、顶点上色

由于脚本中使用的命名的原因,要到如的obj应该按照图中的格式 ,从mesh_0000.obj 开始
使用移动工具调整好人的位置

下面说下如何上色:
由于 这里使用的网格顶点数都相同,可以都用同一个颜色文件,格式如下:
如何用maya 渲染论文彩图 (occulusion效果)_第12张图片
然后使用 maya 脚本读取 这个 squat2_coloring.seg 文件,给网格上色
说明:
framenum 是场景中mesh(也就是本例子中的人)的个数
labelColorFilePath 是上色文件的路径
countmax 这里设为100000 ,是假定网格顶点的数量不超过100000
mel.eval('select -r mesh_000%d:MeshShape;' %frameid) 这里涉及到 mesh的名称,可以看到里面的名称
是与网格的名称对应的,如果你不按照 mesh_0000.obj的命名,那么脚本中相关的名称要改一下
如何用maya 渲染论文彩图 (occulusion效果)_第13张图片

如何用maya 渲染论文彩图 (occulusion效果)_第14张图片

如何用maya 渲染论文彩图 (occulusion效果)_第15张图片
如何用maya 渲染论文彩图 (occulusion效果)_第16张图片
脚本文件:
import  re
import  maya.api.OpenMaya as api
import  maya.mel as mel
global  cnt
global  framenum
framenum  =  3  
cnt  =  0
global  countmax
countmax  =  100000
global  labelColorFilePath
labelColorFilePath  =  r 'D:\zzb\squat2\squat2_coloring.seg'
  
  
def  paintColor():
    
     for  frameid  in  range  (framenum):
             mel. eval ( 'select -r mesh_000%d:MeshShape;'  % frameid)
             mel. eval ( 'polyColorPerVertex -r 0.5 -g 0.5 -b 0.5 -a 1 -cdo;' )
              
             fColor  =  open (labelColorFilePath,  'r' )
             lineColor  =  fColor.readline()
             =  re. compile ( '\s+' )
             count =  0
             rgbVal  =  [ 1.0 , 0.0 , 0.0 , 1.0 ]
  
             selectionList  =  api.MGlobal.getActiveSelectionList()
             nodeDagPath  =  selectionList.getDagPath( 0 )
             mfnMesh  =  api.MFnMesh(nodeDagPath)
             cArray  =  []
             while  lineColor:
                     lineColor  = lineColor.strip( '   ' )
                     lineColor  = lineColor.strip( '\n' )
                     splitesult  =  p.split(lineColor)
                     #cmds.select('MeshShape.vtx[%d]' % count)
  
                     rgbVal[ 0 =  ( float (splitesult[ 0 ]))
                     rgbVal[ 1 =  ( float (splitesult[ 1 ]))
                     rgbVal[ 2 =  ( float (splitesult[ 2 ]))          
                     #cmds.polyColorPerVertex( rgb = rgbVal , notUndoable = True)
  
                     =  api.MColor(rgbVal)
                     cArray.append(c)
                     count  + =  1
                     lineColor  =  fColor.readline()
                     if  count > countmax:
                             break
             fColor.close()
  
             iArray  =  [i  for  in  xrange (count)]
             mfnMesh.setVertexColors(cArray, iArray)
             global  cnt
             cnt  + =  1
             print  cnt
paintColor()

如何用maya 渲染论文彩图 (occulusion效果)_第17张图片
选择人物右键 ,可以看到新上色的数据保存在colorSet1(RGBA)
如何用maya 渲染论文彩图 (occulusion效果)_第18张图片

如何用maya 渲染论文彩图 (occulusion效果)_第19张图片
此时渲染是没有上色的效果的,这是因为 )Maya中多边形的顶点着色,使用的是与材质无关的另一套数据信息,这些顶点色彩与几何体存储在一起,可以导出到游戏引擎或其他软件中,但使用Maya software渲染器无法渲染出设定的顶点颜色。如图:
 
如何用maya 渲染论文彩图 (occulusion效果)_第20张图片

三、导出mesh颜色到材质并渲染

由于本文中脚本的所用的节点的命名问题,请确保此时Hypershade中的 材质节点是初始的,这样保证后面创建新的材质节点时命名不会出问题
初始的节点是这三个,工作区为空
如何用maya 渲染论文彩图 (occulusion效果)_第21张图片
如果有 多余的材质节点在,删除它们的连接线后,再点 删除未使用节点

选择人物,再点节点编辑器
如何用maya 渲染论文彩图 (occulusion效果)_第22张图片
可以看到 人物它对应的网格节点 mesh_0000:MeshShape
如何用maya 渲染论文彩图 (occulusion效果)_第23张图片
可显示  网格节点 mesh_0000:MeshShape 连接的其他节点
可以看到 mesh_0000:MeshShape 一开始 连接的是 initialShadingGroup ,这是初始的材质。
接下来要使用下面的一个代码来连接材质节点,并创建新的材质节点连接来用于我们的渲染

说下下面的脚本,主要是做一些 渲染节点 的创建和连接 ,由于涉及到节点的名称的关系,为了保证名字的正确,在运行这个脚本之前就不要创建其他材质。 framenum 是场景中mesh(也就是本例子中的人)的个数
如何用maya 渲染论文彩图 (occulusion效果)_第24张图片
import  re
import  maya.cmds as cmds
import  maya.mel as mel
global  count 
count  =  0 
global  framenum
framenum  =  3
 
for  frameid  in  range  ( 0 , framenum):
     print  count
     mel. eval ( 'string $surfaceShader_%d = `createNode  surfaceShader`;'  % (frameid + 1 ))
     mel. eval ( 'sets -renderable true -noSurfaceShader true -empty -name surfaceShader%dSG;' % (frameid + 1 ))
     mel. eval ( 'connectAttr -f surfaceShader%d.outColor surfaceShader%dSG.surfaceShader;' % (frameid + 1  ,frameid + 1 ))
     mel. eval ( 'string $mib_amb_occlusion_%d = `createNode  mib_amb_occlusion`;'  % (frameid + 1 ) )
     mel. eval ( 'connectAttr -force mib_amb_occlusion%d.outValue surfaceShader%d.outColor;' % (frameid + 1  ,frameid + 1 ))
     mel. eval ( 'string $mentalrayVertexColors_%d = `createNode mentalrayVertexColors`;'  % (frameid + 1 ))
     mel. eval ( 'connectAttr -force mesh_000%d:MeshShape.colorSet[0].colorName mentalrayVertexColors%d.cpvSets[0];'  % (frameid ,frameid + 1 ))
     mel. eval ( 'connectAttr -f mentalrayVertexColors%d.outColor mib_amb_occlusion%d.bright; ' % (frameid + 1  ,frameid + 1 ))
     mel. eval ( 'disconnectAttr mesh_000%d:MeshShape.instObjGroups[0] initialShadingGroup.dagSetMembers[%d];' % (frameid ,frameid) )
     mel. eval ( 'connectAttr -force mesh_000%d:MeshShape.instObjGroups[0] surfaceShader%dSG.dagSetMembers[0];' % (frameid ,frameid + 1 ))
     mel. eval ( 'setAttr "mib_amb_occlusion%d.samples" 256;'  % (frameid + 1 ) )
     count + = 1
其中  mel. eval ( 'setAttr "mib_amb_occlusion%d.samples" 256;'   % (frameid + 1 ) ) 设定samples 值为256 ,可根据自己的情况设定
如何用maya 渲染论文彩图 (occulusion效果)_第25张图片
这个新的节点连接中关键是用到了 一个 mentalrayVertexColors  节点,它可以把 网格mesh_0000中的颜色集 导出,并输入到其他节点,比如这里的mib_amb_occlusion ,这样使得mib_amb_occlusion 具有mesh_0000中颜色集的颜色了,也就得到了一个新的材质。最后还要把新材质赋予给mesh_0000,即把mesh_0000:MeshShape连接到 surfaceShader1SG
如何用maya 渲染论文彩图 (occulusion效果)_第26张图片
这些节点的连接过程当然可以手工在节点编辑器上完成,但比较麻烦,也可能引发死机(我双点了一下节点就死机了,原因不明)

此时由于occ材质的关系,在 viewport2.0 下物体表面黑色,不利于观察,可以切换到旧版默认视口
如何用maya 渲染论文彩图 (occulusion效果)_第27张图片
如何用maya 渲染论文彩图 (occulusion效果)_第28张图片
渲染一下
效果下面这样
改一下照相机的底色
如何用maya 渲染论文彩图 (occulusion效果)_第29张图片
如何用maya 渲染论文彩图 (occulusion效果)_第30张图片

如何用maya 渲染论文彩图 (occulusion效果)_第31张图片保存为png 格式,其实那些白色的透明的

如何用maya 渲染论文彩图 (occulusion效果)_第32张图片
如何用maya 渲染论文彩图 (occulusion效果)_第33张图片
但这个效果我们还是不满意,因为感觉缺少阴影效果。由于occ 材质的原因,我们不需要添加灯光,要产生阴影,需要加上一些地板等其他东西,物体与物体之间就会产生阴影效果
如何用maya 渲染论文彩图 (occulusion效果)_第34张图片
并且拉伸
如何用maya 渲染论文彩图 (occulusion效果)_第35张图片
接下来给地板也上occ 白色材质
可以用下面这个mel 代码来连接该两个节点
connectAttr -f mib_amb_occlusion4.outValue surfaceShader4.outColor;
setAttr "mib_amb_occlusion4.samples" 256;

如何用maya 渲染论文彩图 (occulusion效果)_第36张图片
选择物体
如何用maya 渲染论文彩图 (occulusion效果)_第37张图片
final results
more results
文中所用的素材以及maya文件请到 我的资源区下载

你可能感兴趣的:(论文,图形,Maya)