【问题标题】:How to check if a point is inside a quad in perspective projection?如何检查一个点是否在透视投影中的四边形内?
【发布时间】:2013-07-25 12:41:16
【问题描述】:

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

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

【问题讨论】:

  • 我认为这是一个 XY 问题。我的意思是,您当然可以 inverse 转换您的观点,然后使用常规的平面计算,但是如果您正在实现诸如拾取之类的东西(看起来很像),请说明它并且答案将能够为此进行调整。现在它有点太宽泛了。
  • "考虑一个大小为 100x100 的 0,0,0 的四边形"。这是未指定的。您真的是指四边形,还是指矩形(完全指定为宽度 x 高度)?这对答案有很大影响。
  • @MSalters 是吗?任意四边形的计算只需要前面提到的镶嵌(无论如何都应该用于渲染)。
  • @BartekBanachewicz:是的,例如一个矩形总是凸的。任意四边形不是。
  • @MSalters 我指的是真实渲染。

标签: c++ opengl transformation


【解决方案1】:

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

  1. 使用gluUnProject() 获取投射到场景中的光线的世界空间方向。射线的原点是相机位置。
  2. 通过与矩形变换相反的变换将这条射线放入对象空间。请注意,您需要同时变换光线的原点和方向矢量。
  3. 使用标准的射线与平面相交测试计算此射线与 XY 平面之间的交点。
  4. 检查交点的 x 和 y 值是否在您的矩形范围内,如果是,那么这就是您想要的结果。

如果您对这里涉及的一些数学运算没有信心,诸如 GLM 之类的数学库将非常有用,它具有相应的函数(例如 glm::unProject())以及反转矩阵和执行所有其他操作的函数您需要的转换。

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    相关资源
    最近更新 更多