天天看點

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

本文指導如何使用Maya來渲染一些用于論文的彩圖,效果如下:

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

本例子所用的maya版本 maya2015

步驟如下: 一、初始環境設定 1.打開 maya , 在新場景 ,確定一些環境設定。

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

 勾上 Mayatomr.dll  中的 兩個選項

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

二、頂點上色

由于腳本中使用的命名的原因,要到如的obj應該按照圖中的格式 ,從mesh_0000.obj 開始

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

使用移動工具調整好人的位置

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

下面說下如何上色: 由于 這裡使用的網格頂點數都相同,可以都用同一個顔色檔案,格式如下:

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

然後使用 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效果)
如何用maya 渲染論文彩圖 (occulusion效果)
如何用maya 渲染論文彩圖 (occulusion效果)
如何用maya 渲染論文彩圖 (occulusion效果)

腳本檔案:

import

re

import

maya.api.OpenMaya as api

import

maya.mel as mel

global

cnt

global

framenum

framenum 

=

3

cnt 

=

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

=

rgbVal 

=

[

1.0

,

0.0

,

0.0

,

1.0

]

selectionList 

=

api.MGlobal.getActiveSelectionList()

nodeDagPath 

=

selectionList.getDagPath(

)

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[

=

(

float

(splitesult[

]))

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效果)

選擇人物右鍵 ,可以看到新上色的資料儲存在colorSet1(RGBA)

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

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

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

三、導出mesh顔色到材質并渲染

由于本文中腳本的所用的節點的命名問題,請確定此時Hypershade中的 材質節點是初始的,這樣保證後面建立新的材質節點時命名不會出問題

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

初始的節點是這三個,工作區為空

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

如果有 多餘的材質節點在,删除它們的連接配接線後,再點 删除未使用節點

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

選擇人物,再點節點編輯器

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

可以看到 人物它對應的網格節點 mesh_0000:MeshShape

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

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

可顯示  網格節點 mesh_0000:MeshShape 連接配接的其他節點 可以看到 mesh_0000:MeshShape 一開始 連接配接的是 initialShadingGroup ,這是初始的材質。

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

接下來要使用下面的一個代碼來連接配接材質節點,并建立新的材質節點連接配接來用于我們的渲染

說下下面的腳本,主要是做一些 渲染節點 的建立和連接配接 ,由于涉及到節點的名稱的關系,為了保證名字的正确,在運作這個腳本之前就不要建立其他材質。 framenum 是場景中mesh(也就是本例子中的人)的個數

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

import

re

import

maya.cmds as cmds

import

maya.mel as mel

global

count 

count 

=

global

framenum

framenum 

=

3

for

frameid 

in

range

(

, 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效果)

這個新的節點連接配接中關鍵是用到了 一個 mentalrayVertexColors  節點,它可以把 網格mesh_0000中的顔色集 導出,并輸入到其他節點,比如這裡的mib_amb_occlusion ,這樣使得mib_amb_occlusion 具有mesh_0000中顔色集的顔色了,也就得到了一個新的材質。最後還要把新材質賦予給mesh_0000,即把mesh_0000:MeshShape連接配接到 surfaceShader1SG

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

這些節點的連接配接過程當然可以手工在節點編輯器上完成,但比較麻煩,也可能引發當機(我雙點了一下節點就當機了,原因不明)

此時由于occ材質的關系,在 viewport2.0 下物體表面黑色,不利于觀察,可以切換到舊版預設視口

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

渲染一下

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

效果下面這樣

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

改一下照相機的底色

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

儲存為png 格式,其實那些白色的透明的

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

但這個效果我們還是不滿意,因為感覺缺少陰影效果。由于occ 材質的原因,我們不需要添加燈光,要産生陰影,需要加上一些地闆等其他東西,物體與物體之間就會産生陰影效果

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

并且拉伸

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

接下來給地闆也上occ 白色材質

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

可以用下面這個mel 代碼來連接配接該兩個節點 connectAttr -f mib_amb_occlusion4.outValue surfaceShader4.outColor;

setAttr "mib_amb_occlusion4.samples" 256;

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

選擇物體

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

final results

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

more results

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

文中所用的素材以及maya檔案請到 我的資源區下載下傳