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

Mouse coordinates to 3D world/projection for point collision

本文关键字:投影 碰撞 世界 坐标 3D 鼠标      更新时间:2023-10-16

我在网上看到,将鼠标坐标(或触摸点)转换为3D世界并执行某种"选择3D元素"的正确方法是:

  1. 对模型、视图和投影进行正片叠底
  2. 计算逆矩阵
  3. 将鼠标坐标存储在一个范围为[-1,+1]的矢量中
  4. 将鼠标矢量与矩阵相乘
  5. 检查碰撞检查的坐标(在我的情况下,我检查当x和y之间[-1,+1])

当我做平移,缩放甚至Z旋转时,它工作得很好,但在我的测试中,它在X和Y旋转时失败(可能在其他3D扭曲上)。我尝试了不同的逆和乘算法,但结果都是一样的。我做错了什么?

为了更详细地描述我的代码中发生了什么,我将尝试在这里解释这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旋转都会产生假阳性。

如果你想深入了解我的问题,可以免费下载并试用我的代码。为了简化阅读,它被精简到最小值。

我看了一下你的代码,我不确定你讨论的缩放是从哪里来的?我看到的只是一个旋转而已。

但是,为了正确地从窗口空间转换回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),然后数学工作