0

长期聆听者,第一次来电者。所以我一直在玩Android 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_);
4

1 回答 1

0

好吧,在查看 中的向量/矩阵数学代码后ndk_helper,这并不奇怪。简而言之:不要使用它。扫描了几分钟后,它有一些明显的错误,看起来像是简单的错别字。尤其是Vec4该类对于图形所需的矢量操作几乎没有用处。大多数操作都假设 aVec4是 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 空间转换回世界空间。因此,您用于此计算的输入向量应位于剪辑/NDC 空间中,这意味着对应于近/远平面的 z 坐标值应为 -1 和 1。

于 2014-10-08T06:28:29.037 回答