Matrix 在平面上投影点的投影矩阵

Matrix 在平面上投影点的投影矩阵,matrix,projection,projection-matrix,Matrix,Projection,Projection Matrix,如何确定4x4S矩阵,使p在XZ(Y=0)平面上投影到Q中 Q=Sp我将给出从点L到平面E的中心投影的一般解(假设L不包含在E中) 为了方便起见,我将使用倍频程/MATLAB表示法 设L在齐次坐标中给出 L=[lx ly lz 1]' E=[nx, ny, ,nz, d]' 和E以Hessian标准形式给出(也是齐次坐标) 其中[nx,ny,nz]是平面的法线,d是其到原点的有符号距离 然后,通过投影中心L将任何点p(也在齐次坐标中)投影到平面E的矩阵S为 S=eye(4)*(L'*E)-L

如何确定4x4S矩阵,使p在XZ(Y=0)平面上投影到Q中


Q=Sp

我将给出从点L到平面E的中心投影的一般解(假设L不包含在E中)

为了方便起见,我将使用倍频程/MATLAB表示法

L在齐次坐标中给出

L=[lx ly lz 1]'
E=[nx, ny, ,nz, d]'
E以Hessian标准形式给出(也是齐次坐标)

其中[nx,ny,nz]是平面的法线,d是其到原点的有符号距离

然后,通过投影中心L将任何点p(也在齐次坐标中)投影到平面E的矩阵S

S=eye(4)*(L'*E)-L*E'
中央投影是

Q=S*P
作为一个倍频程/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.:要推导此公式,请注意通过Lp的线可以写成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

另请参见:

射线具有坐标r(t)=L+t*(p-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\u y=0
。当
t=-L\u y/(P\u y-L\u 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)
和平面到原点的距离定义。如果r(t)·n=d,则点r(t)位于平面上,其中·是矢量点积

Q的解决方案通常为

t=(d-n·L)/(n·(p-L

Q=L+t*(p-L

在伪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);
}

这是一个未确定的问题:您可以将相机围绕光线从P旋转到Q。您需要添加约束。虽然这是正确的,但问题是如何找到执行此投影的4x4矩阵。