2011-03-14 36 views
0

在OpenGL程序中,我有一个Camera对象,它将投影矩阵设置为以精灵为中心。它运行良好,直到我进入全屏模式,我注意到我所关注的对象偏离了中心。在解决了我的解决方案后,我注意到4:3的解决方案没有这个问题(我原来是在1680x1050),然后我发现了以下内容。视口在全屏中似乎稍微偏离屏幕

1280x1024:object is centered。
1280x960:对象居中。
1280x720:对象不居中,整个视口似乎向左移动。也就是说,当我将鼠标移动到左边时,它似乎离开屏幕几英寸,屏幕右侧有一个黑色区域,没有任何东西被绘制,我的鼠标也不会移动。

有没有人有这样的问题?如果这很重要,我在Ubuntu上。

回答

1

您是否在设置投影矩阵时考虑了宽高比?

This tutorial如果不是,可能是一个有用的阅读。

这是我自己的版本(在Python中,但它应该是微不足道的翻译成java),如果有一个代码示例有帮助; initPerspectiveMatrix采用纵横比,即高度/宽度。

def calcFrustumScale(fov): 
    return (1.0/np.tan(np.deg2rad(fov)/2.0)) 

def initPerspectiveMatrix(aspectRatio = 1.0): 
    scale = calcFrustumScale(60) 
    ARscale = scale*aspectRatio 
    near = 0.5 
    far = 1000.0 
    perspMx = np.array([[ARscale, 0.0 ,   0.0   ,   0.0   ], 
         [ 0.0 , scale,   0.0   ,   0.0   ], 
         [ 0.0 , 0.0 , (near+far)/(near-far), (2*near*far)/(near-far)], 
         [ 0.0 , 0.0 ,   -1.0   ,   0.0   ]], dtype='float32') 
+0

我使用glOrtho来设置我的视角。在每次迭代中,摄像机都会调用glOrtho(objectCenter.x-80,objectCenter.x + 80,objectCenter.y-50,objectCenter.y + 50,-1,1)(假设16:10视图比率),并且每次窗口调用glViewport(0,0,windowWidth,windowHeight)。我错过了什么? – HahaHortness 2011-03-14 19:10:02

+0

我不熟悉glOrtho(我仍然在学习OpenGL,并决定使用3.3核心,所以glOrtho,glFrustum等已被弃用),但是从阅读文档看来,它似乎可以在16:10长宽比,所以我很茫然。难道在glOrtho之前,在矩阵堆栈上已经有其他东西了吗?或者你不是在正确的矩阵模式? – 2011-03-15 08:58:50

0

我的猜测是你的显示器通过VGA连接,并没有正确校准该分辨率。所以显示器改变显示输出。

可能的解决方案包括:

  • 重新校准显示器(自动或手动,无论是从显示器控制或OS控制,如果有的话)
  • 切换到数字1的连接(比如DVI或HDMI)。