计算高度场上点的法线

时间:2014-06-25 14:20:34

标签: algorithm geometry

我有一个球形高度场,由一个函数f(x, y, z)定义,它返回从原点经过(x,y,z)的一条线的高度场曲面原点的距离。

(换句话说,我的高度场的等值面是|x,y,z| = f(x,y,z)。)

(另外,为了下面的讨论,我将假设surface(x,y,z)(x,y,z)正下方表面上点的位置。)

渲染时,我需要计算高度场上任意点的法线。这样做最便宜的方法是什么?

要计算矩形高度场上点的法线,通常的技巧是在平行于标称曲面的两个方向上略微偏移(x,y,z),计算高度场上的三个点以形成三角形,然后使用交叉乘积来计算三角形的法线。这很简单,因为这三点可以简单地为surface(x,y,z)surface(x+1,y,z)surface(x,y+1,z)(或类似)。但对于球形高度场来说,它有点棘手,因为法线可以指向任何方向。只需移动xy就行不通,因为如果我的两个点落在半径上,那么它们中的surface()将返回相同的位置,我将不会得到一个三角形

过去我所做的就是将矢量<x,y,z>用作球体原点的半径;然后计算垂直于它的矢量;然后围绕<x,y,z>旋转这个向量,给我三点。但这是繁琐而昂贵的,不应该是必要的。必须有一个更便宜的方式。它是什么?

1 个答案:

答案 0 :(得分:0)

计算surface()点,如果它们足够接近导致问题,则执行更昂贵(但准确)的计算;否则,使用便宜/简单的计算。