2011-11-26 71 views
-3

我一直在使用目标c和OpenGL进行游戏。我知道如何创建对象以及如何使其按照我想要的方式移动,但我无法将它保留在窗口内。你如何将物体放在窗户内?在OpenGL中保存一个对象在一个窗口内

+1

你需要澄清你所说的“对象”的意思,你是如何渲染某些事情,等 –

+0

你不用在OpenGL中创建对象,你可以绘制它们。 OpenGL不维护场景图形或几何图形持久性。 OpenGL不记得你告诉它绘制的东西。 – datenwolf

回答

0

“观看”相机是一种非常方便的技术,可让观看者跟踪物体(因此,无论物体还是相机点移动,物体都会保持在屏幕上)。请参阅'gluLookAt'以获取常用的实现,大多数3d助手代码库都会有一个。你给它一个期望的相机点,感兴趣的对象和'向上向量',它会创建一个适当的世界(相机转换)矩阵。

否则,如果你在控制对象,只是不要将它移动到最初的平截头体之外。

1

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

以下是由Dave Shreiner一张贴在建立基本 观察系统:

首先,计算为场景中的所有对象边界球。这个 应该为您提供两位信息: 球体的中心(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的 窗口)。如果你的窗口不是正方形,计算 左,右,下,和顶部,如上述,并把下面的逻辑 调用glOrtho()之前:

GLdouble aspect = (GLdouble) windowWidth/windowHeight; 
if (aspect < 1.0) { // window taller than wide 
    bottom /= aspect; 
    top /= aspect; 
} else { 
    left *= aspect; 
    right *= aspect; 
} 

上面的代码应定位对象适当地在你的场景中。如果您打算操作(即旋转等),您需要向其添加查看转换。

一个典型的观看变换会在模型视图矩阵,可能 是这样的:

gluLookAt(0., 0., 2.*diam, 
      c.x, c.y, c.z, 
      0.0, 1.0, 0.0);