我是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);
答案 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
生成的矩阵。