实现离轴投影

时间:2013-05-07 10:16:14

标签: c++ algorithm opengl openframeworks

我正在尝试获取离轴投影效果,其中屏幕的内容根据用户的位置而变化。这与此视频中的内容类似:
http://www.youtube.com/watch?feature=player_embedded&v=Jd3-eiid-Uw

我不确定为什么离轴投影是达到上述效果的合适方法。我在这里想到两种方法:1)使用glFrustum,2)使用lookAt()
在上面的应用程序中,“相机”基本上按照用户的位置移动。 透视投影的glFrustum坐标(leftrightbottomtopnearfar)被赋予改变屏幕上的对象,因为当用户移动时,它们将从不同的位置出现。

与此同时,我发现这与使用用户位置翻译相机并将相机gluLookAt(centerPosition)提供给lookAt中心非常相似。但我没有得到这个所需的效果,并想知道为什么会发生这种情况。

enter image description here

以上两者有什么区别?

在OpenGL中通过以下方式实现离轴投影:

glMatrixMode(GL_PROJECTION);  
    glLoadIdentity();            
    glFrustum(fNear*(-fFov * ratio + headX),  
              fNear*(fFov * ratio + headX),  
              fNear*(-fFov + headY),  
              fNear*(fFov + headY),  
              fNear, fFar);  
          
    glMatrixMode(GL_MODELVIEW);  
    glLoadIdentity();  
    gluLookAt(headX*headZ, headY*headZ, 0, headX*headZ, headY*headZ, -1, 0, 1, 0);
    glTranslatef(0.0,0.0,headZ);

上面的 gluLookAt(...)有什么意义,而不是在我尝试使用相机而只是给它一个lookAt point作为屏幕的中心时?

1 个答案:

答案 0 :(得分:5)

  

我不确定为什么离轴投影是达到上述效果的合适方法。

因为显示屏对应于平截头体的近平面。当你移动头部时,你会看到屏幕离轴。通过这种方式,你必须通过对投影平截头体做同样的重现。

然而,使用lookAt将旋转场景,从而丢失近平面和屏幕平面之间的对应关系。