首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在gluPerspective()/glm::perspective()中,近/远裁剪平面是如何工作的?

在gluPerspective()/glm::perspective()中,近/远裁剪平面是如何工作的?
EN

Stack Overflow用户
提问于 2017-12-19 16:19:39
回答 1查看 1.3K关注 0票数 4

我有一个关于标准透视投影矩阵是如何工作的问题,这是从gluPerspective()glm::perspective()获得的。具体来说,我想知道的是近距/远距离的飞机。

我当时的印象是,在用透视矩阵转换一个点之后,近剪贴面上的对象映射到Z值为- 1,远剪辑平面附近的对象映射到Z值为1。

例如,假设你有一个相机位于原点,朝正Z轴的方向看,附近的剪辑平面设置为1.0,远剪辑平面设置为2.0。然后,我希望将具有"world“Z坐标介于1.0和2.0之间的事物转换为-1.0和1.0之间的投影坐标。

换句话说,我希望这个C++代码:

代码语言:javascript
复制
#include <iostream>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>

using namespace glm;

void print_vec(vec4 pnt) {
    std::cout << "(" << pnt.x << ", " << pnt.y << ", " << pnt.z << ")" << "\n";
}

int main() {
    mat4x4 view = lookAt(
            vec3(0.0f, 0.0f, 0.0f),   // eye at origin
            vec3(0.0f, 0.0f, 1.0f),   // looking towards +Z
            vec3(0.0f, 1.0f, 0.0f));  // up is +Y

    mat4x4 projection = perspective(
            radians(90.0f),  // field of view
            1.0f,            // aspect ratio
            1.0f,            // near clipping plane
            2.0f);           // far clipping plane

    // transformation matrix for world coordinates
    mat4x4 vp = projection * view; 

    // points (0,0,1), (0,0,1.5) and (0,0,2) in homogeneous coordinates
    print_vec(vp * vec4(0.0f, 0.0f, 1.0f, 1.0f));
    print_vec(vp * vec4(0.0f, 0.0f, 1.5f, 1.0f));
    print_vec(vp * vec4(0.0f, 0.0f, 2.0f, 1.0f));
}

把这个打印出来

代码语言:javascript
复制
(0, 0, -1)
(0, 0, 0)
(0, 0, 1)

但它没有印出这个

代码语言:javascript
复制
(0, 0, -1)
(0, 0, 0.5)
(0, 0, 2)

我不明白为什么。附近的剪辑平面投影,如我所期待的,但一个点之间的飞机之间是更接近背部时,投射,一个点在远剪辑平面是完全超出-1,1的范围。

我觉得我错过了一些基本的数学问题,所以我要问你们这些优秀的家伙。

(顺便说一句,我正在做的事情实际上是用Rust编写的,而不是用C++编写的,但是我切换到C++进行了这个测试,只是为了确保锈蚀实现中没有bug之类的东西。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-19 16:35:17

但它没有印出这个

代码语言:javascript
复制
(0, 0, -1)
(0, 0, 0.5)
(0, 0, 2)

这是错误的,因为结果不是vec3类型,而是vec4类型的齐次坐标

代码语言:javascript
复制
(0, 0, -1, 1)
(0, 0, 0.5, 1.5)
(0, 0, 2, 2)

你必须做一个透视划分,然后你会得到预期的结果:

代码语言:javascript
复制
(0/1,   0/1,   -1/1)
(0/1.5, 0/1.5,  0.5/1.5)
(0/2,   0/2,    2/2)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47891061

复制
相关文章

相似问题

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