鼠标坐标到3D世界/投影点碰撞
Mouse coordinates to 3D world/projection for point collision
我在网上看到,将鼠标坐标(或触摸点)转换为3D世界并执行某种"选择3D元素"的正确方法是:
- 对模型、视图和投影进行正片叠底
- 计算逆矩阵
- 将鼠标坐标存储在一个范围为[-1,+1]的矢量中
- 将鼠标矢量与矩阵相乘
- 检查碰撞检查的坐标(在我的情况下,我检查当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),然后数学工作
- 落砂模拟碰撞检测C++和SFML
- SFML 碰撞永远不会在我的系统中注册
- 应用投影矩阵后对象消失
- 在均匀网格中处理碰撞
- 在其特征向量上投影点云
- 在 OpenGL 中使用透视与正交投影时的光线投射(鼠标拾取)
- 平台游戏 - 下车时避免与平台碰撞
- AABB 碰撞使实际精灵的大小翻倍
- 具有随机值的多个对象及其碰撞的 SFML
- SFML 中的重力和碰撞检测
- 我的碰撞检测中的奇怪行为
- Box2D Contact Listener碰撞仅间歇性工作
- 如何为球形物体和三角形地形提供高效的碰撞检测和响应
- 同时与两个片段着色器发生碰撞
- 2D 障碍物碰撞
- 可破坏的网格块会导致奇怪的碰撞
- ptrdiff_t typedef 碰撞 - 谷歌测试和英特尔蟒蛇
- 正交投影设置
- 玩家移动和碰撞之间的交互问题
- 鼠标坐标到3D世界/投影点碰撞