看看下面的球体,我们可以假设它是由排列在球体中的多边形组成的。每个多边形都有一个' x'轴旋转,以及' y'轴旋转,基于它在球体上的位置。
想象一下,只有一个光源。为了证明光源在指示的x和y轴旋转时在球体上投射光。
如果光量'被任何多边形接收的都在0-1之间(1是最亮的'点)如何确定任何给定多边形的亮度?
我假设我们采用y轴偏移(光源距离多边形多少度,压缩成0-1值)和x轴偏移(如前所述),并使用确定亮度的平均值,但想象一下这种感觉会让人觉得这会产生一颗“钻石”。形状轻。也许我的假设是错误的,这是对照明这个球体的正确理解,但如果不是......
在这种情况下,确定这些多边形亮度的正确过程是什么?
如果已经提出这个问题我很抱歉,我无法找到另一个阐述我问过的问题的例子,特别是简单的说法。可能我在搜索时没有使用正确的术语,所以也许这是一个足够的答案?
提前感谢您的任何帮助
编辑:在我收到一些令人困惑的高级数学公式之前,请记住我不是数学专业。一个实际的例子,比如伪代码对于stackoverflow上的读者来说会更有用和相关。再次感谢
答案 0 :(得分:2)
我看到的任何光学公式都使用正常表面和光源方向之间的点积。
<-1,+1>
cos(a)
值,其中a是N-D中矢量之间的最短角度n(nx,ny,nz)
d(dx,dy,dz)
cos(a)=dot(n,d)=(n.d)=(nx*dx+ny*dy+nz*dz)
cos(a)
直接获取照明信息来自i
cos(a)
i=cos(a);
if (i<0.0) i=0.0;
//忽略否定结果,因为光线方向相反i=a0+a1*i+a2*i*i+a3*i*i*i+...
a0
是环境照明(最小照度大于零)a1
是线性系数a2
是二次系数,等等a0+a1+a2+...=1
来自i
a
a=acos(cos(a))=acos(n.d)
<0,2*PI>
if (a>PI) a-=2*PI;
if (a<0.0) a=-a;
i=1.0-(2.0*a/PI);
if (i<0.0) i=0.0;
i=a0+a1*i+a2*i*i+a3*i*i*i+...
距离
l
b=(b0+b1*l+b2*l*l+...)/I0
if (b<0.0) b=0.0;
if (b>1.0)
b = 1.0; b
是阻尼系数0表示无阻尼,1表示100%光被移除I0
是光源强度i*=(1.0-b);
你的案子: