如何用maya 渲染论文彩图 (occulusion效果)
来源:互联网 发布:100本网络禁书打包下载 编辑:程序博客网 时间:2024/04/19 18:22
本文指导如何使用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()
p
=
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)
c
=
api.MColor(rgbVal)
cArray.append(c)
count
+
=
1
lineColor
=
fColor.readline()
if
count > countmax:
break
fColor.close()
iArray
=
[i
for
i
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文件请到 我的资源区下载
0 0
- 如何用maya 渲染论文彩图 (occulusion效果)
- 如何用endnote引用论文
- 如何用Markdown写论文?
- 如何用Markdown写论文?
- 利用Maya进行论文中网格动画数据的渲染
- 如何用websocket抓取JS渲染页面
- Latex 论文elsevier,手把手如何用Latex写论文
- Latex 论文elsevier,手把手如何用Latex写论文
- 一篇关于如何用深度学习完成自动上色(Automatic Image Colorization)的论文浅析
- 如何用CSS实现翻页效果?
- 如何用CSS实现翻页效果?
- 如何用css3实现风车效果
- 如何用CSS实现背景半透明效果
- SSH2如何用Cookie做两周免登陆效果
- 如何用css3做全屏切换效果
- 如何用PS制作羽化效果
- 如何用CorelDRAW拆清除调和效果
- 如何用Unity3D实现衍射效果
- oracle 安装错误码
- IO完成端口
- 微软 Build 2016年开发者大会发布多项功能升级
- 代码篇——Datagrid客户端假分页的代码
- js(头像,图片)上传,如何立即展示?图片详解。
- 如何用maya 渲染论文彩图 (occulusion效果)
- 基本数据类型:8种基本类型、对应的包装类、引用数据类型及与String 之间的转换。
- lightoj 1169 - Monkeys on Twin Tower 简单DP
- JSP程序设计:Servlet配置问题
- 买衣服
- HDU 1087 Super Jumping! Jumping! Jumping!
- vmware unlock 无法成功 LookupError: unknown encoding: cp65001
- 大锅乱炖10大H5前端框架
- 修改Odoo8.0列表表尾数值统计方式