三维空间中计算直线与面的交点

题:已知经过点P,方向向量为D的直线,以及经过点P1,法线方向向量为D1的平面,求两者之间的交点?

思路:先求出直线上所有点的集合Line,然后求出平面上所有点的集合Plane,求两个集合的交集即可。

步骤:
(1)直线所有点的集合,L为三维向量,m为实数
\rm{集合Line=\{ L|L=P+m*D,D不为0向量 }\}
(2)平面所有点的集合,C为三维向量
\rm{集合Plane=\{ C | (C-P1)*D1 = 0,D1不为0向量 } \}
(3)集合Line与集合Plane交集,S为三维向量
\rm{集合IN=\{ S | S\in集合Line,S \in 集合Plnae} \}
(4)S方程组表达式
S_{(x,y,z)}=\begin{cases} x=P_x+m*D_x\\ y=P_y+m*D_y\\ z=P_z+m*D_z\\ (x-P1_x)*D1_x+(y-P1_y)*D1_y+(z-P1_z)*D1_z=0 \end{cases}

Unity代码:

/// <summary>
        /// 求直线与平面的交点
        /// </summary>
        /// <param name="P">直线上的一点</param>
        /// <param name="D">直线方向</param>
        /// <param name="P1">平面上一点</param>
        /// <param name="D1">平面上方向</param>
        /// <returns></returns>
        Vector3 GetIN(Vector3 P, Vector3 D, Vector3 P1,Vector3 D1)
        {

            if (D.x*D1.x+ D.y * D1.y + D.z * D1.z == 0)
            {
                //方向向量与平面平行,没有交点
                return Vector3.zero;
            }
            float m = ((P1.x - P.x) * D1.x +
                       (P1.y - P.y) * D1.y +
                       (P1.z - P.z) * D1.z) /
                      (D1.x * D.x + D1.y * D.y + D1.z * D.z);
            return new Vector3(P.x + D.x * m, P.y + D.y * m, P.z + D.z * m);
        }
  

应用场景:

鼠标控制物体移动.gif

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。