performance - Matlab计算Vector的反射

标签 performance matlab vector specular phong

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

Ispec = ks * I * (r * v)p

地点: l 是光向量
n 是曲面的法向量
r 是反射向量
v 是反射点到观察者的向量
p 是光泽度

最佳答案

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

N是法向量。 让V是光矢量。 让O是反射向量。

  1. ON在同一平面, V
  2. V 之间夹角的余弦值和 NV之间夹角的余弦值相同和 O (带减号)。
  3. OV 的长度相同

这会产生 3 个等式:

  1. 点(O,交叉(N,V))= 0
  2. 点(N,V)/范数(N)/范数(V) = - 点(N,O)/范数(N)/范数(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

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

关于performance - Matlab计算Vector的反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11014127/

相关文章:

c++ - 当我尝试打印 vector 的内容时编译器出错?

java - 序列化 vector

performance - 是由精确地址流还是由高速缓存行流触发预取?

c++ - OpenCVs LineIterator 在 MATLAB 中的等价物

matlab - 根据一列对矩阵行进行分组

python - python中Matlab的ranksum相当于什么?

c++ - 在统一内存 CUDA C/C++ 中分配一个二维 vector

Javascript 一次打印一个输出而不是一次打印整个页面?

android - 检查应用程序的性能?

javascript - 如何优化 HTML5 + processing.js 应用程序?