2014-10-07 137 views
0

长时间监听,第一次来电。 所以我一直在玩Android NDK,并且我正处在一个我不想要点击世界坐标的点,但是我无法让它工作。 问题是近点和远点的x和y值是相同的,这对于透视投影来说似乎并不正确。场景中的所有绘制行,所以我有点困惑,为什么它不会正确unproject,反正这里是我的代码请帮助谢谢Unprojecting屏幕坐标在OpenGL ES 2.0中的世界

//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_); 

回答

0

那么,在ndk_helper看着矢量/矩阵数学代码之后,这并不令人意外。总之:不要使用它。经过几分钟的扫描,它有一些明显的错误,看起来像简单的错别字。特别是Vec4类对于图形所需的矢量操作而言几乎没有用处。大多数操作假定Vec4是4D空间中的矢量,而不是在3D空间中包含同质坐标的矢量。

如果你愿意,你可以检查出来这里,但几面手掌准备:

https://android.googlesource.com/platform/development/+/master/ndk/sources/android/ndk_helper/vecmath.h

例如,这是在最后两行用乘法的执行您的代码:

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之间。

+0

非常感谢Reto,我停止使用ndk_helper矢量数学的东西,它给了我更多可信的结果。作为谷歌官方NDK的一部分,它甚至没有让我意识到这是错误的。 欢呼声 – BlondesDoingMath 2014-10-09 09:59:26