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
为反射向量。
O
与 N
,V
在同一平面
V
和N
之间夹角的余弦与V
和O
之间夹角的余弦相同(带减号)。
O
与 V
的长度相同
这会产生 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计算向量的反射的主要内容,如果未能解决你的问题,请参考以下文章
osg学习(七十二)SPHERE_MAP REFLECTION_MAP NORMAL_MAP