我必须计算图像的镜面反射高光(phong)。给出了法向量和“光矢量”。现在我必须计算光反射 - 是否有一个有效的matlab函数可以将光矢量翻转到法线矢量上以获得反射光矢量?
我 spec = k s * I *(r * v) p
其中:
l
是光矢量
n
是表面的法向量
r
是反射向量
v
是从反射点到观察者的矢量
p
是光泽的
答案 0 :(得分:6)
我会用数学方法解决这个问题:
让N
成为法线向量。
设V
为光矢量。
让O
成为反射向量。
O
与N
,V
V
和N
之间角度的余弦值与V
和O
之间角度的余弦值相同(带减号)。O
的长度与V
这产生3个方程:
操纵这些方程后,您将达到3x3方程系统。剩下的就是解决它。
编辑我的同事刚刚告诉我一个更简单的方法:
V
可以分为两部分,V = Vp + Vn
Vp
- 与N
Vn
- 与N
O
具有相同的并行部分Vp
,但完全相反Vn
因此,O = Vp - Vn
,V = Vp + Vn
,然后是O = V - 2 * Vn
其中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