Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL。窗口到视口转换_C++_Opengl_Glu - Fatal编程技术网

C++ OpenGL。窗口到视口转换

C++ OpenGL。窗口到视口转换,c++,opengl,glu,C++,Opengl,Glu,我是OpenGL新手。因此,我需要在下面描述的问题上得到一些帮助。我不知道如何生成屏幕坐标的视口坐标,以及如何用C++生成它,因为我以前使用java。 在这个问题中,我需要实现函数worldToViewportTransform 该函数实现二维正交投影矩阵,用于(世界)窗口到视口的变换。在OpenGL中,该矩阵由GLU2D定义 输入是世界窗口的坐标(winLeft、winRight、winBottom、winTop)、屏幕上视口(窗口)的左上角(windowX、windowY)以及屏幕上视口(窗

我是OpenGL新手。因此,我需要在下面描述的问题上得到一些帮助。我不知道如何生成屏幕坐标的视口坐标,以及如何用C++生成它,因为我以前使用java。 在这个问题中,我需要实现函数worldToViewportTransform

该函数实现二维正交投影矩阵,用于(世界)窗口到视口的变换。在OpenGL中,该矩阵由GLU2D定义

输入是世界窗口的坐标(winLeft、winRight、winBottom、winTop)、屏幕上视口(窗口)的左上角(windowX、windowY)以及屏幕上视口(窗口)的大小(windowWidth、windowHeight)

输出是构成世界到视口转换的值A、B、C和D

答案需要使用下面的函数格式-复制它并填写缺少的代码。函数使用指针变量来表示值A、B、C和D,因为CODRunNER似乎不接受C++符号——下面的代码段将指针变量转换为双值和返回值,因此不需要理解指针如何工作。
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