我有一个基本的opengl项目,可以将3D立方体绘制到屏幕上。我的分辨率为1600 x 900.无论相机与立方体的距离或距离多远,立方体总是呈现水平拉伸,看起来像三角形。我已将相同的多维数据集加载到一个java项目中,它完美地绘制。但是在C ++中使用相同的代码,我会得到一个拉伸效果。关于可能导致这种情况的任何建议?
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();
}
答案 0 :(得分:2)
此
const GLfloat ASPECT_RATIO = getScreenWidth() / getScreenHeight();
有你的问题。我假设getScreenWidth
和getScreenHeight
返回整数。在C / C ++中,当分割整数时,这发生在整数运算中,这意味着结果将(总是)向下舍入到下一个较小的整数。您分配结果的类型无关紧要。 C / C ++独立地查看L值和R值的类型。您可以通过将分区的一侧强制转换为浮点数来修复它(通常只是转换它们),即
GLfloat const ASPECT_RATIO = (float)getScreenWidth() / (float)getScreenHeight();
另请注意,const
限定符是左关联的,即它会对其左侧的内容起作用。只有当它是变量定义语句中的第一个标记时,它才会向右移动。但是许多语言纯粹主义者(包括我)认为这看起来很难看。在类型之后编写const也更适合自然语言。