Matlab计算Vector的反射

时间:2012-06-13 11:42:45

标签: performance matlab vector specular phong

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

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

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

1 个答案:

答案 0 :(得分:6)

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

N成为法线向量。 设V为光矢量。 让O成为反射向量。

  1. ONV
  2. 位于同一平面
  3. VN之间角度的余弦值与VO之间角度的余弦值相同(带减号)。
  4. O的长度与V
  5. 的长度相同

    这产生3个方程:

    1. 点(O,交叉(N,V))= 0
    2. dot(N,V)/ norm(N)/ norm(V)= - dot(N,O)/ norm(N)/ norm(O)
    3. norm(O)= norm(V)
    4. 操纵这些方程后,您将达到3x3方程系统。剩下的就是解决它。


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

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

      1. Vp - 与N
      2. 并行
      3. Vn - 与N
      4. 有直角

        O具有相同的并行部分Vp,但完全相反Vn

        因此,O = Vp - VnV = 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