了解OpenGL投影矩阵

问题描述 投票:1回答:1

我一直在编写一个使用OpenGL显示3D模型的程序,直到现在我都使用了正交投影,但是我想切换到透视投影,这样当相机走向模型时,它看起来会变大。我知道我必须将三个矩阵(模型,视图和投影)相乘以正确应用我的所有变换。正如您在下面的代码中看到的那样,我试图这样做,并且能够正确地创建模型和查看矩阵。我知道这些工作正常,因为当我将模型和视图放在一起时,我可以旋转和平移对象,以及更改摄像机的位置和角度。我的问题是,当我用投影矩阵乘以该产品时,我再也看不到屏幕上的对象了。

这里相机结构的默认值是{0,0, - 。5}但是我用键盘操纵该值来移动相机。

我使用GLFW +很高兴,而linmath.h用于矩阵数学。

    //The model matrix controls where the object is positioned. The
    //identity matrix means no transformations.
    mat4x4_identity(m);
    //Apply model transformations here.

    //The view matrix controls camera position and angle.
    vec3 eye={camera.x,camera.y,camera.z};
    vec3 center={camera.x,camera.y,camera.z+1};
    vec3 up={0,1,0};
    mat4x4_look_at(v,eye,center,up);

    //The projection matrix flattens the world to 2d to be rendered on a
    //screen.
    mat4x4_perspective(p, 1.57, width/(float)height, 1,10); //FOV of 90°
    //mat4x4_ortho(p, -ratio, ratio, -1.f, 1.f, 1.f, -1.f);

    //Apply the transformations. mvp=p*v*m.
    mat4x4_mul(mvp, p, v);
    mat4x4_mul(mvp, mvp, m);
opengl glfw projection-matrix
1个回答
3
投票

当设置透视投影矩阵时,则设置到近平面和远平面的距离。在你的情况下,近平面为1,远平面为10:

mat4x4_perspective(p, 1.57, width/(float)height, 1,10);

该模型被近平面修剪。该模型必须在剪辑空间中。 相机平截头体(截头金字塔)中的眼睛空间坐标被映射到立方体(标准化设备坐标)。所有不在平截头体体积内的几何体都被剪裁。

这意味着模型到相机的距离必须大于到近平面(1)的距离并且小于到远平面(10)的距离。

由于您可以在不使用任何投影矩阵时“看到”模型,因此与模型的实际距离在[-1,1]范围内(规范化设备空间)。请注意,如果不使用投影矩阵,则投影矩阵是单位矩阵。这表现得像正投影,近平面距离为-1,远平面距离为1。

更改相机的位置以解决问题:

EG

vec3 eye    = {camera.x, camera.y, camera.z - 5}; // <--- 5 is in range [1, 10] 
vec3 center = {camera.x, camera.y, camera.z};
vec3 up     = {0, 1, 0};
mat4x4_look_at(v, eye, center, up);
© www.soinside.com 2019 - 2024. All rights reserved.