iPhone在横向视图中拾取/取消投影(旋转投影矩阵)

iPhone在横向视图中拾取/取消投影(旋转投影矩阵),iphone,math,opengl-es,matrix,glu,Iphone,Math,Opengl Es,Matrix,Glu,我正在尝试在3D场景中进行“拾取”,在3D场景中,视图被旋转,使得iPhone处于横向模式。我使用的是OpenGL ES 2.0,因此所有着色器都没有固定的函数管道 我正在从渲染代码中执行取消投影,并立即使用GL_LINES绘制生成的光线。光线仅在我第一次触摸屏幕时计算,因此之后我可以移动相机,从不同角度观察生成的光线 我的unproject代码/调用很好,有很多glunproject在线示例。我的矩阵求逆代码即使与excel中的一些矩阵相比也很好。然而,生成的光线与我在模拟器中实际“点击”的位

我正在尝试在3D场景中进行“拾取”,在3D场景中,视图被旋转,使得iPhone处于横向模式。我使用的是OpenGL ES 2.0,因此所有着色器都没有固定的函数管道

我正在从渲染代码中执行取消投影,并立即使用GL_LINES绘制生成的光线。光线仅在我第一次触摸屏幕时计算,因此之后我可以移动相机,从不同角度观察生成的光线

我的unproject代码/调用很好,有很多glunproject在线示例。我的矩阵求逆代码即使与excel中的一些矩阵相比也很好。然而,生成的光线与我在模拟器中实际“点击”的位置至少相差5-15度,这实际上是一次点击,因此我希望未投影的光线具有更高的精度

在我创建透视投影矩阵后,我的视图被旋转到横向,我将它绕Z旋转-90度;纵横比保持在纵向1。我相信数学问题就在这里


有没有人有过专门针对景观进行拾取/取消投影的经验?

是否可以只关闭视野?假设你坚持使用传统的管道,如果你反转你的模型视图矩阵,然后使用通用的非投影代码,即,假设在两个方向上都有90度的视野来填充眼睛空间的代码,那么这就可以解释它了

一个快速的诊断测试是查看不同触摸的距离。靠近投影中心的触摸应更接近正确答案

在像iPhone这样的正方形像素屏幕上,纵横比只是水平场与垂直场的比例。因此,如果你想不科学,找到你正在使用的视野,比如说f,然后尝试将结果乘以90/f或f/90。如果这不起作用,也可以尝试在其中加入480/320或320/480的因子


更好的解决方案是按照代码进行操作,找出实际的水平和垂直视野。然后将结果乘以90以上。

感谢您的快速响应。事实上,我认为我的视野是60。我确实记得,在离中心越远的地方,触碰的次数越多。如果我暂时将FOV设置为90度,那么我应该期望从未投影中看到更高的精度?如果您的水平和垂直视野均为90度,导致图形又短又胖,因为您的视口不是方形的,那么您应该会得到完美的结果。如果你在矩阵中为透视样式的函数指定了一个垂直的视场,那么当旋转时,它应该变成水平的视场。我无法通过反复试验来解决一般情况。有时候我在屏幕中央的位置看起来非常精确,但在边缘位置会变得更糟。我注意到典型的平截体投影矩阵计算中有一个余切,应用于视场和纵横比,所以我需要应用于结果的“校正因子”可能不是线性的。哦,对了。可能是一个球面笛卡尔混合?屏幕上的行和列与观察者的角度不是线性的。例如,距离前剪辑平面投影中心n个单位处的柱与摄像机的距离为d,角度为atann/d。Unproject通常会给你一个向量,指向剪辑平面上的某个位置,或者你指定的与之平行的其他平面,这并不是一个考虑因素。我觉得奇怪的是,任何OpenGL程序(例如,在Windows上)是如何处理这个非1.0纵横比和非90度FOV的?看起来所有的iPhone教程都可以在纵向模式下正常工作,但具体来说,切换到横向模式是一个挑战。