鼠标坐标到3D世界/投影以进行点碰撞

时间:2015-08-22 16:43:17

标签: c++ opengl matrix

我通过互联网阅读,将鼠标坐标(或触摸点)转换为3D世界并进行“挑选3d元素”的正确方法是:

  1. 乘以模型,视图和投影
  2. 计算逆矩阵
  3. 将鼠标坐标存储在具有[-1,+ 1]范围的Vector中
  4. 将鼠标的向量与矩阵相乘
  5. 检查坐标是否为碰撞检查(在我的情况下,我检查x和y是否在[-1,+ 1]之间)
  6. 当我进行平移,缩放甚至Z旋转时效果很好,但在我的测试中,它在X和Y旋转时失败(可能在其他3D失真上)。我尝试了不同的Inverse和Multiply算法,但都给了我相同的结果。我做错了什么?

    有关我的代码中发生的事情的更详细说明,我将尝试在此解释5个步骤中发生了什么:
    最初我有[-1,+ 1]鼠标坐标,当我进行缩放时,我发现标准化的鼠标坐标应该除以缩放值。例如,如果鼠标开启(-0.8,0.3)且矩阵的缩放比例为0.5,0.5,0.5,则鼠标矢量的结果应为(-1.6,0.6)且没有碰撞点。有了这个,我有了使用逆矩阵的想法。之后我尝试了X和Y的旋转,从2D的角度来看,它与缩放相同:在X和Y上给出PI / 2,模型看起来像是0.5的缩放。但是,将倒置矩阵与向量相乘会得到(-0.4,0.15)结果,每次使用X / Y旋转时都会给出误报。

    如果您想更深入地了解我的问题,可以download and try my code免费使用。为了简化读数,它被剥离到最小。

1 个答案:

答案 0 :(得分:0)

我看了一下你的代码,我真的不确定你讨论的这个扩展来自哪里?我所看到的只是一次旋转,仅此而已。

但是,为了从窗口空间正确转换回NDC空间,您需要考虑透视除(w,基本上是-z_eye)。围绕z轴的旋转永远不会改变z坐标;另外两个轴将导致透视投影中的比例变化。

但最重要的是,窗口空间w实际上等于1/clip_w

这可以解释为什么你在这里讨论的缩放是颠倒的:

  

例如,如果鼠标开启(-0.8,0.3)且矩阵的缩放比例为0.5,0.5,0.5,则鼠标矢量的结果应为(-1.6,0.6)且没有碰撞点。有了这个,我有了使用逆矩阵的想法。之后我尝试了X和Y的旋转,从2D的角度来看,它与缩放相同:在X和Y上给出PI / 2,模型看起来像是0.5的缩放。但是,将倒置矩阵与向量相乘会得到(-0.4,0.15)结果,每次使用X / Y旋转时都会给出误报。

如果你正确地将比例改为(1 / 0.5,1 / 0.5,1 / 0.5)=(2.0,2.0,2.0)那么数学运算。