Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 平面/光线交点与点/平面投影的差异_C++_Graphics_3d - Fatal编程技术网

C++ 平面/光线交点与点/平面投影的差异

C++ 平面/光线交点与点/平面投影的差异,c++,graphics,3d,C++,Graphics,3d,我在Wikipedia中找到了一个射线平面相交代码的解决方案,在那里我只需要解一个线性方程组 后来我找到了一些关于点到平面投影的代码,这显然是不同的实现方式,在某些条件下也会产生不同的解决方案 但是,我并没有真正了解点沿向量的投影和光线的交点(由点和向量构建)之间的区别。在这两种情况下,我都希望找到光线与平面相交的点 有没有一个数字来说明这一区别 struct Plane { glm::vec3 _normal; glm::vec3 _point; }; glm::vec3 inter

我在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://stackoverflow.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;
}

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

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


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


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

对于感兴趣的人,这是上面交集函数的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;
    }
///计算光线与平面的交点
///光线的任何一点
///光线的方向
///平面的任意点
///平面的法线
///十字路口
专用点3D交点(点3D光线原点、矢量3D光线方向、点3D平面原点、矢量3D平面法线)
{
变量长度=Vector3D.DotProduct(planeNormal,光线原点-平面原点)/Vector3D.DotProduct(planeNormal,-光线方向);
返回光线原点+长度*光线方向;
}

“选择投影点的方向是垂直于平面的方向,因为投影就是这样定义的。”这不是平面法线的方向吗?如果插入点和平面法线,则这将等于相交。@dgrat yes这相当于将平面与垂直于该平面并通过该点的光线相交。这就是我在最后描述的特殊情况。