我必须计算图像的镜面高光(phong)。给出了法线向量和“光向量”。现在我必须计算光反射 - 是否有一个有效的 matlab 函数可以将光矢量翻转到法线矢量上以获得反射光矢量?
I规格= k s * I * (r * v) p
其中:
l
是光向量
n
是表面的法线向量
r
是反射向量
v
是从反射点到观察者的向量
p
是光泽度
我必须计算图像的镜面高光(phong)。给出了法线向量和“光向量”。现在我必须计算光反射 - 是否有一个有效的 matlab 函数可以将光矢量翻转到法线矢量上以获得反射光矢量?
I规格= k s * I * (r * v) p
其中:
l
是光向量
n
是表面的法线向量
r
是反射向量
v
是从反射点到观察者的向量
p
是光泽度
我会用数学方法解决这个问题:
设N
为法线向量。设V
为光向量。设O
为反射向量。
O
与 位于同一平面N
,V
V
和之间的N
角度的余弦相同(带减号)。V
O
O
具有相同的长度V
这产生了 3 个方程:
处理完这些方程后,您将获得一个 3x3 方程系统。剩下的就是解决它。
编辑我的同事刚刚告诉我一个更简单的方法:
V
可以分成2部分,V = Vp + Vn
Vp
- 平行N
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.stackexchange
:
https ://math.stackexchange.com/questions/13261/how-to-get-a-reflection-vector