2016-04-10 19 views
0

OpenGLを初めて使用しました。したがって、私は以下の事項について何らかの助けを必要とします。私はJavaを扱うために使用していたので、画面座標に対してビューポートの座標を生成する方法と、C++で生成する方法についてはわかりません。OpenGL。 Window-To-Viewport変換

この質問では、関数worldToViewportTransformを実装する必要があります。

この関数は、(ワールド)ウィンドウツービューポート変換に使用される2D正投影投影行列を実装します。 OpenGLでは、この行列はgluOrtho2Dによって定義されます。

入力は、ワールドウィンドウ(winLeft、winRight、winBottom、winTop)、画面上のビューポート(ウィンドウ)の上端(windowX、windowY)、およびビューポートのサイズウィンドウ)(windowWidth、windowHeight)。

出力は、ワールド・ツー・ビューポート変換を構成する値A、B、CおよびDです。

答えには、以下の関数形式を使用する必要があります。コピーして不足しているコードを記入してください。関数は、CoderunnerがC++表記法を受け入れていないようであるため、値A、B、C、Dにポインタ変数を使用します。以下のコードセグメントはポインタ変数をdouble値に変換して返します。 。

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)=( - 200367)

//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空間の座標は、ビューポート範囲のウィンドウ座標に変換されます。

入力画面(windowX、windowY)、およびサイズのビューポート(ウィンドウ)の左上隅、世界的に窓(winLeft、winRight、winBottom、winTop)の座標であります画面上のビューポート(ウィンドウ)(windowWidth、windowHeight)

あなたの命名法はちょっと見えません。

一般的な規則は、ビューポートがウィンドウの相対座標で指定された内のウィンドウ内にターゲットの矩形を定義することです。 OpenGLでは、ウィンドウ座標(0,0)はの左下の角です。

通常、ウィンドウの座標は親ウィンドウとの相対値です。したがって、画面座標に対して最上位ウィンドウのために。通常のスクリーン座標系(0,0)では、は左上です。

出力は、ワールド・ツー・ビューポート変換を構成する値A、B、CおよびDです。

あなたが実際に何を望んでいるのかは不明ですが、私の最高の教育を受けた推測は、OpenGL変換チェーンを再作成したいということです。もちろん、シェーダを使用している場合は、すべてがそこで実行できます。しかし、実際には、あなたはおそらくチェーン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 

に従うことをお勧めします。