c++ - 旋转对象 OpenGL 时出现严重失真

标签 c++ opengl glfw glm-math

我一直在尝试通过制作 View 矩阵和模型矩阵来旋转四边形。我正在使用 GLM 来执行此操作。

下面是制作矩阵的代码:

glm::mat4 view = glm::translate(glm::mat4(1.0f), position);
view = view * glm::rotate(glm::radians(pitch), glm::vec3(1.0f, 0.0f, 0.0f));

glm::mat4 model = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, 0.0f));

这是顶点着色器:

#version 330 core
layout (location = 0) in vec3 aPos;

uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;

void main()
{
    gl_Position = projection * view * model * vec4(aPos, 1.0);
}

所以这段代码正在旋转对象,但是它们在旋转时非常扭曲,并且在屏幕的顶部和底部旋转得更慢。我试图查找另一种方法来执行此操作,但屏幕上根本没有显示任何其他内容。

编辑:这是失真的链接:https://imgur.com/a/HzUNJAe

img

最佳答案

对于透视图来说,形状扭曲是很常见的。您的情况如下所示:

overview

x 轴穿过你的 QUAD 中心,所以当你围绕 x 旋转时,你的四边形的一半离相机更近,另一半离相机更远......正如你所看到的,更近的部分可以比未旋转的尺寸大得多四边形。

不成比例的失真可能是由两件事引起的:

  1. 鱼眼

    你离相机太近尝试将你的四边形从相机移得更远,例如 10.0 或 z 轴上的更多单位。你离 znear 越近,QUAD 的较近部分和较远部分之间的比例失调就越大

    鱼眼受相机的 znear 和 FOV 影响很大,因此改变它们也可能有帮助......(更大的 znear,更小的 FOV)

    我看到鱼眼是这样的:

    fisheye

    如果你的物体离相机太近,那么未旋转的 QUAD 实际上比旋转后的小,因为它在相机观察方向(-z 轴)的焦点和 ZY 平面中的物体边缘之间的视角较小。一旦相机或 QUAD 远离彼此,就不会发生这种情况。

  2. 错误的纵横比校正

    当您设置透视图时,请检查您是否提供了正确的宽高比(而不是倒置的)。如果 x 轴和 y 轴上的比例在视觉上不相同,那么当您的 QUAD 直接面对相机时,它不是正方形的……并且在旋转时它可能会产生奇怪的外观行为。

关于c++ - 旋转对象 OpenGL 时出现严重失真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58213578/

相关文章:

c++ - 如何使这个 Open GL 程序在不终止的情况下旋转

java - 着色器 Java OpenGL 代码内没有错误,但窗口内没有渲染任何内容

c++ - 窗口标题 GLFW 中的 FPS 计数器

c - 使用 MinGW : Undefined reference to '_imp__glewExperimental.' 的 GLEW 问题

c++ - 是否弃用了 gluTess* 函数?

c++ - 来自文件的并发处理

c++ - 如何通过boost::log打印到不同属性的不同日志?

c++ - 使用 getopt_long (C++) 我如何编写长选项和短选项以同时需要参数?

opengl - 在 OpenGL 中沿折线路径创建管

c++ - 选择哪个数学库来转换 LabView 模块