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

4

在此输入图片描述

如何确定4x4的S矩阵,使得P在XZ平面(Y=0)上被投影到Q上?

Q = S P


这是一个欠定问题:你可以想象相机围绕从P到Q的光线旋转。你需要添加约束条件。 - Ben
2个回答

1
我将提供从点 L 到平面 E 的中心投影的一般解(假设 L 不包含在 E 中)。
我将使用 Octave/MATLAB 符号表示以方便阅读。
给定点 L 的齐次坐标为:
L=[lx ly lz 1]'

如果给定 Hessian 正规形式(也称为齐次坐标系),则 E 为:

E=[nx, ny, ,nz, d]'

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

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

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

附言: 为了得出这个结果,注意到通过LP的直线可以写成一个4x4的Plücker矩阵。

Rx=L*P'-P*L'.

线Rx与平面E的交点很简单。
Q=Rx*E
 =(L*P'-P*L')*E
 =(eye(4)*(L'*E)-L*E')*P
 =S*P

另请参阅:https://en.wikipedia.org/wiki/Plücker_matrix


1
射线的坐标为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_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(tn=d,则点 r(t) 在平面上,其中 · 是向量点积。

一般情况下,点 Q 的解为:

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

Q = L + t *( P-L )

伪代码如下:

// 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);
}

虽然这是正确的,但问题是如何找到一个执行此投影的4x4矩阵。 - André Aichert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接