c++ - 渲染时 3D 立方体出现拉伸(stretch)

标签 c++ opengl 3d

我有一个基本的 opengl 项目,可以在屏幕上绘制一个 3D 立方体。我的分辨率是 1600 x 900。无论相机离立方体多远或多近,立方体总是出现水平拉伸(stretch),看起来像一个三角形。我已经将同一个立方体加载到一个 Java 项目中,它绘制得非常完美。但是使用 C++ 中的相同代码,我得到了拉伸(stretch)效果。关于可能导致此问题的任何建议?

GLvoid RenderSettings::init()
{
    const GLfloat FOV = 60.0F; 
    const GLfloat ASPECT_RATIO = getScreenWidth() / getScreenHeight();
    const GLfloat NEAREST_VIEW = 1.0F;
    const GLfloat FARTHEST_VIEW = 1000.0F;

    glViewport(0, 0, getScreenWidth(), getScreenHeight());

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(FOV, ASPECT_RATIO, NEAREST_VIEW, FARTHEST_VIEW);

    glClearColor(0.0, 0.0, 0.0, 1.0);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);
    glDepthFunc(GL_LEQUAL);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

}

最佳答案

这个

const GLfloat ASPECT_RATIO = getScreenWidth() / getScreenHeight();

有你的问题。我假设 getScreenWidthgetScreenHeight 返回整数。在 C/C++ 中,当除以整数时,这是作为整数运算发生的,这意味着结果将(总是)向下舍入到下一个更小的整数。您将结果分配给的类型无关紧要。 C/C++ 独立地查看 L 值和 R 值的类型。您可以通过将除法的一侧强制转换为 float 来修复它(通常您只强制转换两者),即

GLfloat const ASPECT_RATIO = (float)getScreenWidth() / (float)getScreenHeight();

还要注意 const 限定符是左结合的,即它作用于它剩下的部分。只有当它是变量定义语句中的第一个 标记时,它才会向右移动。但是许多语言纯粹主义者(包括我)认为这看起来很难看。在类型之后写 const 更符合自然语言。

关于c++ - 渲染时 3D 立方体出现拉伸(stretch),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15861829/

相关文章:

android - 在 Android 应用程序中导入并显示 WRL 文件中的模型

c++ - C++中的复制构造函数

c# - 将 _WTSClient 结构从 C++ 转换为 C#

c++ - 为什么我的二十面体画不出来?

opengl - 使用每个三角形/面的纯色编写 GLSL 片段着色器的方法

c# - 在 3D Kinect 中识别手语

javascript - 如何 "sort"多边形 3d?

c++ - 取消设置 glXMakeContextCurrent 时进程崩溃

c++ - c++连接mysql的问题

c++ - 处理对象内对象的光照