平面/射线交点与点/平面投影的差异

Posted

技术标签:

【中文标题】平面/射线交点与点/平面投影的差异【英文标题】:Difference of plane/ray intersection with point/plane projection 【发布时间】:2018-11-07 15:33:18 【问题描述】:

我在 Wikipedia 中找到了射线平面相交代码的解决方案,该解决方案有效,并且我只需求解线性方程组。

后来我发现了一些点到平面投影的代码,显然它的实现方式不同,并且在某些条件下也会产生不同的解决方案。

但是,我并没有真正了解点沿向量的投影与射线的交点(由点和向量构建)之间的区别。在这两种情况下,我都希望找到射线与平面相交的点?!

有什么图可以说明区别吗?

struct Plane 
  glm::vec3 _normal;
  glm::vec3 _point;
;

glm::vec3 intersection(const Plane &p, const glm::vec3 &point, const glm::vec3 &direction) 
  // See: https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection
  const float t = glm::dot(p._normal, point - p._point) / glm::dot(p._normal, -direction);
  return point + t * direction;


glm::vec3 orthogonalProjection(const Plane &p, const glm::vec3 &point, const glm::vec3 &direction) 
  // from https://***.com/questions/9605556/how-to-project-a-point-onto-a-plane-in-3d
  const float t = -(glm::dot(point, direction) - glm::dot(p.getOrigin(), p.getNormal()));
  return point+ t * direction;

【问题讨论】:

【参考方案1】:

射线是一条无限长的线,所以它有一个方向。将射线与平面相交意味着找到线穿过平面的位置。

点是悬浮在空间某处的无量纲点。将一个点投影到一个平面上意味着射出一条穿过该点并垂直于平面(称为“法线”)的射线,然后查看它的落点。

射线已经有方向,点没有。选择投影点的方向是垂直于平面的方向,因为这就是定义投影的方式。

所以你可以有一个特殊情况,光线的方向和平面的法线重合,在这种情况下,将光线与平面相交并投影一个恰好位于光线上某处的点会导致相同的结果,但这只是特殊情况。

【讨论】:

"选择投影点的方向是垂直于平面的方向,因为这是定义投影的方式。"这不是飞机法线的方向吗?如果插入点和平面法线,则这将等于一个交点。 @dgrat 是的,相当于用一条垂直于平面并通过该点的射线与平面相交。这就是我最后描述的特殊情况。【参考方案2】:

对于那些感兴趣的人,这里是上面交集函数的 c# 版本。

感谢@dgrat,你让我开心。

    /// <summary>Calculates the intersection of a ray with a plane</summary>
    /// <param name="rayOrigin">Any point of the ray</param>
    /// <param name="rayDirection">The direction of the ray</param>
    /// <param name="planeOrigin">Any point of the plane</param>
    /// <param name="planeNormal">The normal of the plane</param>
    /// <returns>The intersection</returns>
    private Point3D Intersection(Point3D rayOrigin, Vector3D rayDirection, Point3D planeOrigin, Vector3D planeNormal)
    
        var length = Vector3D.DotProduct(planeNormal, rayOrigin - planeOrigin) / Vector3D.DotProduct(planeNormal, -rayDirection);
        return rayOrigin + length * rayDirection;
    

【讨论】:

以上是关于平面/射线交点与点/平面投影的差异的主要内容,如果未能解决你的问题,请参考以下文章

平面分割

射线平面相交怎么做?

hdu 2050.折线分割平面

射线平面的表示方式

3.2 多边形的交点 [点/多边形 内/外 测试]

Planar Shadow