3D软件中 物体的反射效果好坏是决定材质好坏的重要标准
千万不要误以为 “只要打开高级的渲染器、勾上光线追踪”就能得到良好的反射效果
其实 为了能模拟出真实的反射效果 我们要注意很多细节
反射强度、反射硬度、反射率、反射色这些基本参数就不多说了
除此之外 反射模糊、反射衰减、菲涅耳反射、反射的各向异性、反射的运动模糊等要素是
产生细节的法宝
这篇教程要讲的就是Maya节点模拟反射衰减
什么是反射衰减 请看下面的效果 这样的效果很好理解

真实的物体反射或多或少都存在着反射衰减
但是maya中却没有一个默认参数能直接控制这个效果
根据观察 我们容易发现离反射面距离越远 物体的被反射能力越低
因此 可用通过计算反射面物体(面)的“距离”来决定反射率
这就是利用maya节点模拟反射衰减的思路 
具体实现方法如下:
1)求得离反射物体最近的被反射物体上的点A(也可能是线、也可能是面)
2)计算被反射物理距离A的距离
3)将这个距离用0-1之间的数值量化
4)将这个数值赋给物体的reflectivity属性
我们会用到以下几个节点:
shape、sampleInfo、closestPointOSurface、distanceBetween、setRange、place2dTexture、ramp

连接方法如下图
说明:
1) distanceBetween已经被maya6.0整合 能轻松在材质窗口中获得
如使用较早的maya版本 请通过如下方法获得此节点
在command line中输入 creatNode distanceBetween;
不要在此时做其他操作 进入hypershade编辑器 点击Graph/Add selected to Graph
便可以在材质网络图中看到distanceBetween节点
2)closestPointonSurface作用是获得曲面上最近的点的信息
参照曲面的worldSpace属性必须和closestPointonSurface节点的inputSurface属性相连接
才能奏效
同时 必须在command line中创建closestPointonSurface节点(同distanceBetween节点)
为了简化这一系列操作 我们可以利用mel
选中反射面 在Script Editor中执行如下脚本:
string $selection[];
$selection = `ls -sl`;
string $cposNode;
$cposNode = `createNode closestPointonSurface`;
connectAttr ($selection[0] + ".worldSpace[0]") ($cposNode + ".inputSurface");
select -r $cposNode;
hyperShadePanelGraphCommand ("hyperShadePanel1", "addselected");
3) sampleInfo节点用来获得被测反射点
4) setrange节点用来将反射距离的数值(0-X)映射到范围(0-1)
x的值可由工具测量(creat/measure tool) 也可通过节点算得(不再扩展讲解)
5)maya默认反射率(reflectivity)的范围是0-1
0代表不反射 1代表反射率很高(反射率可以超过1 有时超过1的设置会带来意外的效果)
而Alpha中黑色表示0 白色表示1
所以 我们最终将距离与颜色信息通过ramp节点对应起来(范围都是0-1)
以上便是通过maya节点模拟“反射衰减”的方法 欢迎交流 
|