1、 基本场景角色,地面和一盏平行光(Depth Map Shadows),Resolution: 512
2 先对比图吧,地面是10倍,30倍, 80倍,阴影贴图的变化;
3 、解决:进入灯光属性如下调整,基本解决了问题。
4、可是如果对象不是一个呢,问题还是存在。
5 、是否在大场景中贴图阴影(Depth Map Shadows)就无法用了呢?现在我们来尝试一种全新的概念来解决。关掉现在这盏平行光的阴影贴图建立新的spot灯光,方向调整到于平行光相同。(也可以建立orientConstraint,来约束新创建的spotLight)
6、 对spot进行调整,先取消Use Auto Focus ,调整 Focus和Cone Angle相同;
7 、调整灯光角度,能看到主角为好。
8 、渲染测试,投影非常理想,除了多了个聚光灯的光圈。
9 、复制这盏spotLight,将它的阴影关掉
10、 将复制的灯光强度调整为 -1,渲染测试;耀眼的强光没有了,投影非常理想;
11 、同样复制上述两盏spotLight为其他的角色打光:
12 、渲染测试:
13、思路:
由于阴影贴图的尺寸是投影质量的关键,我们如此可以避开大尺寸的阴影贴图,提高渲染时间,同时又可以保证投影的质量。
在动画时只要将上述的灯光成组,跟随角色移动就好了。
例如在大场景奔跑的人物,快速飞驰的车辆等等,在大场景中的一切一切。
思路有了,在用的时候每次总要执行上述操作显然是比较浪费时间,我们用MEL来继续完成这个工具。
这是我已经完成的脚本核心内容
///////////////////////////////////////////////////
string $soliSpot = "soliSpot" ;
string $SpotL = `shadingNode -asLight spotLight` ;
//建立第一盏灯光
string $shape[] = `ls -dag -sl` ;
setAttr ($shape[0]+".dms") 1 ;
//打开阴影属性
setAttr ($shape[0]+".useDmapAutoFocus") 0 ;
//关掉自动适应阴影贴图
string $Spotf[] =`duplicate -rr` ;
//复制灯光
parentConstraint -mo -weight 1 $SpotL $Spotf[0];
//进行约束控制
scale 0.5 0.5 0.5 ;
//放缩反向的灯,以方便观察
setAttr ($Spotf[0]+".dms") 0 ;
setAttr ($Spotf[0]+".overrideEnabled") 1;
setAttr ($Spotf[0]+".overrideDisplayType") 2;
//关掉阴影,制作成模板,使其不能被选择
//以免误操作
string $shape1[] = `ls -dag -sl` ;
string $connectAttr;
$exp1 = ($shape[0]+".df"+"="+$shape1[1]+".df"+"="+$shape1[1]+".ca"+"="+$shape[0]+".ca;");
$exp2 = ($shape1[1]+".in"+" = -"+$shape[0]+".in;") ;
expression -s ($exp1 + "\r"+$exp2 );
//用表达式控制两盏灯的关联关系
$connectAttr ="connectAttr -f "+$shape[0]+".color "+$shape1[1]+".color";
eval($connectAttr);
//进一步的属性链接
//使得,大多数操作,可以关联
select $SpotL ;
//选择主灯,方便视图调整。
///////////////////////////////////////////////////
以下是我原创的完整脚本工具
spotL.mel (1.97k)
14 、脚本的信息:
脚本spotL暂时没有用户界面,其实也不需要,只要在命令行执行"spotL",即刻得到阴影灯。
阴影灯对于场景不提供照明,只提供阴影。如果场景中只有阴影灯是渲染不出物体的。
脚本将阴影灯的大小进行了放缩,方便观察。
关掉了对于反向辅助灯的操作,因为此时大多数的操作都可以关联的。
如果删除了阴影灯的主灯,只需稍稍拨动时间线,或是再次渲染即可删除相应的辅助灯。无需担心场景的多余垃圾。但是阴影灯的组会保留,清理场景即可。
脚本适用于支持maya的所有渲染器,且都有非常好的渲染速度。
如此,再大的场景我们也不怕了,放心大胆的用Depth Map Shadows吧,
享受他的快捷和直观。