将OpenGL中的对象保持在窗口的边界内

时间:2011-11-26 20:07:13

标签: objective-c opengl object window

我一直在使用Objective c和OpenGL开发游戏。我知道如何创建对象以及如何使其按照我想要的方式移动,但我无法将其保留在窗口内。如何将对象保留在窗口内?

2 个答案:

答案 0 :(得分:1)

OpenGL常见问题解答,section 8.070: How can I automatically calculate a view that displays my entire model?

  

以下内容来自Dave Shreiner关于设置基本内容的帖子   观看系统:

     

首先,为场景中的所有对象计算边界球。这个   应该为您提供两点信息:中心   sphere(let(c.x,c.y,c.z)就是那个点)及其直径(称之为   “直径”)。

     

接下来,为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的窗口。如果您的窗口不是方形,请计算   left,right,bottom和top,如上所述,并放入以下逻辑   在调用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);

答案 1 :(得分:0)

“看”相机是一种非常方便的技术,可以使观察者跟踪物体(因此,物体或相机点移动,物体将停留在屏幕上)。有关常用的实现,请参阅'gluLookAt',大多数3d帮助程序代码库都有一个。你给它一个理想的相机点,感兴趣的物体和'向上矢量',它将创建一个合适的世界(相机变换)矩阵。

否则,如果你控制了这个物体,就不要把它移到最初的截头体之外。