NaN*_*NaN 2 performance matlab vector specular phong
我必须计算图像的镜面反射高光(phong).给出了法向量和"光矢量".现在我必须计算光反射 - 是否有一个有效的matlab函数来翻转法向量上的光矢量以获得反射光矢量?
我spec = k s*I*(r*v)p
其中:
l光矢量
n是表面的法向量,
r反射矢量
v是从反射点到观察者的矢量
p是光泽度
我会用数学方法解决这个问题:
我们N是正常的载体.让我们V成为光矢量.我们O是反射载体.
O是在同一平面内N,VV和之间的角度N的余弦V与O(和带负号)之间的角度的余弦相同.O 具有相同的长度 V这产生3个方程式:
操作这些方程后,您将达到3x3方程系统.剩下的就是解决它.
编辑我的同事告诉我一个更简单的方法:
V 可分为两部分, V = Vp + Vn
Vp - 平行 NVn - 与...有直角 NO具有相同的平行部分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
Run Code Online (Sandbox Code Playgroud)
编辑2
我刚刚找到了一个更好的解释Math.stackexchange:https:
//math.stackexchange.com/questions/13261/how-to-get-a-reflection-vector