我想在视图中显示不同尺寸的模型,以便整个模型在屏幕内可见 最好的方法是什么? 我尝试使用此公式(使用glScale)缩放模型
scaleFactor = ( screenSize / (maxModelSize * constant) )
尺寸是高度或宽度,取决于更大的尺寸
常数为1 / (length of one screen pixel in OpenGL units)
这有两个问题:
1。在进行一些转换后,我希望能够使用Identity返回到此初始比例(模型缩放以适合窗口)。目前,呼叫身份将使模型达到其原始尺寸(在“固定”标度之前)
2。“常数”是我通过反复试验获得的东西,我觉得我的方法不对。我也怀疑它根本不是一个常数,取决于屏幕分辨率,上帝知道还有什么。
答案 0 :(得分:9)
以下是来自发布者 Dave Shreiner建立了一个基本的 观看系统:
首先,计算一个边界球体 场景中的所有对象。这应该 为您提供两点 信息:球体的中心 (让(c.x,c.y,c.z)成为那一点) 和它的直径(称之为“diam”)。
接下来,为zNear选择一个值 剪裁平面。一般准则是 选择比大的东西,但是 接近1.0。所以,假设你设置了
zNear = 1.0; zFar = zNear + diam;
在此构建矩阵调用 订单(对于正交 投影):
GLdouble left = c.x - diam; GLdouble right = c.x + diam; GLdouble bottom c.y - diam; GLdouble top = c.y + diam; glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(left, right, bottom, top, zNear, zFar); glMatrixMode(GL_MODELVIEW); glLoadIdentity();
这种方法应该以你的方式为中心 窗口中间的物体 并拉伸它们以适应(即,它的 假设你正在使用一个窗口 纵横比= 1.0)。如果你的 窗口不是方形,左边计算, 右,底部和顶部,如上所述,和 在之前提出以下逻辑 致电glOrtho():
GLdouble aspect = (GLdouble) windowWidth / windowHeight; if ( aspect < 1.0 ) { // window taller than wide bottom /= aspect; top /= aspect; } else { left *= aspect; right *= aspect; }
上面的代码应该定位 适当的场景中的对象。 如果你打算操纵(即 旋转等),你需要添加一个 查看转换为它。
典型的观看转换将继续 可能看起来像ModelView矩阵 像这样:
GluLookAt (0., 0., 2.*diam, c.x, c.y, c.z, 0.0, 1.0, 0.0);