3D模板阴影原理
1:先从3dsMax中导出一个简单的场景,一个园环,球,平面。
2:园环直接面向光源,园环对球体来说是一个光线的阻挡物,园环在它上面形成阴影,同时,园环和球体对平面来说是光线的阻挡物,所以,同时在其上面形成阴影。
3: 要产生模板阴影,先要找出在园环和球体上面面向光线的面,去除背向光线的面,通过测试光线同园环和球体上面每一个所组成的小角形的法线的夹角是否小于90度,即光线矢量同法线矢量的点积要大于零。
4:在余下的所有面向光线的面中,把每个面的每条边可以保存到一个Vector中,不过在保存之前,先把该条边同已保存在Vector中的每条边先进行逐一比较,如果,找到的这条边同它的两个顶点相同,但顺序相反,则取走在Vector中的这条边。
如找不到,则把该条边加入到Vector中,最后将得到一条(或两条)轮廓线(见图红色线)。
5: 把轮廓线上的每个点延着光线方向延长一定的长度(见黄线),黄线所构成的面(所谓的阴影体)同场景去作比较,即模板测试(stencil)
最后画出阴影部分和非阴影部分,这就是基本的原理。


public class Material { public float[] ambient = new float[3]; public float[] diffuse = new float[3]; public float[] specular = new float[3]; public float shininess; public String texFileName = null; float ou = 0f; float tu = 1.0f; float ov = 0f; float tv = 1.0f;}