在窗口里面的适合的3d模型

时间:2010-11-14 23:18:46

标签: opengl graphics mfc

我想在视图中显示不同尺寸的模型,以便整个模型在屏幕内可见 最好的方法是什么? 我尝试使用此公式(使用glScale)缩放模型

scaleFactor = ( screenSize / (maxModelSize * constant) )

尺寸是高度或宽度,取决于更大的尺寸 常数为1 / (length of one screen pixel in OpenGL units)
这有两个问题:
1。在进行一些转换后,我希望能够使用Identity返回到此初始比例(模型缩放以适合窗口)。目前,呼叫身份将使模型达到其原始尺寸(在“固定”标度之前) 2。“常数”是我通过反复试验获得的东西,我觉得我的方法不对。我也怀疑它根本不是一个常数,取决于屏幕分辨率,上帝知道还有什么。

1 个答案:

答案 0 :(得分:9)

Section 8.070

  

以下是来自发布者   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);