如何用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文件请到 我的资源区下载

时间: 2024-08-09 20:41:54

如何用maya 渲染论文彩图 (occulusion效果)的相关文章

终极解决maya渲染层丢材质,变线框等问题

终极解决maya渲染层丢材质,变线框等问题 相信有很多同志在使用maya做灯光渲染的时候,经常能遇到渲染层的模型丢材质.变线框等问题,特别恶心.我也经常遇到,所以和大家分享一下我的解决或尽量避免的方法. 引用文件(Reference)工作原理: 引用文件在生产中以层级的方式来工作,每个层级都可以同时做不同的工作. 当创建完引用文件后,在当前场景里会保存引用对象的原始数据,并且所有编辑修改的数据都会储存在引用节点(Reference)里,也就是当前的maya文件里. 当打开当前场景文件时数据是从低

Maya 渲染测试日志

//Maya渲染测试 日志 2019.1.22 回顾 problems 1.打开时,重新固定连接地址, 从场景中连接到asset文件中 方法:逐个重新连接  隐患:若材质和模型过多,则此方法太繁琐 原因:没有完整的项目文档,失去了隐含连接 2.Arnold渲染器未正确安装,无法开启 解决方法:找学姐借安装包,安装Arnold渲染器:Maya中设置,窗口/设置首选项/插件管理器, 找到mtoa.mll并加载 3.Arnold渲染器 2016版,无法加载到2018maya中. 现有问题: 材质无法表

Android 颜色渲染(七) RadialGradient 环形渲染实现水波纹效果

版权声明:本文为博主原创文章,未经博主允许不得转载. 利用环形渲染我们可以做到什么? 其实很多都是非常常见的,比如上一篇实现的帮帮糖效果, 彩色的热气球,比如这里要讲到的水波纹效果,或者也可以理解为扩散色渲染效果 首先看一下效果图: 轻触屏幕,即可看到对应的效果,可以看到,实现这种效果,利用RadialGradient ,只需简单几行代码: MainActivity: [java] view plain copy package com.tony.testshader; import andro

利用maya 学术论文动画制作心得

大致效果: 1.首先 导入模型. 我这里使用的模型都是单个,不是obj 运动序列那种. 导入模型碰到 打开异常,已经显示异常等情况,可以考虑使用meshlab 把obj 模型再输出一遍,这些有可能是格式问题 2. 可以设置一下 模型的 材质,颜色等.我这里是 使用的 occ 的显示方法,这个显示效果有个好处就是不会有明显的 光亮和 阴影,不需要设光源 ,看起来就像物体本身就有光一样,物体与物体之间靠近时会有阴影效果 要给物体赋予这样的颜色,步骤如下: 1. 注意确保 menta ray 选上 否

Qt3D的研究(四):指定渲染的材质以及效果

在上一篇文章中我了解到了怎样简单地显示模型.Qt3D内置了一个obj模型的解析器,这样可以将简单的obj模型载入并且显示出来.其实Qt3D对于渲染的配置还是很厉害的,通过设定材质,我们可以得到很不错的渲染效果,而且可以通过设定Effect,将自己指定的着色器载入,让Qt 3D和OpenGL进行编译,得到自己想要的渲染效果. 蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/article/details/43983493.欢迎同行前来探讨. 在上一篇文章介绍的

js渲染数字自增长效果

数字自增长效果一般用于页面上显示的敏感指标值.具体简单实现如下: 1 function renderIncreasingNum(num, fn){ 2 var i = 0, 3 addUnit = 1, 4 interv = setInterval(function(){ 5 if(i<100){ 6 fn.call(null, parseInt(num)-100+i); 7 i+= addUnit; 8 }else{ 9 fn.call(null, num); 10 clearInterval

Android之如何用TextView实现滚动字幕的效果【跑马灯】

TextView 实现滚动字幕效果[跑马灯效果]: android:ellipsize="marquee"//可滚动,star(头部),middle(中部),end(尾部) 超出显示不下的内容用...代替, 实现条件 1.必须设置为单行显示,且TextView中的内容超过它的容纳范围, 2.TextView本身没有焦点,必须设置成可获取焦点 <TextView android:layout_width="100dp" android:layout_height

如何用PS快速做出3D按钮效果的图片

1 先建立一个透明图层 2:再创建一个矩形 3:选用过喷样式 4: 双击图层并应用蓝色,记得这里应该复制下颜色的16进制值. 效果如图所示 取消光泽选项,大功告成! 最终效果如图所示,将其保存为PNG格式的图片即可使用. 通过调节如下图所示的大小,可以制作不同深浅的按钮 效果图如下: 如果要制作圆形按钮,那么自定义形状时选择圆形即可. 这真是太简单了!

如何用JavaScript实现获取验证码的效果

转自:http://www.php.cn/js-tutorial-411734.html HTML部分: 1 2 3 4 5 6 7 <body onload='createCode()'>         <div>验证码:              <input type = "text" id = "input"/>              <input type="button" id=&quo