【问题标题】:Simple spherical lighting简单的球形照明
【发布时间】:2014-11-11 15:27:36
【问题描述】:

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

想象有一个单一的光源。为了演示,光源在指定的 x 和 y 轴旋转的球体上投射光。

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

我假设我们采用 y 轴偏移量(光源与多边形相距多少度,压缩为 0-1 值)和 x 轴偏移量(如前所述),并使用确定亮度的平均值,但在我的脑海中想象这会导致“钻石”形光。或许我的假设是错误的,这才是点亮这个球体的正确理解,但如果不是……

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

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

提前感谢您的帮助

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

【问题讨论】:

    标签: math 3d geometry pseudocode lighting


    【解决方案1】:

    我看到的任何光照公式都在法线表面和光源方向之间使用点积。

    • 如果展位矢量是单位,则点积将为您提供编号<-1,+1>
    • 这也是 cos(a) 值,其中 a 是 N-D 中向量之间的最短角度
    • 3D 示例:
    • 正常:n(nx,ny,nz)
    • 光线方向d(dx,dy,dz)
    • cos(a)=dot(n,d)=(n.d)=(nx*dx+ny*dy+nz*dz)
    • 现在您可以使用cos(a) 直接获取照明信息

    cos(a)表面的照明i

    • 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

    来自a的表面的照明i

    • 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);
    • 还有许多其他方法可以实现这一点...

    你的情况:

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

    【讨论】:

    • 哇!这很棒!我需要一些时间来消化一些数学知识,但我想我应该能够抓住它。谢谢你。我认为你的答案的广度足以证明它是正确的答案。
    • 澄清你提出的一些观点:光被投射到球体上,光的方向总是朝向球体的中心,没有光衰减(只是强度的角度损失),我想这是“全方位”的,就像远处的太阳一样。最亮的点是最“朝向”光的照明“1”,最暗的点实际上是对面。这是否简化了场景?知道这一点,我可以节省一些处理器开销吗?
    • @1owk3y 那是定向光! (远方的太阳就像在单一方向上照亮的无限平面......)。全向光源是灯,或者不太远的太阳。顺便说一句,这种着色技术称为普通着色。如果距离无关紧要,那么你不需要阻尼......这可以加快速度,......还有系数为 a0,a1 的明星(例如 a0=0.2;a1=0.8;模拟环境光)定向光意味着你有恒定的方向向量,不需要为每个像素/顶点计算它,...
    • @1owk3y 顺便说一句,如果你在做我想做的事,那么请看这里stackoverflow.com/a/19659648/2521214 以获取椭球上的正常着色示例 + 用于大气散射的一些 GLSL 魔法。你可能会感兴趣
    猜你喜欢
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多