Matlab计算向量的反射

Posted

技术标签:

【中文标题】Matlab计算向量的反射【英文标题】:Matlab calculate reflection of Vector 【发布时间】:2012-06-13 11:42:44 【问题描述】:

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

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

在哪里: l 是光矢量n 是表面的法线矢量r 是反射矢量v 是从反射点到观察者的矢量p 是光泽度

【问题讨论】:

与使用a(end:-1:1)的反射不同吗? 要明确一点:您的问题是否与计算物体在没有重力的平面上的非弹性反弹相同?反射面是如何表示的? 【参考方案1】:

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

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

    ON,V 在同一平面 VN 之间夹角的余弦与VO 之间夹角的余弦相同(带减号)。 OV 的长度相同

这会产生 3 个方程:

    dot(O, cross(N,V)) = 0 dot(N,V)/ norm(N) / norm(V) = - dot(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 我刚刚在Math.stackexchange 上找到了更好的解释: https://math.stackexchange.com/questions/13261/how-to-get-a-reflection-vector

【讨论】:

我有theta(n和l和n和O(r)之间的cos角-我有角度,法线向量和光向量,难道没有更简单的方法吗?跨度>

以上是关于Matlab计算向量的反射的主要内容,如果未能解决你的问题,请参考以下文章

UnityShader镜面反射计算与反射光向量推导

osg学习(七十二)SPHERE_MAP REFLECTION_MAP NORMAL_MAP

Unity Shaders学习笔记之为创建自定义慢反射光照模型

什么是(diffuse)漫反射?镜面反射?环境光?法向量?

用定向光源计算反射矢量

Phong光照模型的Shader实现