2016-04-10 4 views
0

Я новичок в OpenGL. Поэтому я нуждаюсь в некоторой помощи в этом вопросе, описанном ниже. Я не уверен, как создавать координаты видового экрана по отношению к экранным координатам, а также создавать его на C++, поскольку я имел дело с Java.OpenGL. Преобразование Window-To-Viewport

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

Функция реализует двумерную матрицу ортографического проектирования, которая используется для преобразования (в мир) окна-в-вид. В 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

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

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

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

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

Входные координаты мирового окна (winLeft, winRight, winBottom, Wintop), верхний левый угол окна просмотра (окно) на экране (windowX, windowY), и размер viewport (окно) на экране (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.

 Смежные вопросы

  • Нет связанных вопросов^_^