我必须计算图像的镜面高光 (phong)。给出了法向量和“光向量”。现在我必须计算光反射 - 是否有一个有效的 matlab 函数可以将光矢量翻转到法向量上以获得反射光矢量?
Ispec = ks * I * (r * v)p
地点:
l
是光向量
n
是曲面的法向量
r
是反射向量
v
是反射点到观察者的向量
p
是光泽度
最佳答案
我会用数学方法解决这个问题:
让N
是法向量。
让V
是光矢量。
让O
是反射向量。
-
O
与N
在同一平面,V
V
之间夹角的余弦值和N
与V
之间夹角的余弦值相同和O
(带减号)。-
O
与V
的长度相同
这会产生 3 个等式:
- 点(O,交叉(N,V))= 0
- 点(N,V)/范数(N)/范数(V) = - 点(N,O)/范数(N)/范数(O)
- 标准(O)=标准(V)
处理完这些方程后,您将得到一个 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
关于performance - Matlab计算Vector的反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11014127/