C++ OpenGL。窗口到视口转换
我是OpenGL新手。因此,我需要在下面描述的问题上得到一些帮助。我不知道如何生成屏幕坐标的视口坐标,以及如何用C++生成它,因为我以前使用java。 在这个问题中,我需要实现函数worldToViewportTransform 该函数实现二维正交投影矩阵,用于(世界)窗口到视口的变换。在OpenGL中,该矩阵由GLU2D定义 输入是世界窗口的坐标(winLeft、winRight、winBottom、winTop)、屏幕上视口(窗口)的左上角(windowX、windowY)以及屏幕上视口(窗口)的大小(windowWidth、windowHeight) 输出是构成世界到视口转换的值A、B、C和D 答案需要使用下面的函数格式-复制它并填写缺少的代码。函数使用指针变量来表示值A、B、C和D,因为CODRunNER似乎不接受C++符号——下面的代码段将指针变量转换为双值和返回值,因此不需要理解指针如何工作。C++ OpenGL。窗口到视口转换,c++,opengl,glu,C++,Opengl,Glu,我是OpenGL新手。因此,我需要在下面描述的问题上得到一些帮助。我不知道如何生成屏幕坐标的视口坐标,以及如何用C++生成它,因为我以前使用java。 在这个问题中,我需要实现函数worldToViewportTransform 该函数实现二维正交投影矩阵,用于(世界)窗口到视口的变换。在OpenGL中,该矩阵由GLU2D定义 输入是世界窗口的坐标(winLeft、winRight、winBottom、winTop)、屏幕上视口(窗口)的左上角(windowX、windowY)以及屏幕上视口(窗
void worldToViewportTransform (double winLeft, double winRight, double winBottom, double winTop,
int windowX, int windowY, int windowWidth, int windowHeight,
double* APtr, double* BPtr, double* CPtr, double* DPtr)
{
double A=*APtr, B=*BPtr, C=*CPtr, D=*DPtr;
<INSERT YOUR CODE HERE>
*APtr=A; *BPtr=B; *CPtr=C; *DPtr=D;
}
该函数实现二维正交投影矩阵,用于(世界)窗口到视口的变换。在OpenGL中,该矩阵由GLU2D定义
不gluOrtho2D
/glOrtho
没有这样做。这些函数设置正交投影矩阵,其目的是将视图空间转换为剪辑空间
然后在幕后进行隐式剪辑空间到NDC空间的变换
最后,将NDC空间坐标转换为视口范围内的窗口坐标
输入是世界窗口的坐标(winLeft、winRight、winBottom、winTop)、屏幕上视口(窗口)的左上角(windowX、windowY)以及屏幕上视口(窗口)的大小(windowWidth、windowHeight)
你的命名法似乎有点不正确
通常的约定是视口定义窗口内的目标矩形,以窗口相对坐标指定。在OpenGL中,窗口坐标(0,0)是窗口的左下角
窗口坐标通常相对于其父窗口;因此,对于相对于屏幕坐标的顶级窗口。在通常的屏幕坐标系中(0,0)位于左上角
输出是构成世界到视口转换的值A、B、C和D
现在还不清楚您到底想要什么,但我最有根据的猜测是,您想要重新创建OpenGL转换链。当然,如果您使用着色器,那么一切都可以在其中完成。但在实践中,你可能只想跟着链条走
r_clip = P · M · r_in
r_NDC = r_clip/r_clip.w
r_viewport = (r_NDC.xy + 1)*viewport.width_height/2 + viewport.xy
其中p
是投影矩阵,例如由glOrtho
生成的矩阵
r_clip = P · M · r_in
r_NDC = r_clip/r_clip.w
r_viewport = (r_NDC.xy + 1)*viewport.width_height/2 + viewport.xy