OpenGL的。窗口到视口转换

时间:2016-04-10 04:47:47

标签: c++ opengl glu

我是OpenGL的新手。因此,我需要在下述问题上提供一些帮助。我不知道如何生成关于屏幕坐标的视口坐标以及用c ++生成它,因为我曾经处理过Java。

在这个问题中,我需要实现worldToViewportTransform函数。

该函数实现了2D正交投影矩阵,用于(世界)窗口到视口转换。在OpenGL中,这个矩阵由gluOrtho2D定义。

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

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

答案需要使用下面的函数格式 - 复制它并填写缺少的代码。该函数使用指针变量作为值A,B,C和D,因为Coderunner似乎不接受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; 

}

特定测试用例应产生输出:(u,v)=( - 200,367)

//Code for Testing
double A, B, C, D;
double winLeft=1.5, winRight=4.5, winBottom=0.0, winTop=3.0;
int windowX=100, windowY=100, windowWidth=600, windowHeight=400;

worldToViewportTransform(winLeft, winRight, winBottom, winTop,
                         windowX, windowY, windowWidth, windowHeight,
 &A, &B, &C, &D);

// Test cases

double x, y; // world coordinates

int u, v; // window coordinates

x=0.0f; y=1.0f;

u=(int) floor(A*x+C+0.5f);

v=(int) floor(B*y+D+0.5f);

printf("(u,v)=(%d,%d)",u,v);

1 个答案:

答案 0 :(得分:0)

  

该函数实现了2D正交投影矩阵,用于(世界)窗口到视口转换。在OpenGL中,这个矩阵由gluOrtho2D定义。

没有! 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生成的矩阵。