OpenGL绘制矩形填充窗口

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

我试图了解OpenGL MVP矩阵,作为练习,我想使用矩阵绘制一个填充窗口的矩形。我以为自己会很容易找到一个相关的教程,但是我发现的所有内容似乎只是在MVP矩阵设置中放入了随机值。

说我的矩形有这些坐标:

GLfloat vertices[] = {
    -1.0f,  1.0f,  0.0f, // Top-left
     1.0f,  1.0f,  0.0f, // Top-right
     1.0f, -1.0f,  0.0f, // Bottom-right
    -1.0f, -1.0f,  0.0f, // Bottom-left
};

这是我的两个三角形:

GLuint elements[] = {
    0, 1, 2,
    2, 3, 0
};

如果我用标识MVP矩阵绘制矩形,它将按预期填充屏幕。现在我想使用一个视锥。这是它的设置:

float m_fov = 45.0f;
float m_width = 3840;
float m_height = 2160;
float m_zNear = 0.1f;
float m_zFar = 100.0f;

由此,我可以计算出在z-near和z-far处的窗口的宽度/高度:

float zNearHeight = tan(m_fov) * m_zNear * 2;
float zNearWidth = zNearHeight * m_width / m_height;
float zFarHeight = tan(m_fov) * m_zFar * 2;
float zFarWidth = zFarHeight * m_width / m_height;

现在我可以创建我的视图和投影矩阵:

glm::mat4 projectionMatrix = glm::perspective(glm::radians(m_fov), m_width / m_height, m_zNear, m_zFar);
glm::mat4 viewMatrix = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -m_zNear));

我现在希望这能使我的矩形充满窗口:

glm::mat4 identity = glm::mat4(1.0f);
glm::mat4 rectangleModelMatrix = glm::scale(identity, glm::vec3(zNearWidth, zNearHeight, 1));

但是这样做,我的矩形太大了。我想念什么?

c++ opengl projection glm-math frustum
1个回答
0
投票

平行于视图xy平面的平面上对象的投影高度为

h' = h * tan(m_fov / 2) / z

其中h是物体在平面上的高度,z是深度,m_fov是视场角。

在您的情况下,m_fov为45°,z为0.1(-m_zNear),因此tan(m_fov / 2) / z为〜4,142。由于四边形的高度为2,因此四边形的投影高度为〜8,282。

要创建正好适合视口的四边形,请使用90°视场,并且与对象的距离为1,因为tan(90° / 2) / 1为1。例如:

float m_fov = 90.0f;
glm::mat4 projectionMatrix = glm::perspective(glm::radians(m_fov), m_width / m_height, m_zNear, m_zFar);
glm::mat4 viewMatrix = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -1.0f));
© www.soinside.com 2019 - 2024. All rights reserved.