Matlab计算Vector的反射

NaN*_*NaN 2 performance matlab vector specular phong

我必须计算图像的镜面反射高光(phong).给出了法向量和"光矢量".现在我必须计算光反射 - 是否有一个有效的matlab函数来翻转法向量上的光矢量以获得反射光矢量?

spec = k s*I*(r*v)p

其中: l光矢量
n是表面的法向量,
r反射矢量
v是从反射点到观察者的矢量
p是光泽度

And*_*ein 6

我会用数学方法解决这个问题:

我们N是正常的载体.让我们V成为光矢量.我们O是反射载体.

  1. O是在同一平面内N,V
  2. V和之间的角度N的余弦VO(和带负号)之间的角度的余弦相同.
  3. O 具有相同的长度 V

这产生3个方程式:

  1. 点(O,交叉(N,V))= 0
  2. dot(N,V)/ norm(N)/ norm(V)= - dot(N,O)/ norm(N)/ norm(O)
  3. 标准(O)=标准(V)

操作这些方程后,您将达到3x3方程系统.剩下的就是解决它.


编辑我的同事告诉我一个更简单的方法:

V 可分为两部分, V = Vp + Vn

  1. Vp - 平行 N
  2. 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
Run Code Online (Sandbox Code Playgroud)

编辑2 我刚刚找到了一个更好的解释Math.stackexchange:https: //math.stackexchange.com/questions/13261/how-to-get-a-reflection-vector