Performance Matlab计算矢量的反射

Performance Matlab计算矢量的反射,performance,matlab,vector,specular,phong,Performance,Matlab,Vector,Specular,Phong,我必须计算图像的镜面反射高光(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,交叉点

我必须计算图像的镜面反射高光(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)/norm(N)/norm(V)=-点(N,O)/norm(N)/norm(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 我刚刚找到了一个关于
    数学的更好的解释。stackexchange

    这与使用
    a(end:-1:1)
    是不同的反射吗?请澄清:您的问题是否与计算物体在没有重力的平面上的滞弹性反弹相同?反射面是如何表示的?我有θ(n和l之间的cos角,n和O(r)-我有角度,法向量和光向量,不是有更简单的方法吗?