我必须计算图像的镜面高光(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,VV和之间的N角度的余弦相同(带减号)。VOO具有相同的长度V这产生了 3 个方程:
处理完这些方程后,您将获得一个 3x3 方程系统。剩下的就是解决它。
编辑我的同事刚刚告诉我一个更简单的方法:
V可以分成2部分,V = Vp + Vn
Vp- 平行NVn- 有直角NO有相同的平行部分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