C++ 如何在透视投影中检查点是否位于四边形内?

C++ 如何在透视投影中检查点是否位于四边形内?,c++,opengl,transformation,C++,Opengl,Transformation,我想测试世界上是否有任何给定点位于四边形/平面上?四边形/平面可以通过任何值进行平移/旋转/缩放,但仍应能够检测给定点是否在其上。如果四边形没有应用任何旋转/缩放/平移,我还需要获取点应该位于的位置 例如,考虑一个尺寸为100x100的0, 0, 0的四边形,以Z轴为45度的角度旋转。如果我的鼠标在世界上的位置是(x,y,0,),我需要知道在当前变换中该点是否落在该四边形上?如果是,那么我需要知道是否没有对四边形应用任何变换,该点在它上面的什么位置?任何代码示例都会有很大帮助光线投射方法可能是最

我想测试世界上是否有任何给定点位于四边形/平面上?四边形/平面可以通过任何值进行平移/旋转/缩放,但仍应能够检测给定点是否在其上。如果四边形没有应用任何旋转/缩放/平移,我还需要获取点应该位于的位置


例如,考虑一个尺寸为100x100的0, 0, 0的四边形,以Z轴为45度的角度旋转。如果我的鼠标在世界上的位置是(x,y,0,),我需要知道在当前变换中该点是否落在该四边形上?如果是,那么我需要知道是否没有对四边形应用任何变换,该点在它上面的什么位置?任何代码示例都会有很大帮助

光线投射方法可能是最简单的:

  • 使用
    glunproject()
    获取要投射到场景中的光线的世界空间方向。光线的原点是摄影机位置
  • 通过矩形变换的逆变换将该光线放入对象空间。请注意,需要变换光线的原点和方向向量
  • 使用标准光线平面交点测试计算此光线与XY平面之间的交点
  • 检查交点的x和y值是否在矩形的边界内,如果在边界内,则这是所需的结果

  • 如果您对此处涉及的某些数学不太自信,那么像这样的数学库将非常有用,它具有相应的函数,如
    glm::unject()
    ,以及用于反转矩阵和执行所需的所有其他变换的函数。

    我认为这是一个XY问题。我的意思是,你当然可以对你的点进行逆变换,然后使用常规的平面计算,但是如果你正在执行类似于拾取的操作(看起来很像),说明它,然后答案就可以调整了。现在它有点太宽了,“考虑一个尺寸为100x100的0,0,0的四芯体”。这是不明确的。你真的是指四边形,还是指矩形(完全指定为宽度x高度)?这对答案有很大影响。@MSalters是这样做的吗?任意四边形的计算只需要前面提到的细分(无论如何都应该在渲染时进行细分)。@BartekBanachewicz:是的,例如矩形总是凸的。任意四边形并不是我在真实渲染中所指的“M交错”。