2

我必须计算图像的镜面高光(phong)。给出了法线向量和“光向量”。现在我必须计算光反射 - 是否有一个有效的 matlab 函数可以将光矢量翻转到法线矢量上以获得反射光矢量?

I规格= k s * I * (r * v) p

其中: l是光向量
n是表面的法线向量
r是反射向量
v是从反射点到观察者的向量
p是光泽度

4

1 回答 1

6

我会用数学方法解决这个问题:

N为法线向量。设V为光向量。设O为反射向量。

  1. O与 位于同一平面NV
  2. 和之间的角度的余弦与V和之间的N角度的余弦相同(带减号)。VO
  3. O具有相同的长度V

这产生了 3 个方程:

  1. 点(O,交叉(N,V))= 0
  2. 点(N,V)/范数(N)/范数(V)=-点(N,O)/范数(N)/范数(O)
  3. 范数(O) = 范数(V)

处理完这些方程后,您将获得一个 3x3 方程系统。剩下的就是解决它。


编辑我的同事刚刚告诉我一个更简单的方法:

V可以分成2部分,V = Vp + Vn

  1. Vp- 平行N
  2. Vn- 有直角N

O有相同的平行部分Vp,但正好相反Vn

因此, O = Vp - Vn, 但是V = Vp + Vn然后O = V - 2 * Vn Where Vn = dot(V,N) * N(假设N范数为 1)

所以最后的答案是:

 function O = FindReflected(V,N)
     N = N / norm(N);
     O = V - 2 * dot(V,N) * N;
 end

编辑 2 我刚刚找到了一个更好的解释Math.stackexchangehttps ://math.stackexchange.com/questions/13261/how-to-get-a-reflection-vector

于 2012-06-13T12:04:32.280 回答