Opengl es 在OpenGL es 2.0中将屏幕坐标取消投影到世界

Opengl es 在OpenGL es 2.0中将屏幕坐标取消投影到世界,opengl-es,android-ndk,projection,ray-picking,Opengl Es,Android Ndk,Projection,Ray Picking,长时间侦听器,第一次调用。 所以我一直在玩安卓NDK,现在我想取消对世界坐标的点击,但我无法让它工作。 问题是近点和远点的x和y值都相同,这对于透视投影来说似乎不正确。场景中的一切都画得很好,所以我有点困惑为什么不能正确地取消投影,不管怎样,这是我的代码,请帮助,谢谢 //x and y are the normalized screen coords ndk_helper::Vec4 nearPoint = ndk_helper::Vec4(x, y, 1.f, 1.f); ndk_helpe

长时间侦听器,第一次调用。 所以我一直在玩安卓NDK,现在我想取消对世界坐标的点击,但我无法让它工作。 问题是近点和远点的x和y值都相同,这对于透视投影来说似乎不正确。场景中的一切都画得很好,所以我有点困惑为什么不能正确地取消投影,不管怎样,这是我的代码,请帮助,谢谢

//x and y are the normalized screen coords
ndk_helper::Vec4 nearPoint = ndk_helper::Vec4(x, y, 1.f, 1.f);
ndk_helper::Vec4 farPoint = ndk_helper::Vec4(x, y, 1000.f, 1.f);

ndk_helper::Mat4 inverseProjView = this->matProjection * this->matView;
inverseProjView = inverseProjView.Inverse();

nearPoint = inverseProjView * nearPoint;
farPoint = inverseProjView * farPoint;

nearPoint = nearPoint *(1 / nearPoint.w_);
farPoint = farPoint  *(1 / farPoint.w_);

好吧,在看了ndk_helper中的向量/矩阵数学代码后,这并不奇怪。简而言之:不要使用它。在浏览了几分钟后,它出现了一些明显的错误,看起来像是简单的打字错误。尤其是
Vec4
类对于图形所需的向量操作几乎毫无用处。大多数操作都假定
Vec4
是4D空间中的向量,而不是三维空间中包含同质坐标的向量

如果您愿意,您可以在这里查看,但要准备好几个手掌:

例如,这是代码最后两行中使用的乘法的实现:

Vec4 operator*( const float& rhs ) const
{
    Vec4 ret;
    ret.x_ = x_ * rhs;
    ret.y_ = y_ * rhs;
    ret.z_ = z_ * rhs;
    ret.w_ = w_ * rhs;
    return ret;
}
这将4D空间中的向量乘以标量,但如果使用齐次坐标操作,则完全错误。这就解释了你看到的结果

我建议您要么编写适合图形类型操作的向量/矩阵库,要么使用经过测试并供他人使用的免费可用库


顺便说一句,您在测试中使用的特定值看起来有些奇怪。对于这两个向量,你肯定不应该得到相同的结果,但这可能不是你所想的。对于输入向量中的
z
坐标,使用眼睛坐标中近平面和远平面的距离。但随后将反向视图投影矩阵应用于这些向量,从而将它们从剪辑/NDC空间转换回世界空间。因此,用于此计算的输入向量应在clip/NDC空间中,这意味着与近/远平面对应的z坐标值应为-1和1。

非常感谢,我停止使用ndk_辅助向量数学工具,它给了我更可信的结果。作为谷歌官方NDK的一部分,我甚至没有想到这是错误的。干杯