我有一个程序,可以跟踪用户的位置并设置视锥(将相机设置在用户的位置),以根据用户的位置改变场景的透视图。直到现在,我将显示屏的四个角放在同一深度,我能够设置非对称的视锥并根据用户的视角改变场景。
当前代码看起来像以下内容:
然而,我希望能够在一个被倾斜向用户的显示器上或者不是所有顶点都在相同Z轴的情况下,实现与该问题相同的效果。
以上可以想象成一种倾斜的窗口,其顶点将从用户位置定义截锥体。如何实现这样的截锥体,其中显示屏没有所有顶点位于相同的Z轴上?
编辑:考虑到设置中有三个平面。中间的平面给出了正确的非对称锥体,因为所有顶点都在相同的Z轴上,而左右两个平面则各有两个顶点处于不同的Z轴上。其顶点如下所示:
当前代码看起来像以下内容:
UserCam::begin(){
saveGlobalMatrices();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(_topLeftNear.x, _bottomRightNear.x, _bottomRightNear.y, _topLeftNear.y, _camZNear, _camZFar);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(_wcUserHead.x, _wcUserHead.y, _topLeftScreen.z, _wcUserHead.x, _wcUserHead.y, _topLeftScreen.z-1, 0, 1, 0);
}
UserCam::end(){
loadGlobalMatrices();
}
UserCam::setupCam(){
this->_topLeftScreen = _wcTopLeftScreen - _wcUserHead; //wcTopLeftScreen, wcBottomRightScreen and wcUserHead are in the same frame of reference
this->_bottomRightScreen = _wcBottomRightScreen - _wcUserHead;
this->_topLeftNear = (_topLeftScreen/ _topLeftScreen.z) * _camZNear;
this->_bottomRightNear = (_bottomRightScreen/_bottomRightScreen.z )) * _camZNear;
}
然而,我希望能够在一个被倾斜向用户的显示器上或者不是所有顶点都在相同Z轴的情况下,实现与该问题相同的效果。
以上可以想象成一种倾斜的窗口,其顶点将从用户位置定义截锥体。如何实现这样的截锥体,其中显示屏没有所有顶点位于相同的Z轴上?
编辑:考虑到设置中有三个平面。中间的平面给出了正确的非对称锥体,因为所有顶点都在相同的Z轴上,而左右两个平面则各有两个顶点处于不同的Z轴上。其顶点如下所示:
Plane1: TL : (-426.66, 0, 200), TR: (0, 0, 0), BL : (-426.66, 320.79, 200), BR : (0, 320.79, 0)
Plane2: TL : (0, 0, 0), TR: (426.66, 0, 0), BL : (0, 320.79, 0), BR: (426.66, 320.79, 0)
Plane3: TL: (426.66, 0, 0), TR: (853.32, 0, 200), BL : (426.66, 320.79, 0), BR : (853.32, 320.79, 200)