如何用maya 渲染論文彩圖 (occulusion效果)

本文指導如何使用Maya來渲染一些用於論文的彩圖,效果如下:
本例子所用的maya版本 maya2015


步驟如下:
一、初始環境設置
1.打開 maya , 在新場景 ,確保一些環境設置。
 勾上 Mayatomr.dll  中的 兩個選項





二、頂點上色

由於腳本中使用的命名的原因,要到如的obj應該按照圖中的格式 ,從mesh_0000.obj 開始
使用移動工具調整好人的位置

下面說下如何上色:
由於 這裏使用的網格頂點數都相同,可以都用同一個顏色文件,格式如下:
然後使用 maya 腳本讀取 這個 squat2_coloring.seg 文件,給網格上色
說明:
framenum 是場景中mesh(也就是本例子中的人)的個數
labelColorFilePath 是上色文件的路徑
countmax 這裏設爲100000 ,是假定網格頂點的數量不超過100000
mel.eval('select -r mesh_000%d:MeshShape;' %frameid) 這裏涉及到 mesh的名稱,可以看到裏面的名稱
是與網格的名稱對應的,如果你不按照 mesh_0000.obj的命名,那麼腳本中相關的名稱要改一下


腳本文件:
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()

選擇人物右鍵 ,可以看到新上色的數據保存在colorSet1(RGBA)


此時渲染是沒有上色的效果的,這是因爲 )Maya中多邊形的頂點着色,使用的是與材質無關的另一套數據信息,這些頂點色彩與幾何體存儲在一起,可以導出到遊戲引擎或其他軟件中,但使用Maya software渲染器無法渲染出設定的頂點顏色。如圖:
 

三、導出mesh顏色到材質並渲染

由於本文中腳本的所用的節點的命名問題,請確保此時Hypershade中的 材質節點是初始的,這樣保證後面創建新的材質節點時命名不會出問題
初始的節點是這三個,工作區爲空
如果有 多餘的材質節點在,刪除它們的連接線後,再點 刪除未使用節點

選擇人物,再點節點編輯器
可以看到 人物它對應的網格節點 mesh_0000:MeshShape
可顯示 網格節點 mesh_0000:MeshShape 連接的其他節點
可以看到 mesh_0000:MeshShape 一開始 連接的是 initialShadingGroup ,這是初始的材質。
接下來要使用下面的一個代碼來連接材質節點,並創建新的材質節點連接來用於我們的渲染

說下下面的腳本,主要是做一些 渲染節點 的創建和連接 ,由於涉及到節點的名稱的關係,爲了保證名字的正確,在運行這個腳本之前就不要創建其他材質。framenum 是場景中mesh(也就是本例子中的人)的個數
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 ,可根據自己的情況設定

這個新的節點連接中關鍵是用到了 一個mentalrayVertexColors 節點,它可以把 網格mesh_0000中的顏色集 導出,並輸入到其他節點,比如這裏的mib_amb_occlusion ,這樣使得mib_amb_occlusion 具有mesh_0000中顏色集的顏色了,也就得到了一個新的材質。最後還要把新材質賦予給mesh_0000,即把mesh_0000:MeshShape連接到 surfaceShader1SG
這些節點的連接過程當然可以手工在節點編輯器上完成,但比較麻煩,也可能引發死機(我雙點了一下節點就死機了,原因不明)

此時由於occ材質的關係,在 viewport2.0 下物體表面黑色,不利於觀察,可以切換到舊版默認視口
渲染一下
效果下面這樣
改一下照相機的底色

保存爲png 格式,其實那些白色的透明的

但這個效果我們還是不滿意,因爲感覺缺少陰影效果。由於occ 材質的原因,我們不需要添加燈光,要產生陰影,需要加上一些地板等其他東西,物體與物體之間就會產生陰影效果
並且拉伸
接下來給地板也上occ 白色材質
可以用下面這個mel 代碼來連接該兩個節點
connectAttr -f mib_amb_occlusion4.outValue surfaceShader4.outColor;
setAttr "mib_amb_occlusion4.samples" 256;

選擇物體
final results
more results
文中所用的素材以及maya文件請到 我的資源區下載
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章