OpenGL. Преобразование окна в видовой экран

Я новичок в OpenGL. Поэтому мне нужна помощь в вопросе, описанном ниже. Я не уверен, как создать координаты области просмотра относительно координат экрана, а также создать их на С++, так как я имел дело с Java.

В этом вопросе мне нужно реализовать функцию worldToViewportTransform.

Функция реализует матрицу двумерной ортогональной проекции, которая используется для преобразования (мирового) окна в окно просмотра. В OpenGL эта матрица определяется gluOrtho2D.

Входными данными являются координаты мирового окна (winLeft, winRight, winBottom, winTop), левого верхнего угла области просмотра (окна) на экране (windowX, windowY) и размер области просмотра (окна) на экране. экран (ширина окна, высота окна).

Выходные данные — это значения 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);

person Akhat    schedule 10.04.2016    source источник


Ответы (1)


Функция реализует матрицу двумерной ортогональной проекции, которая используется для преобразования (мирового) окна в окно просмотра. В OpenGL эта матрица определяется gluOrtho2D.

Нет! gluOrtho2D/glOrtho этого не делает. Эти функции устанавливают матрицу ортогональной проекции, целью которой является преобразование из пространства просмотра в пространство отсечения.

Затем за кулисами происходит неявное преобразование клип-пространства в NDC-пространство.

Наконец, координаты NDC-пространства преобразуются в координаты окна в диапазоне области просмотра.

Входными данными являются координаты мирового окна (winLeft, winRight, winBottom, winTop), левого верхнего угла области просмотра (окна) на экране (windowX, windowY) и размер области просмотра (окна) на экране. экран (ширина окна, высота окна).

Ваша номенклатура кажется немного неправильной.

Обычное соглашение заключается в том, что область просмотра определяет целевой прямоугольник внутри окна, указанный в координатах относительно окна. В 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.

person datenwolf    schedule 10.04.2016