我正在尝试将高度图应用于光线跟踪的球体。高度图存储为纹理。我在球体$ p $上有交点,并计算了该点的法线向量$ N = normalize(p-c)$,其中$ c $是球体的中心。

然后我将标准化的$ N $的分量与sqrt和几个atan2一起使用,以获取纹理坐标$ u $和$ v $(分别对应于球的经度和纬度。)

不幸的是,我还不太清楚如何从高度图上获得扰动的法线。这是到目前为止我得到的:

$ p ^ {'} = p + h(u,v)N $是高度图$ h $在归一化法线方向上所扰动的球体因此,根据定义,$ N $。

受扰动的法线是$ N ^ {'} = p ^ {'} _ u \ times p ^ {'} _ v $。

我的第一个问题是,我怎么知道法线指向球外? (要正确地照亮球体,我确实需要指向外部的法线。)

我知道,最糟糕的是,我可以运行着色器并在看起来不对的情况下更改符号,但是我会我想从最初的原则中了解我应该如何订购叉积。我四处张望,找不到关于这一点的任何讨论。标量半径。将其代入扰动的高度图方程,我们得到

$ p ^ {'} = c + N(r + h)$,这很有意义:半径被高度扰动了。

区别在于,我们得到

$ p ^ {'} _ u = N_u(r + h)+ h_uN $和$ p ^ {'} _ v = N_v(r + h)+ h_vN $。

直接计算叉积,我们得到

$ N ^ {'} =(N_u(r + h)+ h_uN)\ times(N_v(r + h) + h_vN)$

$ N ^ {'} =(r + h)^ 2(N_u \ times N_v)+(r + h)(h_u(N \ times N_v)+ h_v(N_u \ times N))$

$ N ^ {'} =(r + h)(N_u \ times N_v)+ h_u(N \ times N_v)+ h_v(N_u \ times N)$

$ N ^ {'} =(r + h)N + h_u(N \ times N_v)+ h_v(N_u \ times N)$

(因为$ N \ times N = 0 $,所以公因子$(r + h)$将从标准化向量中消失,而$ N = N_u \ times N_v $。)

下一个我的问题是球的经度是不连续的(当您穿过子午线时,$ u $从1跳到0);

最后的问题是,我没有看到如何计算$ N(u,v)$。我只是在这里空白。 ($ h_u $和$ h_v $很容易计算;它们只是纹理的派生。)


男孩我觉得很蠢。我只是使用球面到笛卡尔坐标来获得球面上的点,作为$ u $和$ v $的函数。这就是函数$ N(u,v)$。 D'oh。

我还有第一个问题要解决,在计算$ N $的导数后,我会发现奇点是否有任何问题(我怀疑不会有问题。 )

评论

如果找到了解决方案,请继续回答您的问题。 :)

您在Web上有足够的资源来学习3D渲染的基本几何形状和基本原理,例如scratchapixel.com/lessons/…和scratchapixel.com/lessons/3d-basic-rendering/…,以了解交叉乘积和明暗处理。如果您甚至不了解什么是叉积,将很难获得像凹凸贴图一样先进的功能。首先学习基础知识,然后逐步学习。人们不是来这里教书的。

@ user18490尽管我们希望人们首先尝试自己解决问题,但是这个问题显示了努力并描述了到目前为止的计算和学习,我认为这没有问题。我喜欢您与相关资源的链接,但是我非常不同意“人们不在这里教书”。这里有很多人花费大量时间在许多答案中写出非常有帮助的解释。

@trichoplax。我理解您的观点,但要以建设性的方式证明我的观点。诸如堆栈溢出之类的站点实质上是人们问问题和回答这些问题的地方。虽然您总是可以说任何问题都是有效的问题,但可以回答诸如“我们如何渲染3D模型的图像”之类的问题,或者回答诸如“如何在我不做球体的情况下进行凹凸贴图”的问题。甚至知道交叉产品是什么”仅适用于愿意在这些论坛上提供帮助的人们,这些问题无疑太大了,除非您写书,否则无法回答。那是教学。

我试图从第一原理中得出如何对光线跟踪的球进行凹凸贴图,并提出了我认为是一个合理的问题(确切地说,您如何知道uxv或vxu的哪个阶将使您远离球心指向法线。 )我不认为我的问题是基本几何中的问题...