我一直在使用Objective c和OpenGL开发游戏。我知道如何创建对象以及如何使其按照我想要的方式移动,但我无法将其保留在窗口内。如何将对象保留在窗口内?
答案 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帮助程序代码库都有一个。你给它一个理想的相机点,感兴趣的物体和'向上矢量',它将创建一个合适的世界(相机变换)矩阵。
否则,如果你控制了这个物体,就不要把它移到最初的截头体之外。