简单的球形照明

时间:2014-11-10 11:55:08

标签: math 3d geometry pseudocode lighting

看看下面的球体,我们可以假设它是由排列在球体中的多边形组成的。每个多边形都有一个' x'轴旋转,以及' y'轴旋转,基于它在球体上的位置。

enter image description here

想象一下,只有一个光源。为了证明光源在指示的x和y轴旋转时在球体上投射光。

如果光量'被任何多边形接收的都在0-1之间(1是最亮的'点)如何确定任何给定多边形的亮度?

我假设我们采用y轴偏移(光源距离多边形多少度,压缩成0-1值)和x轴偏移(如前所述),并使用确定亮度的平均值,但想象一下这种感觉会让人觉得这会产生一颗“钻石”。形状轻。也许我的假设是错误的,这是对照明这个球体的正确理解,但如果不是......

在这种情况下,确定这些多边形亮度的正确过程是什么?

如果已经提出这个问题我很抱歉,我无法找到另一个阐述我问过的问题的例子,特别是简单的说法。可能我在搜索时没有使用正确的术语,所以也许这是一个足够的答案?

提前感谢您的任何帮助

编辑:在我收到一些令人困惑的高级数学公式之前,请记住我不是数学专业。一个实际的例子,比如伪代码对于stackoverflow上的读者来说会更有用和相关。再次感谢

1 个答案:

答案 0 :(得分:2)

我看到的任何光学公式都使用正常表面和光源方向之间的点积。

  • 如果展位向量是单位,则点积将为您提供数字<-1,+1>
  • 也是cos(a)值,其中a是N-D中矢量之间的最短角度
  • 3D示例:
  • normal: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;
  • 现在你在正常方向和光方向之间具有绝对角度&lt; 0,PI&gt;
  • 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);
  • 还有很多其他方法可以实现这个......

你的案子:

  • 目前尚不清楚光是在球体的中心还是在外面
  • 或它有什么方向
  • 对于中心的全向光源,整个内表面的照度将为1而不会产生粗糙的阻尼
  • 对于通用光源位置,您可以计算光照方向(对于全向光源)
  • 仅通过减去光源和表面点位置
  • 不要忘记制作那个载体单位
  • 对于定向源,已经给出了光矢量
  • 法线可以通过任意两个非平行顶点的叉积来从表面多边形获得
  • 顺序影响矢量的符号,所以使用你需要的那个(根据多边形缠绕)
  • 在球体中,法线向量也是相对于球体中心的表面位置,因此您可以跳过上述交叉计算