如何确定4x4 S 矩阵,以便P在X(Y = 0)平面上投影到Q?
Q = S P
答案 0 :(得分:0)
我将给出从点 C 到平面 E 的中心投影的一般解决方案(假定 L 不包含在< strong> E )。
为方便起见,我将使用Octave / MATLAB表示法。
让 L 以齐次坐标给出
L=[lx ly lz 1]'
和 E 以Hessian范式(也是齐次坐标)给出
E=[nx, ny, ,nz, d]'
其中[nx,ny,nz]是平面的法线,而d是其到原点的有符号距离。
然后是矩阵 S ,该矩阵通过投影中心将任意点 P (也在同构坐标中)投影到平面 E > L 是
S=eye(4)*(L'*E)-L*E'
中心投影是
Q=S*P
作为Octave / MATLAB函数
% A matrix S describing central projection to a plane E
% L a point in homogeneous coordinates of projective 3-space
% E a plane in homogeneous coordinates of projective 3-space
% Requirement: scalar product of L and E is non-zero (i.e. L is not contained in E)
function S = central_projection_to_plane(L, E)
S = [
+ L(2)*E(2) + L(3)*E(3) + L(4)*E(4), - L(1)*E(2) , - L(1)*E(3) , - L(1)*E(4) ;
- L(2)*E(1) , + L(1)*E(1) + L(3)*E(3) + L(4)*E(4) , - L(2)*E(3) , - L(2)*E(4) ;
- L(3)*E(1) , - L(3)*E(2) , + L(1)*E(1) + L(4)*E(4) + L(2)*E(2) , - L(3)*E(4) ;
- L(4)*E(1) , - L(4)*E(2) , - L(4)*E(3) , + L(1)*E(1) + L(2)*E(2) + L(3)*E(3)
];
end % function
P.S。:要得出这一点,请注意,通过 L 和 P 的行可以写为4x4普吕克矩阵
Rx=L*P'-P*L'.
Rx线和平面 E 的交点很简单
Q=Rx*E
=(L*P'-P*L')*E
=(eye(4)*(L'*E)-L*E')*P
=S*P
答案 1 :(得分:0)
射线的坐标为 r ( t )= L + t *( P < / strong>- L )。这是组件形式:
r_x = L_x + t*(P_x-L_x)
r_y = L_y + t*(P_y-L_y)
r_z = L_z + t*(P_z-L_z)
现在,您需要找到 Q = r (t),使得r_y = 0
。当t = -L_y/(P_y-L_y)
或
Q_x = L_x - L_y/(P_y-L_y)*(P_x-L_x)
Q_y = 0
Q_z = L_z - L_y/(P_y-L_y)*(P_z-L_z)
通常,投影平面由单位法向矢量 n = (n_x,n_y,n_z)
和平面到原点 d 的距离定义。如果 r ( t )· n ,则点 r ( t )位于平面上。 strong> = d 其中·是矢量点积。
一般来说, Q 点的解决方案是
t =( d - n · L )/( n ·( P - L ))
Q = L + t *( P - L )< / p>
在伪 C 样式代码中,上面是:
// L : Light Source
// P : Point to be projected
// n : Plane _unit_ normal vector
// d : Distance of plane to the origin
// returns: The point Q along the ray that intersects the plane.
Vector3 HitPlaneWithRay(Vector3 L, Vector3 P, Vector3 n, double d)
{
double t = (d-Dot(L,n))/Dot(P-L,n);
return L + t*(P-L);
}
// Intersect ray with floor (Normal=[0,1,0], Distance=0)
Vector3 HitFloorWithRay(Vector3 L, Vector3 P)
{
return HitPlaneWithRay(L, P, Vector3.J, 0);
}