首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转换为NDC,计算并转换回worldspace

转换为NDC,计算并转换回worldspace
EN

Stack Overflow用户
提问于 2015-11-24 15:02:34
回答 1查看 2K关注 0票数 2

我有一个问题,将世界坐标移动到ndc坐标,而不是用它计算一些东西,并将它移回着色器内。

“守则”的内容如下:

代码语言:javascript
复制
vec3 testFunc(vec3 pos, vec3 dir){
    //pos and dir are in worldspace, convert to NDC
    vec4 NDC_dir = MVP * vec4(dir,0);
    vec4 NDC_pos = MVP * vec4(pos,1);
    NDC_dir /= NDC_dir.w;
    NDC_pos /= NDC_pos.w;

    //... do some caclulations => get newPos in NDC 

    //Transform newPos back to worldspace
    vec4 WS_newPos = inverse(MVP) * vec4(newPos,1);
    return WS_newPos.xyz / Ws_newPos.w;
}

我在测试时发现,虽然NDC_dir.x和NDC_dir.y似乎是合理的,但NDC_dir.w和NDC_dir.z几乎总是相等的。因此,当除以"w“时,z值总是约为1,我认为这不应该是正确的?(NDC_pos也一样)。

另一方面,当我将"pos“转换为NDC,而不是将其转换回Worldspace (没有任何计算)时,它似乎得到了原来的点,这实际上意味着转换是正确的。

有人能告诉我如果我做错了什么吗,如果没有,为什么z值总是1?

更新:,这有点尴尬。“我有两个问题:一是方向问题,”阿恩指出。另一个只是我这边的缩放问题。我有一个非常小的近距离剪辑和一个很远的剪辑。由于这个值是对数的,我刚刚移动了两个大的步骤来实现z值实际上是从-1到1。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-24 15:36:27

我在测试时发现,虽然NDC_dir.x和NDC_dir.y似乎是合理的,但NDC_dir.w和NDC_dir.z几乎总是相等的。因此,当除以"w“时,z值总是约为1,我认为这不应该是正确的?(NDC_pos也一样)。

其实是的,应该是这样的。如果输入形式为{x,y,z,0},那么它将被解释为在{x,y,z}方向上无限远的一个点。因此,深度分量应该始终是最遥远的,如果是可见的。顺便说一句,一个无穷远的点仍然是平移不变的。

但是你应该知道,在NDC中,一个无限远的点可能不是你想要的。

三维空间中的向量对平移是不变的,它只是保持不变的矢量,因为矢量只有一个方向,而不是位置。这在扭曲的NDC中是不可能的。

如果你想转换一个向量,你最好转换两个点,然后再取NDC中的差值。但是你应该知道你的结果取决于你的职位。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33897004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档