点关于三维向量的对称点 - 入射光的反射向量
注意:尽管限制了直线要过原点,反射向量也是方向向量,但是只要求出来反射向量的方向向量,再加上一个起始点与终点平面即可得到所有反射平面上点所对应在目标平面上的落点,不懂的可以多想几遍
点关于过原点三维直线的对称点
设已知点为 A ( x a , y a , z a ) A(x_{a},y_{a},z_{a}) A(xa,ya,za) ,过原点直线的方向向量为 K ( x 0 , y 0 , z 0 ) K(x_{0},y_{0},z_{0}) K(x0,y0,z0) ,待求对称点为 B ( x b , y b , z b ) B(x_{b},y_{b},z_{b}) B(xb,yb,zb)
{ x b = x a ( x 0 2 − y 0 2 − z 0 2 ) + 2 x 0 ( y 0 y a + z 0 z a ) x 0 2 + y 0 2 + z 0 2 y b = y a ( − x 0 2 + y 0 2 − z 0 2 ) + 2 y 0 ( x 0 x a + z 0 z a ) x 0 2 + y 0 2 + z 0 2 z b = z a ( − x 0 2 − y 0 2 + z 0 2 ) + 2 z 0 ( x 0 x a + y 0 y a ) x 0 2 + y 0 2 + z 0 2 \left\{\begin{matrix} x_{b}=\cfrac{ x_{a} ( x_{0}^2 - y_{0}^2 - z_{0}^2 ) + 2x_{0} ( y_{0} y_{a} + z_{0} z_{a} ) }{x_{0}^2+y_{0}^2+z_{0}^2}\\\\ y_{b}=\cfrac{ y_{a} ( -x_{0}^2 + y_{0}^2 - z_{0}^2 ) + 2y_{0} ( x_{0} x_{a} + z_{0} z_{a} ) }{x_{0}^2+y_{0}^2+z_{0}^2}\\\\ z_{b}=\cfrac{ z_{a} ( -x_{0}^2 - y_{0}^2 + z_{0}^2 ) + 2z_{0} ( x_{0} x_{a} + y_{0} y_{a} ) }{x_{0}^2+y_{0}^2+z_{0}^2} \end{matrix}\right. ⎩ ⎨ ⎧xb=x02+y02+z02xa(x02−y02−z02)+2x0(y0ya+z0za)yb=x02+y02+z02ya(−x02+y02−z02)+2y0(x0xa+z0za)zb=x02+y02+z02za(−x02−y02+z02)+2z0(x0xa+y0ya)
入射光的反射向量的方向向量
已知入射光线方向向量
M
M
M:
M
(
x
m
,
y
m
,
z
m
)
M(x_{m},y_{m},z_{m})
M(xm,ym,zm)
设反方向入射光线
A
A
A
A
(
x
a
,
y
a
,
z
a
)
=
−
M
=
(
−
x
m
,
−
y
m
,
−
z
m
)
A(x_{a},y_{a},z_{a})=-M=(-x_{m},-y_{m},-z_{m})
A(xa,ya,za)=−M=(−xm,−ym,−zm)
已知反射面上的三个点
D
1
,
D
2
,
D
3
D_{1},D_{2},D_{3}
D1,D2,D3:
D
1
(
x
d
1
,
y
d
1
,
z
d
1
)
,
D
2
(
x
d
1
,
y
d
1
,
z
d
1
)
,
D
3
(
x
d
1
,
y
d
1
,
z
d
1
)
D_{1}(x_{d1},y_{d1},z_{d1}), D_{2}(x_{d1},y_{d1},z_{d1}), D_{3}(x_{d1},y_{d1},z_{d1})
D1(xd1,yd1,zd1),D2(xd1,yd1,zd1),D3(xd1,yd1,zd1)
进而得到反射面上两个不平行的两个向
H
,
L
H,L
H,L:
H
(
x
h
,
y
h
,
z
h
)
=
D
1
−
D
2
L
(
x
l
,
y
l
,
z
l
)
=
D
1
−
D
3
H(x_{h},y_{h},z_{h})=D_{1}-D_{2}\\L(x_{l},y_{l},z_{l})=D_{1}-D_{3}
H(xh,yh,zh)=D1−D2L(xl,yl,zl)=D1−D3
使用向量叉乘得到平面法向量
K
K
K
K
(
x
k
,
y
k
,
z
k
)
=
H
×
L
=
(
y
h
z
l
−
z
h
y
l
,
z
h
x
l
−
x
h
z
l
,
x
h
z
l
−
z
h
x
l
)
K(x_{k},y_{k},z_{k})=H×L=(y_{h}z_{l}-z_{h}y_{l},z_{h}x_{l}-x_{h}z_{l},x_{h}z_{l}-z_{h}x_{l})
K(xk,yk,zk)=H×L=(yhzl−zhyl,zhxl−xhzl,xhzl−zhxl)
然后直接使用上方点关于三维直线的对称点公式得到向量A关于K的对称向量B(这里都假设向量起始点为 O ( 0 , 0 , 0 ) O(0,0,0) O(0,0,0)),此向量就是反射光方向向量
思路
说明
点其实也可以看作一种向量,只是起点位于原点而已
点关于三维直线的对称点
A
(
x
a
,
y
a
,
z
a
)
K
(
x
0
,
y
0
,
z
0
)
B
(
x
b
,
y
b
,
z
b
)
A(x_{a},y_{a},z_{a})~~K(x_{0},y_{0},z_{0})~~B(x_{b},y_{b},z_{b})
A(xa,ya,za) K(x0,y0,z0) B(xb,yb,zb)
如图B为A关于K向量的对称点,M为AB中点,因为AB关于K对称,所以AB⊥K(含有一个方程),且向量M与K方向相同,所以M∥K(含有两个方程),一共三个未知数三个方程
{
x
a
+
x
b
x
0
=
y
a
+
y
b
y
0
x
a
+
x
b
x
0
=
z
a
+
z
b
z
0
x
0
(
x
a
−
x
b
)
+
y
0
(
y
a
−
y
b
)
+
z
0
(
z
a
−
z
b
)
=
0
\left\{\begin{matrix} \cfrac{x_{a}+x_{b}}{x_{0}}=\cfrac{y_{a}+y_{b}}{y_{0}}\\\\ \cfrac{x_{a}+x_{b}}{x_{0}}=\cfrac{z_{a}+z_{b}}{z_{0}}\\\\ x_{0}(x_{a}-x_{b})+y_{0}(y_{a}-y_{b})+z_{0}(z_{a}-z_{b})=0 \end{matrix}\right.
⎩
⎨
⎧x0xa+xb=y0ya+ybx0xa+xb=z0za+zbx0(xa−xb)+y0(ya−yb)+z0(za−zb)=0
即可解得
{
x
b
=
x
a
(
x
0
2
−
y
0
2
−
z
0
2
)
+
2
x
0
(
y
0
y
a
+
z
0
z
a
)
x
0
2
+
y
0
2
+
z
0
2
y
b
=
y
a
(
−
x
0
2
+
y
0
2
−
z
0
2
)
+
2
y
0
(
x
0
x
a
+
z
0
z
a
)
x
0
2
+
y
0
2
+
z
0
2
z
b
=
z
a
(
−
x
0
2
−
y
0
2
+
z
0
2
)
+
2
z
0
(
x
0
x
a
+
y
0
y
a
)
x
0
2
+
y
0
2
+
z
0
2
\left\{\begin{matrix} x_{b}=\cfrac{ x_{a} ( x_{0}^2 - y_{0}^2 - z_{0}^2 ) + 2x_{0} ( y_{0} y_{a} + z_{0} z_{a} ) }{x_{0}^2+y_{0}^2+z_{0}^2}\\\\ y_{b}=\cfrac{ y_{a} ( -x_{0}^2 + y_{0}^2 - z_{0}^2 ) + 2y_{0} ( x_{0} x_{a} + z_{0} z_{a} ) }{x_{0}^2+y_{0}^2+z_{0}^2}\\\\ z_{b}=\cfrac{ z_{a} ( -x_{0}^2 - y_{0}^2 + z_{0}^2 ) + 2z_{0} ( x_{0} x_{a} + y_{0} y_{a} ) }{x_{0}^2+y_{0}^2+z_{0}^2} \end{matrix}\right.
⎩
⎨
⎧xb=x02+y02+z02xa(x02−y02−z02)+2x0(y0ya+z0za)yb=x02+y02+z02ya(−x02+y02−z02)+2y0(x0xa+z0za)zb=x02+y02+z02za(−x02−y02+z02)+2z0(x0xa+y0ya)
入射光的反射向量
M
(
x
m
,
y
m
,
z
m
)
M(x_{m},y_{m},z_{m})
M(xm,ym,zm)
A ( x a , y a , z a ) = − M = ( − x m , − y m , − z m ) A(x_{a},y_{a},z_{a})=-M=(-x_{m},-y_{m},-z_{m}) A(xa,ya,za)=−M=(−xm,−ym,−zm)
{ H ( x h , y h , z h ) = D 1 − D 2 L ( x l , y l , z l ) = D 1 − D 3 \left\{\begin{matrix} ~~H(x_{h},y_{h},z_{h})=D_{1}-D_{2}\\\\ L(x_{l},y_{l},z_{l})=D_{1}-D_{3} \end{matrix}\right. ⎩ ⎨ ⎧ H(xh,yh,zh)=D1−D2L(xl,yl,zl)=D1−D3
K ( x k , y k , z k ) = H × L = ( y h z l − z h y l , z h x l − x h z l , x h z l − z h x l ) K(x_{k},y_{k},z_{k})=H×L=(y_{h}z_{l}-z_{h}y_{l},z_{h}x_{l}-x_{h}z_{l},x_{h}z_{l}-z_{h}x_{l}) K(xk,yk,zk)=H×L=(yhzl−zhyl,zhxl−xhzl,xhzl−zhxl)
得到K和A之后可以直接得到反射向量的方向向量B
建议分步带入,先算K和A再带入上边,不然公式太长了
获取对称向量的matlab代码
function out = get_symmetry(a,k)
%get_symmetry 获取向量a关于向量k的对称向量
sum = k(1)^2+k(2)^2+k(3)^2;
x = (a(1)*(k(1)^2-k(2)^2-k(3)^2) + 2*k(1)*(k(2)*a(2)+k(3)*a(3)))/sum;
y = (a(2)*(-k(1)^2+k(2)^2-k(3)^2) + 2*k(2)*(k(1)*a(1)+k(3)*a(3)))/sum;
z = (a(3)*(-k(1)^2-k(2)^2+k(3)^2) + 2*k(3)*(k(1)*a(1)+k(2)*a(2)))/sum;
out = [x,y,z];
end